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

如题所述

第1个回答  2014-12-01
1.创建新工程

  打开Cocos Code IDE,切换到Lua工作环境

  选择菜单,新建一个Cocos Lua项目,输入项目名:NoOneLeftBehind。

  点击下一步设置屏幕方向和分辨率,确认完成

  这个时候你就可以点击运行按钮,没有问题的话示例demo就会弹出。

  因为分辨率被我们更改过的关系,游戏画面有点变形。

  2.游戏逻辑

  现在我们就可以往游戏项目中添加自己的代码了。由于游戏的代码细节并不是本文的重点,所以这里只简单地介绍《一个都不能落下》的实现原理。整个游戏项目源码可以在我的Github上下载。

  A.main.lua是游戏的入口,在main()函数中我们可以找到场景跳转的代码,这在接口上和Cocos2d-x是保持一致的,因此我们可以很容易上手。在这里我们更改第一个场景为主菜单场景。

  --create scene
  local scene = require("MenuScene")
  local menuScene = scene.createScene()
  
  if cc.Director:getInstance():getRunningScene() then
  cc.Director:getInstance():replaceScene(menuScene)
  else
  cc.Director:getInstance():runWithScene(menuScene)
  end

  B.MenuScene.lua是游戏的主菜单,四种难度的游戏模式可以在这里进行选择。你可以用下面这种方式创建一个menu。

  --create menu
  local function menuCallbackOpenNormal()
  cc.Director:getInstance():replaceScene(require("GameScene").createScene(2))
  end
  
  local normal = cc.MenuItemImage:create("normal.png", "normal.png")
  normal:setPosition(0, 150)
  normal:registerScriptTapHandler(menuCallbackOpenNormal)
  
  ...
  
  local menu = cc.Menu:create(normal, nightmare, hell, inferno)
  self:addChild(menu)

  C.GameScene.lua是游戏的主场景,通过传进来的heroCount设置同时显示几个hero。

  --add hero
  function GameLayer:addControllers()
  local visibleSize = cc.Director:getInstance():getVisibleSize()
  
  local startY = 30
  local gap = (visibleSize.height - startY) / self._heroCount
  
  for i=1, self._heroCount do
  local controller = require("HeroController").createController(self, startY + gap * (i - 1))
  table.insert(self._controllers, i, controller)
  end
  end

  D.在这里我们对英雄和他作用的环境进行了封装。然后在GameScene的每一帧调用HeroController的onUpdate函数,在这个函数中检测一个随机定时器来判断是否应该生成一个新的障碍物。

  -- create block
  function HeroController:onUpdate()
  self.frameIndex = self.frameIndex +1
  if self.frameIndex >= self.nextKeyFrameIndex then
  local block = require("Block").new()
  block:init()
  self._layer:addChild(block)
  block:setPositionY(self._positionY + block:getContentSize().height / 2)
  self:resetTimer()
  end
  end

  E.物理引擎。Hero和,Ground,Block的碰撞这里采用了Cocos2d-x集成的物理引擎。以下代码反映了Hero和Block的碰撞检测。

  -- collision detection
  self.touchListener:registerScriptHandler(onTouchBegan,cc.Handler.EVENT_TOUCH_BEGAN)
  cc.Director:getInstance():getEventDispatcher():addEventListenerWithSceneGraphPriority(self.touchListener, self)
  
  local function onContactBegin(contact)
  self:unscheduleUpdate()
  
  cc.Director:getInstance():getEventDispatcher():removeEventListener(self.touchListener)
  cc.Director:getInstance():getEventDispatcher():removeEventListener(self.contactListener)
  
  cc.Director:getInstance():replaceScene(require("GameOver").create(self._heroCount, score))
  end
  
  self.contactListener = cc.EventListenerPhysicsContact:create();
  self.contactListener:registerScriptHandler(onContactBegin, cc.Handler.EVENT_PHYSICS_CONTACT_BEGIN);
  local eventDispatcher = self:getEventDispatcher()
  eventDispatcher:addEventListenerWithSceneGraphPriority(self.contactListener, self);

  F.Block类,封装了障碍物,每一帧向左移动。如果超出了屏幕则删除。

  --move the block
  function update(dt)
  self:setPositionX(self:getPositionX() - 3.5)
  
  if (self:getPositionX() < 0) then
  self:unscheduleUpdate()
  
  self:removeFromParentAndCleanup()
  end
  end
  self:scheduleUpdateWithPriorityLua(update, 0)

  3.各平台打包

  点击打包按钮,

  如果没有添加本地代码,会提示添加本地代码。

  A.Android打包

  选择打包为APK,选择debug签名或者自定义签名,选择SDK版本,确认生成。

  B.iOS平台打包

  选择打包为IPA,选择证书和平台,确认生成。.....
相似回答