如何使用Cocos Code IDE和Cocos2d-x开发游戏《谁也不能落下》

1.创建新项目

打开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,选择证书和平台,确认生成。