如何使用Cocos Code IDE和Cocos2d-x开发游戏《谁也不能落下》
打开Cocos代码ide,切换到Lua工作环境。
选择菜单,创建一个新的CocoLua项目,并输入项目名称:NoOneLeftBehind。
单击下一步设置屏幕方向和分辨率,并确认完成。
这时,你可以点击运行按钮。如果没有问题,会弹出演示。
因为分辨率被我们改了,游戏画面有点失真。
2.游戏逻辑
现在,我们可以将自己的代码添加到游戏项目中。因为游戏的代码细节不是本文的重点,这里只简单介绍一下《一个都不能少》的实现原理。整个游戏项目的源代码可以从我的Github下载。
A.main.lua是游戏的入口。在main()函数中可以找到场景跳转的代码,在接口上与Cocos2d-x一致,可以轻松上手。这里我们将第一个场景切换到主菜单场景。
-创建场景
local scene = require("MenuScene ")
local menu scene = scene . create scene()
如果抄送。director:getInstance():getRunningScene()然后
抄送。director:getInstance():replace scene(menus cene)
其他
抄送。director:getInstance():runWithScene(menus cene)
结束
B.MenuScene.lua是游戏的主菜单,在这里可以选择四种高难度的游戏模式。您可以通过以下方式创建菜单。
-创建菜单
本地函数menuCallbackOpenNormal()
抄送。director:getInstance():replace scene(require(" games scene ")。创造场景(2))
结束
局部正常= cc。menuitem image:create(" normal.png "," normal . png ")
正常:设定位置(0,150)
normal:registerScriptTapHandler(menuCallbackOpenNormal)
...
本地菜单=抄送。菜单:创建(正常,噩梦,地狱,地狱)
self:addChild(菜单)
C.GameScene.lua是游戏的主场景,通过传入的heroCount设置同时显示几个英雄。
-添加英雄
函数GameLayer:addControllers()
local visibleSize = cc。director:getInstance():getVisibleSize()
本地开始= 30
局部差距=(visible size . height-startY)/self。_heroCount
对于i=1,self。_heroCount do
本地控制器= require("HeroController ")。createController(self,startY + gap * (i - 1))
table.insert(self。_控制器,I,控制器)
结束
结束
D.这里我们概括了主人公和他的环境。然后在GameScene的每一帧调用HeroController的onUpdate函数,在这个函数中检测一个随机定时器,判断是否要生成新的障碍物。
-创建块
函数HeroController:onUpdate()
self . frame index = self . frame index+1
if self.frameIndex & gt= self.nextKeyFrameIndex然后
本地块=要求(“块”)。新()
块:init()
自我。_layer:addChild(块)
block:setPositionY(self。_ positionY+block:get contentsize()。高度/ 2)
self:resetTimer()
结束
结束
E.物理引擎。英雄与地块的碰撞采用了Cocos2d-x一体化的物理引擎。以下代码反映了Hero和Block之间的冲突检测。
-碰撞检测
self . touch listener:registerScriptHandler(ontouchbegin,cc。Handler . EVENT _ TOUCH _ BEGAN)
抄送。director:getInstance():getevent dispatcher():addEventListenerWithSceneGraphPriority(self . touch listener,self)
本地函数onContactBegin(联系人)
self:unscheduleUpdate()
抄送。director:getInstance():getEventDispatcher():removeEventListener(self . touch listener)
抄送。director:getInstance():getEventDispatcher():removeEventListener(self . contact listener)
抄送。director:getInstance():replace scene(require(" game over ")。创造(自我。_heroCount,score))
结束
self.contactListener = cc。event listener physics contact:create();
self . contact listener:registerScriptHandler(onContactBegin,cc。handler . EVENT _ PHYSICS _ CONTACT _ BEGIN);
local event dispatcher = self:getevent dispatcher()
event dispatcher:addEventListenerWithSceneGraphPriority(self . contact listener,self);
F.Block类,封装障碍物,每帧向左移动。如果超出屏幕,则删除。
-移动街区
功能更新(dt)
self:setPositionX(self:getPositionX()-3.5)
if(self:getPositionX()& lt;0)然后
self:unscheduleUpdate()
self:removefroparentandcleanup()
结束
结束
self:scheduleupdatewithporitylua(更新,0)
3.每个平台的包装
单击打包按钮,
如果没有添加本地代码,系统会提示您添加本地代码。
A.安卓包装
选择包为apk、调试签名或自定义签名,选择sdk版本并确认生成。
B.B.iOS平台的打包
选择包为ipa,选择证书和平台,确认生成。