A. 自學cocos2d js游戲開發應該按什麼步驟進行
跟你簡要說一下我的自學路,以免你走彎路
背景:
有工作,而且很忙;在不影響工作基礎上用業余時間鼓搗(經常會因為工作耽擱學習進度);基本沒技術背景(初中qbasic、高中pascal半吊子),大學文科,工作也不是搞代碼。因此我感覺我的自學路跟你還是挺契合的。
1
兩年前的一天,決定要做獨立游戲製作人。選定引擎cocos2d,開始學習objective-c語言;(如果你打算只在iOS平台開發可以學obj-c配合cocos2d或者sprite kit;如果打算跨平台就要用cocos2d-x和c++了;當然unity什麼的也不錯但是我還沒嘗試過,一直很嚮往)
2
我跳過了iOS程序開發(似懂非懂看完了斯坦福那一系列的教學視頻),結合當時情況直接選擇了cocos2d引擎,這時開始接觸 @吳一刀 推薦的博客;我主要看的是子龍山人<子龍山人 - 博客園>、Ray Wenderlich<Ray Wenderlich>、Himi<黑米GameDev街區>這些博客里最基本的例子,知易那個以我當時的水平還看不懂。
3
嘗試開始設計自己的簡單游戲,我做打地鼠!當然比教學例子里的打地鼠復雜多了
4
這個過程中發現自己懂的實在是不夠,所以又開啃這本書:Learn cocos2d 2 by Steffen Itterheim & Andreas Low
5
慢慢的發現需要一些趁手的工具和編輯器,並發展出一套自己構建於cocos2d之上的游戲設計架構。我目前的情況是這樣:
關卡編輯我使用plist文件配合自己寫的類;
sprite sheet使用TexturePacker<TexturePacker>;
動畫/UI編輯最初自己手寫太累,後來選擇了cocosbuilder,請注意現在這個軟體已經停止維護,轉而引導用戶使用SpriteBuilder<SpriteBuilder>(域名都做了自動跳轉;SpriteBuilder我木有研究過,建議你研究一下)。
粒子編輯我自己還沒實際用到,如果真正需要我感覺cocosbuilder的夠我用的。//更新:後來用到了ParticleDesigner和cocosbuilder兩個軟體的粒子編輯混搭
我當時遇到的一個大麻煩是如何讓cocosbuilder、cocos2d版本互相兼容且cocosbuilder無問題。大概情況是這樣:cocosbuilder2.1和cocos2d-iphone2.0及2.1版本都不協調怎麼辦?;What version of Cocosbuilder and Cocos2d-iphone should I choose?
目前我使用的cocosbuilder 2.1版本(漸變層有bug、並且很可惜動畫播放完沒有觸發消息的機制,我只好把每個動畫時長都手動記錄一下自己處理)
======3月12日更新======
在 @GarfieldKwong 指點下發現這個版本動畫播放完是可以觸發消息機制的,更高級版本3.x支持的效果應該是在動畫中就加入callback的關鍵幀
新技能get√
具體代碼可見下面學習案例的第一個例子里Explosion部分
=====================
cocosbuider的學習可以看兩個例子Creating a Game with CocosBuilder;Introction to CocosBuilder;然後就是多用多嘗試。
6
整個學習過程要學會查資料、學會尋求幫助,我主要用的stackoverflow(話說剛剛發現stackoverflow的reputation喜過15,終於可以投票了:)
在學習過程中得到了子龍山人(我認為本尊是這位 @屈光輝 )、LearnCocos2d作者Steffen、 @kubisoft 以及眾多網上朋友的幫助,再次表示感謝。
7
硬體及開發者資格:看完c++開始看obj-c,這個過程一直是使用的vmware虛擬機安裝的mac系統寫程序;然後入手一個最便宜的mac pro、以及iPhone,嘗試玩各種游戲;從看c++開始大約過了1年半(已經有非常簡陋的游戲demo)才真正購入iOS開發者資格並開始真機測試。
8
嘗試過的一些其他工具、各種彎路和坑、以及發散內容:
可以拖拽方式寫代碼的stencyl <Stencyl: Make iPhone, iPad, Android & Flash Games without code>;
最初學的不是ojc-c而是譚浩強老師的c++程序設計(雖然有人不喜譚老師,但那書是中文的讓我對面對對象程序設計有一些初步的概念,再看英文的obj-c不至於太摸不著頭腦,反正手頭正好有這么一本買了6年沒看的c++。。。);
嘗試過<Tiled Map Editor>但自己目前的坑沒有用到;
嘗試過一點物理引擎和粒子,但自己目前的坑沒有用到;現在粒子用到了,做了火焰等效果,也挺美的;但是一定要注意CPU佔用優化,內存方面我最低支持4S沒遇到大問題
學習音樂製作,這個我小時候學琴一直也喜歡音樂所以有一點點底子,如果沒有基礎可能上手有門檻;開始用的軟體LMMS,但是音源插件在64位系統的問題我一直沒解決掉時間精力也不多,所以是暫時停滯了;最近發現Garage Band可能也可以寫歌;另外還試過一個很有歷史的微軟的音樂自動編輯器,很好玩,用來做背景音樂也不錯。
入手手繪板學畫畫(這中間糾結了好久才決定用點陣圖不用矢量圖),如果你能找到熱愛游戲的美術同學一起搞那最好不過。但是我一直對畫畫心癢難搔。。。所以入了這個深坑,曬一曬:
轉載
z
B. cocos2d-x中可以預載入cocostudio導出的json文件么
貌似對於JSON的非同步載入目前還沒有辦法吧,不然就不會那麼多人堆JSON的載入速度吐槽了
C. Android游戲開發之Cocos2d-x
游戲的製作如播放電影,擁有四大核心,包括: 導演、場景、圖層、演員 。通過它們之間的不同配合,實現豐富多彩的效果。
public class CocosActivity extends AppCompatActivity {
private CCDirector mCcDirector;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
CCGLSurfaceView ccglSurfaceView =new CCGLSurfaceView(this);
setContentView(ccglSurfaceView);
導演,全局只有一個,單例模式創建
mCcDirector = CCDirector.sharedDirector();
開啟繪制(開始拍電影)
mCcDirector.attachInView(ccglSurfaceView);
幀率,每秒刷新的次數,與手機性能有關
//ccDirector.setDisplayFPS(true);
設置幀率為60(記得把幀率文件放進項目中)
//ccDirector.setAnimationInterval(1/60f);
設置橫屏
//ccDirector.setDeviceOrientation(CCDirector.);
屏幕適配,會基於不同屏幕大小進行適配
mCcDirector.setScreenSize(1920,1080);
場景
CCScene ccScene = CCScene.node();
圖層
CCLayer ccLayer =CCLayer.node();
給場景添加圖層
ccScene.addChild(ccLayer);
導演運行場景
mCcDirector.runWithScene(ccScene);
}
@Override
protected void onResume() {
super.onResume();
mCcDirector.onResume();
}
@Override
protected void onPause() {
super.onPause();
mCcDirector.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mCcDirector.end();
}
1、平移
參數1是移動時間,參數2是目標位置坐標,ccp方法是把坐標轉換為cocos2d的坐標
CCMoveTo ccMoveTo = CCMoveTo.action(3,ccp(200,0));
與上不同的是,第2個參數代表水平移動200,豎直不移動,即偏移量
CCMoveBy ccMoveBy =CCMoveBy.action(3,ccp(200,0));
2、旋轉
參數1時間,參數2角度,旋轉中心是左下角的點,順時針轉
CCRotateBy ccRotateBy =CCRotateBy.action(3,360);
與上不同的是,逆時針轉(捷徑,順時針轉270==逆時針轉90)
CCRotateTo ccRotateTo =CCRotateTo.action(3,270);
3、縮放
參數1時間,參數2X方向縮放,參數3Y方向縮放
CCScaleBy ccScaleBy =CCScaleBy.action(3,2,2);
參數1時間,參數2縮放
CCScaleTo ccScaleTo =CCScaleTo.action(3,2);
4、跳躍(參數1時間,參數2目標點,參數3跳躍高度,參數4跳躍次數)
CCJumpBy ccJumpBy =CCJumpBy.action(3,ccp(0,0),100,3);
5、淡入淡出(參數是時間)
CCFadeIn ccFadeIn =CCFadeIn.action(2);
CCFadeOut ccFadeOut =CCFadeOut.action(2);
6、貝塞爾曲線
點的含義,從point1出發,經過point2,到達endPosition
CCBezierConfig ccBezierConfig =new CCBezierConfig();
ccBezierConfig. controlPoint_1 =ccp(100,50);
ccBezierConfig. controlPoint_2 =ccp(200,200);
ccBezierConfig. endPosition =ccp(300,100);
CCBezierBy ccBezierBy =CCBezierBy.action(2,ccBezierConfig);
7、加速度
CCMoveBy ccMoveBy =CCMoveBy.action(2,ccp(100,100));
漸快漸慢,參數2是加速度
CCEaseIn ccEaseIn =CCEaseIn.action( ccMoveBy ,5);
CCEaseOut ccEaseOut =CCEaseOut.action( ccMoveBy ,5);
8、閃爍(時間,閃爍次數)
CCBlink ccBlink =CCBlink.action(2,10);
9、文字(參1是顯示的文字,參2是字體格式(可不填,如""),參數3是字體大小)
CCLabel ccLabel = CCLabel.labelWithString("顯示文字","STCAIYUN.TTF",20);
設置文字顏色
ccColor3B ccColor3B =ccc3(100,50,0);
ccLabel.setColor(ccColor3B );
設置文字位置
ccLabel.setPosition(ccp(width,height));
重置文字
ccLabel.setString("顯示文字");
顏色漸變(從本來的文字顏色漸變到設置的字體顏色)
CCTintBy tintBy =CCTintBy.action(3,ccc3(50,-50,100));
10、循環(參數是動畫效果)
CCRepeatForever ccRepeatForever =CCRepeatForever.action(action);
11、延遲(參數是時間)
CCDelayTime ccDelayTime =CCDelayTime.action(1);
12、反轉(將一個動畫倒序執行)
ccJumpBy.reverse();
13、同時(參數是不定長度數組)
CCSpawn ccSpawn =CCSpawn.actions(action1,action2);
14、連續動畫(參數是不定長度數組)
CCSequence ccSequence =CCSequence.actions(action1,action2, ccCallFunc ");
15、反射(執行一個動畫方法)
CCCallFunc .action(this," anim ");
被反射的執行方法
public void anim (){}
16、逐幀動畫
public void walk(){
存放幀動畫的集合
ArrayList ccSpriteFrames =new ArrayList<>();
String format="z_1_%d.png"; // %d和%02d代表整數,用i來取代,%d只取代i,%02d會補0
for(int i=1;i<10;i++){
CCSprite ccSprite =CCSprite.sprite(String.format(format,i));
CCSpriteFrame ccSpriteFrame =ccSprite.displayedFrame();
ccSpriteFrames.add(ccSpriteFrame );
}
參數1是動畫名稱,參數2是每一幀停留的時間,參數3是幀動畫集合
CCAnimation ccAnimation =CCAnimation.animation("walk",.2f,ccSpriteFrames);
參數2是否持續執行動畫,如果想執行無限循環,可以使用CCRepeatForever
CCAnimate ccAnimate =CCAnimate.action(ccAnimation,false);
mCcSprite.runAction(ccAnimate);
}
17、隱藏
CCHide ccHide =CCHide.action();
18、顯示
CCShow ccShow =CCShow.action();
19、跟隨(參數是跟隨的對象)
CCFollow ccFollow =CCFollow.action(mCCSprite);
20、執行動畫(上述皆是)
mCcSprite.runAction(action);
21、工具類使用
CGPointUtil .distance(point1,point2); //計算兩點距離
獲取聲音引擎
SoundEngine engine =SoundEngine.sharedEngine();
參數1是activity,SurfaceView創建時存入,參2是播放資源id(res\raw),參數3是否循環播放
engine.playSound(CCDirector.theApp,1,true);
手動停止音樂播放
engine.realesAllSounds();
生命周期跟隨Activity
SoundEngine.sharedEngine().resumeSound();
SoundEngine.sharedEngine().pauseSound();
SoundEngine.sharedEngine().realesAllSounds();
預載入播放音樂,避免播放音樂時沒聲音
SoundEngine.sharedEngine().preloadEffect();
SoundEngine.sharedEngine().preloadSound();
1、創建
CCSprite mCcSprite =new CCSprite(" pic.jpeg ");
2、錨點(圖片上的一點,類似圖釘,對應圖片顯示的位置)
CGPoint cgPoint =ccp(0,0);
mCcSprite.setAnchorPoint(cgPoint);
3、位置
mCcSprite.setPosition(cgPoint);
4、屬性(縮放、翻轉、透明度)
ccSprite.setFlipX(true); 水平翻轉
ccSprite.setOpacity(255); 透明度
ccSprite.setScale(2); 縮放
5、移除(在Layer裡面操作)
mCcSprite.removeSelf(); //精靈從圖層中移除
( Layer )this.removeSelf(); // 移除整個圖層
6、尺寸
CGSize cgSize =CCDirector.sharedDirector().winSize();
1、游戲暫停(圖層靜止,將不再響應任何事件)
MapLayer.this.onExit();
注意:因為圖層不再響應任何事件,所以暫停按鈕應該加在暫停圖層的父圖層上
this.getParent().addChild(new PauseLayer());
2、游戲繼續(圖層恢復動態,接收點擊事件)
MapLayer.this.onEnter();
通用的游戲繼續方法
CCDirector.sharedDirector().getRunningScene().onEnter();
3、定時器
CCScheler ccScheler =CCScheler.sharedScheler();
通過反射執行方法
ccScheler.schele(" onScheler ",this,2,false);
方法聲明為公開類型
public void onScheler (float f){ //實現具體邏輯
};
4、進度條
CCProgressTimer ccProgressTimer =CCProgressTimer.progressWithFile(" image/pic.jpeg "); //多層目錄
ccProgressTimer.setPosition(width,height);
this.getParent().addChild(ccProgressTimer); //具體加到什麼圖層,看情況
ccProgressTimer.setScale(0.6f);
ccProgressTimer.setPercentage(2);
設置顯示樣式(垂直,水平)->(最後2個字母,left,right,代表進度條從左往右)
ccProgressTimer.setType(CCProgressTimer. LR );
進度條外框 等元素,都作為精靈與進度條同級加入圖層
this.getParent().addChild(sprite);
Android坐標系的(0,0)在左上角,而Cocos2d-x坐標系的(0,0)在左下角。所以在處理Android的點擊事件MotionEvent時,需要進行坐標體系的轉換。
CGPoint cgPoint = convertPrevTouchToNodeSpace (event);
監聽圖片的點擊范圍,自定義封裝點擊事件
CGRect .containsPoint( mCcSprite.getBoundingBox() , cgPoint );
CCMenu ccMenu =CCMenu.menu();
CCSprite normalSprite =CCSprite.sprite("pic_1.jpeg"); //正常情況下顯示的圖片
CCSprite selectSprite =CCSprite.sprite("pic_2.jpeg"); //按下時顯示的圖片
注意:反射的方法需要使用pulbic修飾,參數指target,直接傳this,它不是上下文Context
CCMenuItemSprite itemSprite =CCMenuItemSprite.item( normalSprite , selectSprite , this ," onCLick ");
ccMenu.addChild( itemSprite );
this.addChild(ccMenu); //菜單添加到圖層
public void onCLick (Object obj){} //點擊事件響應方法,必須用public修飾以及帶參數
setIsTouchEnabled(true); //打開圖層點擊事件,默認關閉
模仿任何天氣現象,只需要改這一句,剩下的不變
CCParticleSystem ccParticleSystem= CCParticleSnow.node();
設置雪花大小
ccParticleSystem.setScale(2);
設置飄落的速度
ccParticleSystem.setSpeed(10);
設置雪花的圖片
ccParticleSystem.setTexture(CCTextureCache.sharedTextureCache().addImage("snow.png"));
this.addChild(ccParticleSystem,1);
停止粒子系統(下雪)
ccParticleSystem.stopSystem();
1、載入地圖
ArrayList mCGPoints = new ArrayList<>();
CCTMXTiledMap mCctmxTiledMap = CCTMXTiledMap.tiledMap(" map.tmx ");
mCctmxTiledMap.setAnchorPoint(ccp(0.5f,0.f));
mCctmxTiledMap.setPosition(width,height);
CCTMXObjectGroup cctmxObjectGroup= mCctmxTiledMap.objectGroupNamed("road");
ArrayList<HashMap<String,String>> objects = cctmxObjectGroup.objects;
for(HashMap<String,String> hashMap:objects){ //載入地圖的坐標(需要經過的坐標點)
Integer x =Integer.parseInt(hashMap.get("x"));
Integer y =Integer.parseInt(hashMap.get("y"));
CGPoint cgPoint =ccp(x,y);
mCGPoints .add(cgPoint); }
this.addChild(mCctmxTiledMap);
在地圖上添加精靈
mCCSprite.setPosition(mCGPoints.get(0));
mCctmxTiledMap.addChild(mCCSprite);
地圖跟隨精靈的移動而移動
CCFollow ccFollow =CCFollow.action(mCCSprite);
mCctmxTiledMap .runAction(ccFollow);
2、地圖隨手指觸摸事件移動(重寫觸摸方法)
@Override
public boolean ccTouchesMoved(MotionEvent event) {
手指拖拽時,地圖隨手指移動
mCctmxTiledMap.touchMove(event,mCctmxTiledMap);
地圖移動,地圖上所有精靈都隨之移動(地圖是父親,精靈是孩子)
mCctmxTiledMap.addChild(mCCSprite);
return super.ccTouchesMoved(event);
}
創建場景
CCScene ccScene =CCScene.node();
場景添加圖層
ccScene.addChild(ccLayer);
場景切換特效
CCJumpZoomTransition ccJumpZoomTransition =CCJumpZoomTransition.transition(2,ccScene);
導演切換場景
CCDirector.sharedDirector(). replaceScene (ccJumpZoomTransition);
CopyOnWrite容器即寫時復制的容器。通俗的理解是當我們往一個容器添加元素的時候,不直接往當前容器添加,而是先將當前容器進行Copy,復制出一個新的容器,然後新的容器里添加元素,添加完元素之後,再將原容器的引用指向新的容器。這樣做的好處是我們可以對CopyOnWrite容器進行並發的讀,而不需要加鎖,因為當前容器不會添加任何元素。所以CopyOnWrite容器也是一種讀寫分離的思想,讀和寫不同的容器。用法和ArrayList相近。
CopyOnWriteArrayList OnWriteArrayList = new CopyOnWriteArrayList();
setIsTouchEnabled(true); //打開點擊事件
@Override
public boolean ccTouchesBegan (MotionEvent event) {
return super.ccTouchesBegan(event);
}
@Override
public boolean ccTouchesCancelled (MotionEvent event) {
return super.ccTouchesCancelled(event);
}
@Override
public boolean ccTouchesMoved (MotionEvent event) {
return super.ccTouchesMoved(event);
}
@Override
public boolean ccTouchesEnded (MotionEvent event) {
return super.ccTouchesEnded(event);
}
描述:UI頻繁刷新,造成主線程的堵塞或掛起
private CCGLSurfaceView mCCGLSurfaceView;
mCCGLSurfaceView = (CCGLSurfaceView) CCDirector.sharedDirector().getOpenGLView();
mCCGLSurfaceView.queueEvent(new Runnable() {
@Override
public void run() { //切換到主線程
}
});
描述:CCSprite運行動畫時,沒有表現出任何視覺效果。
原因:一個動畫只能被一個CCSprite執行一次,執行完成後,原來的動畫會失效。
解決:每次執行的動畫,都需要重新生成,即使是相同的動畫效果。
緩存:CCDirector.sharedDirector().purgeCachedData();
D. 如何用Cocos2d-JS製作一個微信報名宣傳頁
您好,很高興為您解答,
關鍵點解析如下:
1.設置瀏覽器meta來適配屏幕,引擎內部會根據屏幕大小來設置meta的viewport值,會達到更好的屏幕適配效果。
2.針對手機瀏覽器和PC瀏覽器啟用不同的解析度適配策略。
3.預載入圖片聲音等資源。 cc.LoaderScene.preload會生成一個「載入中 x%」的界面,等待資源載入結束後,調用孝冊第二個參數純慎知傳入的匿名函數。 對於基於html的游戲,頁面是放在伺服器端供瀏覽器做消下載的,為了獲得流暢的用戶體驗,cc.LoaderScene.preload讓瀏覽器先把遠程伺服器的資源緩存到本地。需要預載入的資源定義在src/Resources.js文件中。
4.啟動游戲的第一個場景。
希望對你有用,望採納!您的採納是我答題的動力!,謝謝
E. 如何用Cocos2d-JS製作一個微信報名宣傳頁
開發環境與新建項目
如果沒用過Cocos2d-JS的朋友們,可以到cocos官網上去下載,此處我們用的是3.0final,或者,我們可以下載Lite版本的Cocos2d-JS,lite版本可以很方便的根據需求去下載所需要的模塊,可以很大的減少代碼的體積,可在此下載,我們需要用到的模塊有core?actions?menuprogress-timer,在該頁面中選擇Customized Version然後勾選上述幾個模塊,並點擊下載。
此處我們使用cocos 命令行來創建新的工程
$cd cocos2d-js/tools/cocos2d-console/bin $./cocos new weChat -l js --no-native $cd weChat/ $../cocos run -p web
環境搭建並不是這篇文章的重點,更詳細的信息可以參考:《搭建 Cocos2d-JS 開發環境》。
主界面及其頁面切換框架的實現
程序的入口代碼在main.js中,用編輯器打開並修改為下面的代碼。
cc.game.onStart = function () { cc.view.adjustViewPort(true); cc.view.enableAutoFullScreen(false); var mode = cc.sys.isMobile && window.navigator.userAgent.indexOf("MicroMessenger") != -1 ? cc.ResolutionPolicy.FIXED_HEIGHT : cc.sys.isMobile ? cc.ResolutionPolicy.FIXED_WIDTH : cc.ResolutionPolicy.SHOW_ALL; cc.view.setDesignResolutionSize(640, 831, mode); //load resources cc.LoaderScene.preload(g_resources, function () { cc.director.runScene(new MainScene()); }, this);};cc.game.run();
關鍵點解析如下:
1.設置瀏覽器meta來適配屏幕,引擎內部會根據屏幕大小來設置meta的viewport值,會達到更好的屏幕適配效果。
2.針對手機瀏覽器和PC瀏覽器啟用不同的解析度適配策略。
3.預載入圖片聲音等資源。 cc.LoaderScene.preload會生成一個「載入中 x%」的界面,等待資源載入結束後,調用第二個參數傳入的匿名函數。 對於基於html的游戲,頁面是放在伺服器端供瀏覽器下載的,為了獲得流暢的用戶體驗,cc.LoaderScene.preload讓瀏覽器先把遠程伺服器的資源緩存到本地。需要預載入的資源定義在src/Resources.js文件中。
4.啟動游戲的第一個場景。
主界面分為2個部分,第一個部分是不隨著屏幕移動而移動的向上箭頭和音樂按鈕,第二個部分是根據用戶滑動屏幕而改變的場景。
我們先根據需要,構建出需要的函數,並一一實現他,這里我們使用cc.Scene.extend()來擴展出一個scene,並在這個scene中構建出我們需要功能,並一一實現他。
由引擎提供的cc.Scene.extend方法,讓js能實現高級面向對象語言的繼承特性。 onEnter方法是場景初始化完成即將展示的消息回調,在onEnter中必須調用this._super();來確保Scene被正確的初始化。
用於初始化UI的函數 initUI()
用於初始化touch事件的函數 initTouch()。
用於切換頁面的函數changePage()和記錄當前頁面的參數currentIndex
用於控制箭頭顯示隱藏的函數toggleArrow()
用於控制音樂按鈕回調的函數
var MainScene = cc.Scene.extend({ listener: null, accelListener: null, currentIndex: 0, sceneList: [], ctor: function () { this._super(); cc.spriteFrameCache.addSpriteFrames(res.firstPage_plist); }, onEnter: function () { this._super(); this.initUI(); this.addTouch(); }, initUI: function () { }, toggleMusicCallback: function (sender) { }, togleArrow: function (status) { }, addTouch: function () { }, changePage: function (index, next) { } });
接下來我們一一來實現。
首先,我們來實現音樂按鈕與箭頭,我們在initUI()中添加如下代碼。
var bg = new cc.Sprite(res.background_png); bg.anchorX = 0; bg.anchorY = 0; bg.scaleX = cc.winSize.width / bg.width; bg.scaleY = cc.winSize.height / bg.height; this.addChild(bg, 0); this.arrow = new cc.Sprite("#arrow.png"); this.arrow.setPosition(cc.pAdd(cc.visibleRect.bottom, cc.p(0, 50))); var posY = this.arrow.y; var arrowAction = cc.repeatForever(cc.sequence(cc.spawn(cc.moveTo(0.8, cc.p(this.arrow.x, posY + 30)).easing(cc.easeIn(0.5)), cc.fadeOut(1)), cc.delayTime(0.8), cc.callFunc(function () { this.arrow.y = this.arrow.y - 30; this.arrow.opacity = 255; }, this))); this.arrow.runAction(arrowAction); this.addChild(this.arrow, 1); this.menuItemToggle = new cc.MenuItemToggle(new cc.MenuItemImage("#music.png"), new cc.MenuItemImage("#music_sel.png"), this.toggleMusicCallback, this); this.menuItemToggle.setPosition(cc.pAdd(cc.visibleRect.right, cc.p(-this.menuItemToggle.width / 2 - 30, 140))); var togglemenu = new cc.Menu(this.menuItemToggle); togglemenu.anchorX = 0; togglemenu.anchorY = 0; togglemenu.x = 0; togglemenu.y = 0; this.addChild(togglemenu, 1);
我們在屏幕中,添加了一個背景的sprite,並且,將這個背景進行縮放,以讓其在各種情況下都布滿屏幕,並且我們為箭頭設置了一系列動畫,讓其能夠循環播放,Cocos2d-JS,為了方便廣大開發者,提供了豐富多彩的動畫(actions)。下面,我們先簡單的介紹一下幾個常用的action的API。
cc.repeatForever(action) 無限循環某個action
cc.sequence(action1,action2,...)順序執行括弧裡面的action
cc.spawn(action1,action2,...)同時執行括弧裡面的action
cc.moveTo(ration,targetPoint)從當前位置在ration(秒)時間內移動到點targetPosition的action
cc.easeIn(rate) 以rate為ease參數執行easeIn的action,一般是這樣使用的action.easing(cc.easeIn(rate))
fadeOut(ration) 在ration時間內從屏幕淡出的action
cc.delayTime(ration) 延時ration時間的action,通常用於等待一段時間後再播放某個action
cc.callFunc(function) 用於執行action的回調,通常在某個action結束後需要執行某段函數的話,可以使用它。
通過上述的簡單介紹,是不是對action有了一個初步的了解了呢,我們實際來操作一下:
我們需要一個箭頭,往上走並慢慢減速和透明,最終消失,然後在原來的位置出現重復下去,所以我們可以歸納為,移動+淡出-->回到初始位置-->移動+淡出。這樣我們很清晰就歸納出如何去寫這個action了,我們使用cc.spawn(cc.moveTo(),cc.fadeOut())就構建出了移動+淡出這個效果,然後使用cc.callFunc()設置了這次action播放完畢要修改的位置回到初始位置,接著我們使用cc.sequence()來順序執行這兩個action,這樣一來,一次action就編寫完成了,最後我們只需要將這個action使用cc.repeatForever()就完成了我們需要的重復播放。
細心的讀者可能會問了,代碼中的位置設置,為什麼是cc.pAdd(cc.visibleRect.right,cc.p())?這是cocos為了讓大家更方便的做屏幕適配所定義的9個點,這9個點會根據不同屏幕大小來動態設定,例如cc.visibleRect.center,這個點的位置,無論在什麼解析度的屏幕下,都是在屏幕的正中央,這樣我們就可以根據這個點的位置來做相對布局,已達到適配屏幕的目的,例如上面的代碼this.arrow.setPosition(cc.pAdd(cc.visibleRect.bottom, cc.p(0, 50)));就是將arrow這個sprite,放在屏幕的底部的正中央,然後再在y軸上加50個像素,這樣,無論屏幕的大小,都能保持在屏幕的底部的正中央向上50個像素。這也是我們做相對布局的基礎。後續的布局,我們都會根據這些點的坐標來設置。
F. 圖片懶載入和預載入
懶載入也叫延遲載入,指的是在長網頁中延遲載入圖像,是一種很好優化網頁性能的方式 。用戶滾動到它們之前,可視區域外的圖像不會載入。這與圖像預載入相反,在長網頁上使用延遲載入將使網頁載入更快。在某些情況下,它還可以幫助減少伺服器負載。常適用圖片很多,頁面很長的電商網站場景中。
首先將頁面上的圖片的 src 屬性設為空字元串,而圖片的真實路徑則設置在data-original屬性中, 當頁面滾動的時候需要去監聽scroll事件,在scroll事件的回調中,判斷我們的懶載入的圖片是否進入可視區域,如果圖滲配片在可視區內將圖片的 src 屬性設置為data-original 的值,這樣就可以實現延遲載入。
資源預載入是另一個性能優化技術,我們可以使用該技蘆賀術來預先告知瀏覽器某些資源可能在將來會被使用到。 預載入簡單來說就是將所有所需的資源提前請求載入到本地,這樣後面在需要用到時就直接從緩存取資源 。
在網頁全部載入之前,對一些主要內容進行載入,以提供給用戶更好的體驗,減少等待的時間。否則,如果一個頁面的內容過於龐大,沒有使用預載入技術的頁面就會長時間的展現為一片空白,直到所有內容載入完畢。
<img src="http://pic26.nipic.com/20121213/6168183 0044449030002.jpg" style="display:none"/>
<script src="./myPreload.js"></script>
PreloadJS提叢嘩指供了一種預載入內容的一致方式,以便在HTML應用程序中使用。預載入可以使用HTML標簽以及XHR來完成。默認情況下,PreloadJS會嘗試使用XHR載入內容,因為它提供了對進度和完成事件的更好支持,但是由於跨域問題,使用基於標記的載入可能更好。
兩者都是提高頁面性能有效的辦法, 兩者主要區別是一個是提前載入,一個是遲緩甚至不載入。懶載入對伺服器前端有一定的緩解壓力作用,預載入則會增加伺服器前端壓力
轉: https://juejin.cn/post/6844903614138286094
G. cocos2d-js怎麼使用webgl
您好,使用Cocos2d-js來使用WebGL是一個很有用的技術,它可以幫助您創建出令人驚嘆的2D和3D圖形。Cocos2d-js是一個開源的游戲引擎,它可以讓您創建出令人驚嘆的2D和3D圖胡賀含形,並且可以在多種平台上運行,包括移動設備和桌面計算機。使用Cocos2d-js可以讓您利用WebGL來創建出更加逼真的3D圖形,這些圖形可以用來創建出真實的環境,游戲,動畫,以及其他視覺效果。Cocos2d-js還可以用來創建出更加復雜的游戲,因為它可以支持多種類型的游戲,包括動作游戲,角色扮演游戲,策略游戲,以及虛擬現實游戲。使用Cocos2d-js可以讓您利用WebGL來創建出更加逼真的3D圖形,這些圖形可以用來創建出真實的環境,游戲,動畫,以及其他視覺效果。Cocos2d-js還可以用來創建出更加復雜的游戲,因為它可以支持多種類型的游戲,包括動作游戲,角色扮演游戲,策略游戲,以及虛擬現實游戲。此外,Cocos2d-js還可以支持多種類型的輸入設備,包括鍵盤,滑鼠,游戲手柄,觸摸屏,以及其他輸入設備拍絕。使用Cocos2d-js可以讓您創建出令人驚嘆的2D和3D圖形,並且可以在多種平台上運行,包括移動設備和桌面計算機。總之,使用Cocos2d-js來使用WebGL是一個褲笑很有用的技術,它可以幫助您創建出令人驚嘆的2D和3D圖形,並且可以在多種平台上運行,包括移動設備和桌面計算機。
H. 使用什麼工具或者IDE開發Cocos2d-js游戲
1、如果是純web,那麼還是推薦webstorm,這個工具超級強大。
2、如果是JSB,選擇Cocos code ide,比較強大。
3、目前cocos code ide也不斷的在完善web方面上的叢念運辯鄭擾行和攜旦調試。
I. 教你 Js / import 如何實現 懶載入 和 預載入
在項目中引入 js 文件一般是如下這種模式皮陸:
懶載入:
當御握猜文件被需要時才被載入即 執行fn()時,多次執鎮型行fn()只會載入一次js文件
預載入:
文件會在瀏覽器空閑的時候提前載入,有兼容性問題需慎用
J. cocos2d-js報錯怎麼解決
cocos2d-x游戲開發旦彎之c++,js互相調用錯誤枯掘記沒遲核錄
多類型多參數傳遞時
錯誤:
if (argc > 0) {
jsval obj;
int roleId;
int nInterval;
int nlineId;
jsval jsRet;
JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp), "v", &obj);
JS_ValueToInt32(cx,obj,&roleId);
JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp+1), "v", &obj);
JS_ValueToInt32(cx,obj,&nInterval);
JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp+2), "v", &obj);
JS_ValueToInt32(cx,obj,&nlineId);
int createRoleId = CCGlobalJsp::CreateRole(roleId,nlineId,(float)nInterval);
CCLog("createRoleId = %d",createRoleId);
jsRet = int32_to_jsval(cx,createRoleId);
JS_SET_RVAL(cx,vp,jsRet);
}