【玩转cocos2d-x之三十五】Earth Warrior 3D大揭秘
生活随笔
收集整理的這篇文章主要介紹了
【玩转cocos2d-x之三十五】Earth Warrior 3D大揭秘
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
3D游戲現(xiàn)在玩起來(lái)門檻還是挺高的。不過(guò)如果在Cocos2d-x引擎加入3D擴(kuò)展,實(shí)現(xiàn)2.5D游戲效果又會(huì)怎么樣?
Apk下載: http://pan.baidu.com/s/1ntM75bV
源碼下載: https://github.com/chukong/EarthWarrior3D.git ,給個(gè)star不費(fèi)電。。。
開(kāi)發(fā)環(huán)境:Cocos2d-x v3.0 + Sprite3D擴(kuò)展
auto?model?=?Sprite3D::create("3dmodel.obj",?"texture.png");??
[cpp]?view plaincopy model->setOutline(1.5,?Color3B(0,0,0));?//?設(shè)置發(fā)光寬度1.5,黑色??
node->setPosition3D(Vertex3F(x,y,z));//設(shè)置位置?? Vertex3F?pos?=?node->getPosition3D();?? node->setRotation3D(Vertex3F(x,y,z));//設(shè)置旋轉(zhuǎn)?? Vertex3F?rot?=?node->getRotation3D();??
node->runAction(RotateBy::create(Vertex3F(x,y,z)));??
//Plane.cpp?? _Model?=?Sprite3D::create("playerv002.obj",?"playerv002_256.png");?? if(_Model){?? ????_Model->setScale(55);?? ????((Sprite3D*)_Model)->setOutline(0.035,?Color3B::BLACK);?? ????_Model->setRotation3D(Vertex3F(originX,originY,originZ));?? ????this->setRotation3D(Vertex3F(originX,?originY,?originZ));?? ????this->addChild(_Model);?? ????this->scheduleUpdate();?? }??
[cpp]?view plaincopy void?Plane::update(float?dt)?? {?? ????pRate+=0.01;?? ????_Model->setRotation3D(Vertex3F(0-pXA*sin(pXW*pRate),0,0-pZA*sin(pZW*pRate)));?? }??
?
關(guān)鍵點(diǎn) :①Loading界面實(shí)現(xiàn)資源的預(yù)加載,包括音樂(lè),紋理,粒子效果,其中紋理使用異步加載,粒子效果在ParticleManager(單例類)中加載。
②同時(shí)Loading界面也實(shí)現(xiàn)了游戲元素的預(yù)創(chuàng)建并保存在全局池中,避免游戲過(guò)程中的卡頓現(xiàn)象和反復(fù)create的低效,包括四類敵機(jī)和導(dǎo)彈Missile,在update中實(shí)現(xiàn)每幀創(chuàng)建一個(gè),避免LoadingScene的卡頓。
void?LoadingScene::InitCoco()?? {?? ????Size?visibleSize?=?Director::getInstance()->getVisibleSize();?? ????auto?coco?=?Sprite3D::create("coconut.obj",?"coco.png");?? ????if(coco)?? ????{?? ????????coco->setPosition(Point(visibleSize.width/2,?visibleSize.height/2-150));?? ????????coco->setOutline(10,Color3B(0,0,0));?? ????????addChild(coco,1);?? ????????coco->runAction(RepeatForever::create(RotateBy::create(0.8f,Vertex3F(0,360,0))));?? ????}?? }??
?
關(guān)鍵點(diǎn):①玩家和敵機(jī)的子彈控制統(tǒng)一在BulletController::spawnBullet中處理。如上述游戲元素保存在全局池中,可回收利用,避免反復(fù)創(chuàng)建,spawnBullet會(huì)先從這個(gè)池中取出,如果該池為空才會(huì)創(chuàng)建對(duì)于的子彈。
②敵機(jī)的處理也是采用相同的方式,在EnemyController::spawnEnemy中處理,如果該池為空才會(huì)創(chuàng)建對(duì)于的敵機(jī)。
③GameLayer::gameMaster管理敵機(jī)的出現(xiàn)的頻率。
④GameController::update管理游戲的碰撞檢測(cè)。
1.概述
先上大會(huì)現(xiàn)場(chǎng)演示圖:Apk下載: http://pan.baidu.com/s/1ntM75bV
源碼下載: https://github.com/chukong/EarthWarrior3D.git ,給個(gè)star不費(fèi)電。。。
開(kāi)發(fā)環(huán)境:Cocos2d-x v3.0 + Sprite3D擴(kuò)展
適用平臺(tái):Mac/iOS/Android
2.Sprite3D擴(kuò)展
2.1. Sprite3D
sprite3D擴(kuò)展目前可以支持加載靜態(tài)obj模型。[cpp]?view plaincopy
2.2. Toon Shading
Cocos2d-x精靈不能做發(fā)光效果,而Sprite3D中加入了發(fā)光函數(shù),指定outline width和color就行了。[cpp]?view plaincopy
2.3. 3D API
3D API是Cocos2d-x v3.0就具有的屬性,源碼可以到Node上看。
[cpp]?view plaincopy
其中Vertex3F當(dāng)然就是指定了三維空間。而3D API同樣也移植到了一些動(dòng)作中,比如:
[cpp]?view plaincopy
完全沒(méi)問(wèn)題。
3.EarthWarrior
Classes/3d文件夾包含了Sprite3D。其余文件為游戲邏輯控制,游戲總共三個(gè)場(chǎng)景3.1. 主菜單界面(MainMenuScene)
包含 :主菜單場(chǎng)景(MainMenuScene),飛機(jī)模型(Plane),License和Credits層(LicenseLayer)。關(guān)鍵點(diǎn):①主界面3D飛機(jī)的實(shí)現(xiàn)
[cpp]?view plaincopy
②對(duì)數(shù)學(xué)感興趣的可以研究一下scheduleUpdate怎樣讓飛機(jī)晃啊晃。。。粒子系統(tǒng)這里就不再重復(fù)了。
[cpp]?view plaincopy
3.2. 載入界面(LoadingScene)
包含 :載入場(chǎng)景(LoadingScene),粒子管理器(ParticleManager)?
關(guān)鍵點(diǎn) :①Loading界面實(shí)現(xiàn)資源的預(yù)加載,包括音樂(lè),紋理,粒子效果,其中紋理使用異步加載,粒子效果在ParticleManager(單例類)中加載。
②同時(shí)Loading界面也實(shí)現(xiàn)了游戲元素的預(yù)創(chuàng)建并保存在全局池中,避免游戲過(guò)程中的卡頓現(xiàn)象和反復(fù)create的低效,包括四類敵機(jī)和導(dǎo)彈Missile,在update中實(shí)現(xiàn)每幀創(chuàng)建一個(gè),避免LoadingScene的卡頓。
③cocos Logo的旋轉(zhuǎn)動(dòng)畫
[cpp]?view plaincopy
3.3. 游戲界面(HelloWorldScene)
包含 :游戲?qū)?#xff08;GameLayer),游戲元素基類(GameEntity),飛機(jī)類(AirCraft),玩家類(Player),敵機(jī)類(Enemies,又包括Fodder,FodderLeader,BigDude,Boss四類敵機(jī)),子彈類(Bullet,又包括PlayerBullet,Missile兩類子彈),效果管理類(EffectManager),爆炸類(Explosion,又包括SmallExplosion,BigExplosion,BulletExplosion),游戲控制層(GameController,又包括BulletController,EnemyController和GameController),游戲結(jié)束層(GameOverLayer)?
關(guān)鍵點(diǎn):①玩家和敵機(jī)的子彈控制統(tǒng)一在BulletController::spawnBullet中處理。如上述游戲元素保存在全局池中,可回收利用,避免反復(fù)創(chuàng)建,spawnBullet會(huì)先從這個(gè)池中取出,如果該池為空才會(huì)創(chuàng)建對(duì)于的子彈。
②敵機(jī)的處理也是采用相同的方式,在EnemyController::spawnEnemy中處理,如果該池為空才會(huì)創(chuàng)建對(duì)于的敵機(jī)。
③GameLayer::gameMaster管理敵機(jī)的出現(xiàn)的頻率。
④GameController::update管理游戲的碰撞檢測(cè)。
除了一些數(shù)學(xué)上的計(jì)算比較羞澀意外,整個(gè)游戲的邏輯還是比較簡(jiǎn)單的。。。這里就不細(xì)說(shuō)了,大家直接看源碼吧。。。
總結(jié)
以上是生活随笔為你收集整理的【玩转cocos2d-x之三十五】Earth Warrior 3D大揭秘的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【玩转cocos2d-x之三十四】绘图:
- 下一篇: 【玩转cocos2d-x之三十六】Fla