【玩转cocos2d-x之三十五】Earth Warrior 3D大揭秘

【玩转cocos2d-x之三十五】Earth Warrior 3D大揭秘,第1张

概述3D游戏现在玩起来门槛还是挺高的。不过如果在Cocos2d-x引擎加入3D扩展,实现2.5D游戏效果又会怎么样? 1.概述 先上大会现场演示图: Apk下载: http://pan.baidu.com/s/1ntM75bV 源码下载: https://github.com/chukong/EarthWarrior3D.git ,给个star不费电。。。 开发环境:Cocos2d-x v3.0 + 3D游戏现在玩起来门槛还是挺高的。不过如果在Cocos2d-x引擎加入3D扩展,实现2.5D游戏效果又会怎么样?

1.概述 先上大会现场演示图:

Apk下载: http://pan.baidu.com/s/1ntM75bV
源码下载: https://github.com/chukong/EarthWarrior3D.git ,给个star不费电。。。
开发环境:Cocos2d-x v3.0 + Sprite3D扩展

适用平台:Mac/iOS/AndroID


2.Sprite3D扩展 2.1. Sprite3D sprite3D扩展目前可以支持加载静态obj模型。

[cpp] view plain copy automodel=Sprite3D::create("3dmodel.obj","texture.png");

2.2. Toon Shading Cocos2d-x精灵不能做发光效果,而Sprite3D中加入了发光函数,指定outline wIDth和color就行了。
model->setoutline(1.5,color3B(0,0));//设置发光宽度1.5,黑色 2.3. 3D API

3D API是Cocos2d-x v3.0就具有的属性,源码可以到Node上看。

node->setposition3D(Vertex3F(x,y,z));//设置位置 Vertex3Fpos=node->getposition3D(); node->setRotation3D(Vertex3F(x,z));//设置旋转 Vertex3Frot=node->getRotation3D();

其中Vertex3F当然就是指定了三维空间。而3D API同样也移植到了一些动作中,比如:

node->runAction(RotateBy::create(Vertex3F(x,z)));

完全没问题。


3.EarthWarrior Classes/3d文件夹包含了Sprite3D。其余文件为游戏逻辑控制,游戏总共三个场景
3.1. 主菜单界面(MainMenuScene) 包含 :主菜单场景(MainMenuScene),飞机模型(Plane),license和Credits层(licenseLayer)。


关键点:①主界面3D飞机的实现

//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,originZ)); this->addChild(_Model); this->scheduleUpdate(); }

②对数学感兴趣的可以研究一下scheduleUpdate怎样让飞机晃啊晃。。。粒子系统这里就不再重复了。
voIDPlane::update(floatdt) { pRate+=0.01; _Model->setRotation3D(Vertex3F(0-pXA*sin(pXW*pRate),0-pZA*sin(pZW*pRate))); } 3.2. 载入界面(LoadingScene) :载入场景(LoadingScene),粒子管理器(ParticleManager)


关键点 :①Loading界面实现资源的预加载,包括音乐,纹理,粒子效果,其中纹理使用异步加载,粒子效果在ParticleManager(单例类)中加载。
②同时Loading界面也实现了游戏元素的预创建并保存在全局池中,避免游戏过程中的卡顿现象和反复create的低效,包括四类敌机和导dMissile,在update中实现每帧创建一个,避免LoadingScene的卡顿。

③cocos logo的旋转动画

voIDLoadingScene::InitCoco() SizevisibleSize=Director::getInstance()->getVisibleSize(); autococo=Sprite3D::create("coconut.obj","coco.png"); if(coco) coco->setposition(Point(visibleSize.wIDth/2,visibleSize.height/2-150)); coco->setoutline(10,0)); addChild(coco,1); coco->runAction(RepeatForever::create(RotateBy::create(0.8f,Vertex3F(0,360,0)))); } }

3.3. 游戏界面(HelloWorldScene) :游戏层(GameLayer),游戏元素基类(GameEntity),飞机类(AirCraft),玩家类(Player),敌机类(EnemIEs,又包括Fodder,Fodderleader,BigDude,Boss四类敌机),子d类(Bullet,又包括PlayerBullet,Missile两类子d),效果管理类(EffectManager),爆炸类(Explosion,又包括SmallExplosion,BigExplosion,BulletExplosion),游戏控制层(GameController,又包括BulletController,EnemyController和GameController),游戏结束层(GameOverLayer)
关键点:①玩家和敌机的子d控制统一在BulletController::spawnBullet中处理。如上述游戏元素保存在全局池中,可回收利用,避免反复创建,spawnBullet会先从这个池中取出,如果该池为空才会创建对于的子d。
②敌机的处理也是采用相同的方式,在EnemyController::spawnEnemy中处理,如果该池为空才会创建对于的敌机。
③GameLayer::gameMaster管理敌机的出现的频率。
④GameController::update管理游戏的碰撞检测。

除了一些数学上的计算比较羞涩意外,整个游戏的逻辑还是比较简单的。。。这里就不细说了,大家直接看源码吧。。。

总结

以上是内存溢出为你收集整理的【玩转cocos2d-x之三十五】Earth Warrior 3D大揭秘全部内容,希望文章能够帮你解决【玩转cocos2d-x之三十五】Earth Warrior 3D大揭秘所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1065429.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存