4、cocos2d-Lua的demo--游戏逻辑GameView
2015-07-13 18:34
405 查看
接上,PlayScene场景创建游戏逻辑视图GameView并调用start函数开始游戏:
start调用scheduleUpdate开启一个定时器,绑定每帧刷新时的回调函数:step,回调函数的参数为逝去的时间,step每次随机一两秒的数字,然后每次减去帧的逝去时间,当为0时调用addBug添加虫子,其实意义就是每隔一两秒添加一个虫子。并判断所有虫子的坐标是否在中心洞中,如果是调用bugEnterHole,该函数播放虫子进洞效果动画和音效,减少血量值,当血量小于等于0时分发游戏结束事件。
关于虫子的操作稍后再看,继续看GameView,onCreate中初始化血量,杀死虫子数等数据,setAnimationCache初始化虫子的播放动画。创建点击回调onTouch,当点击的坐标命中到某虫子时表示杀死该虫子。
添加虫子:
蚂蚁和蜘蛛均派生自BugBase,随机产生蚂蚁和蜘蛛,创建虫子对象后再创建虫子精灵调用start开始移动虫子并播放虫子移动时候的动画,下一节主要讲解虫子对象和虫子精灵。
-- GameView is a combination of view and controller local GameView = class("GameView", cc.load("mvc").ViewBase) local BugBase = import("..models.BugBase") local BugAnt = import("..models.BugAnt") local BugSpider = import("..models.BugSpider") local BugSprite = import(".BugSprite") local DeadBugSprite = import(".DeadBugSprite") GameView.HOLE_POSITION = cc.p(display.cx - 30, display.cy - 75) GameView.INIT_LIVES = 99999 GameView.ADD_BUG_INTERVAL_MIN = 1 GameView.ADD_BUG_INTERVAL_MAX = 3 GameView.IMAGE_FILENAMES = {} GameView.IMAGE_FILENAMES[BugBase.BUG_TYPE_ANT] = "BugAnt.png" GameView.IMAGE_FILENAMES[BugBase.BUG_TYPE_SPIDER] = "BugSpider.png" GameView.BUG_ANIMATION_TIMES = {} GameView.BUG_ANIMATION_TIMES[BugBase.BUG_TYPE_ANT] = 0.15 GameView.BUG_ANIMATION_TIMES[BugBase.BUG_TYPE_SPIDER] = 0.1 GameView.ZORDER_BUG = 100 GameView.ZORDER_DEAD_BUG = 50 GameView.events = { PLAYER_DEAD_EVENT = "PLAYER_DEAD_EVENT", } function GameView:start() self:scheduleUpdate(handler(self, self.step)) return self end function GameView:stop() self:unscheduleUpdate() return self end function GameView:step(dt) if self.lives_ <= 0 then return end self.addBugInterval_ = self.addBugInterval_ - dt if self.addBugInterval_ <= 0 then self.addBugInterval_ = math.random(GameView.ADD_BUG_INTERVAL_MIN, GameView.ADD_BUG_INTERVAL_MAX) self:addBug() end for _, bug in pairs(self.bugs_) do bug:step(dt) if bug:getModel():getDist() <= 0 then self:bugEnterHole(bug) end end return self end function GameView:getLives() return self.lives_ end function GameView:getKills() return self.kills_ end function GameView:addBug() local bugType = BugBase.BUG_TYPE_ANT if math.random(1, 2) % 2 == 0 then bugType = BugBase.BUG_TYPE_SPIDER end local bugModel if bugType == BugBase.BUG_TYPE_ANT then bugModel = BugAnt:create() else bugModel = BugSpider:create() end local bug = BugSprite:create(GameView.IMAGE_FILENAMES[bugType], bugModel) :start(GameView.HOLE_POSITION) :addTo(self.bugsNode_, GameView.ZORDER_BUG) self.bugs_[bug] = bug return self end function GameView:bugEnterHole(bug) self.bugs_[bug] = nil bug:fadeOut({time = 0.5, removeSelf = true}) :scaleTo({time = 0.5, scale = 0.3}) :rotateTo({time = 0.5, rotation = math.random(360, 720)}) self.lives_ = self.lives_ - 1 self.livesLabel_:setString(self.lives_) audio.playSound("BugEnterHole.wav") if self.lives_ <= 0 then self:dispatchEvent({name = GameView.events.PLAYER_DEAD_EVENT}) end return self end function GameView:bugDead(bug) local imageFilename = GameView.IMAGE_FILENAMES[bug:getModel():getType()] DeadBugSprite:create(imageFilename) :fadeOut({time = 2.0, delay = 0.5, removeSelf = true}) :move(bug:getPosition()) :rotate(bug:getRotation() + 120) :addTo(self.bugsNode_, GameView.ZORDER_DEAD_BUG) self.bugs_[bug] = nil bug:removeSelf() self.kills_ = self.kills_ + 1 audio.playSound("BugDead.wav") return self end function GameView:onCreate() self.lives_ = GameView.INIT_LIVES self.kills_ = 0 self.bugs_ = {} self.addBugInterval_ = 0 -- add touch layer display.newLayer() :onTouch(handler(self, self.onTouch)) :addTo(self) -- add background image display.newSprite("PlaySceneBg.jpg") :move(display.center) :addTo(self) -- add bugs node self.bugsNode_ = display.newNode():addTo(self) -- add lives icon and label display.newSprite("Star.png") :move(display.left + 50, display.top - 50) :addTo(self) self.livesLabel_ = cc.Label:createWithSystemFont(self.lives_, "Arial", 32) :move(display.left + 90, display.top - 50) :addTo(self) -- create animation for bugs for bugType, filename in pairs(GameView.IMAGE_FILENAMES) do -- load image local texture = display.loadImage(filename) local frameWidth = texture:getPixelsWide() / 3 local frameHeight = texture:getPixelsHigh() -- create sprite frame based on image local frames = {} for i = 0, 1 do local frame = display.newSpriteFrame(texture, cc.rect(frameWidth * i, 0, frameWidth, frameHeight)) frames[#frames + 1] = frame end -- create animation local animation = display.newAnimation(frames, GameView.BUG_ANIMATION_TIMES[bugType]) -- caching animation display.setAnimationCache(filename, animation) end -- bind the "event" component cc.bind(self, "event") end function GameView:onTouch(event) if event.name ~= "began" then return end local x, y = event.x, event.y for _, bug in pairs(self.bugs_) do if bug:getModel():checkTouch(x, y) then self:bugDead(bug) end end end function GameView:onCleanup() self:removeAllEventListeners() end return GameView
start调用scheduleUpdate开启一个定时器,绑定每帧刷新时的回调函数:step,回调函数的参数为逝去的时间,step每次随机一两秒的数字,然后每次减去帧的逝去时间,当为0时调用addBug添加虫子,其实意义就是每隔一两秒添加一个虫子。并判断所有虫子的坐标是否在中心洞中,如果是调用bugEnterHole,该函数播放虫子进洞效果动画和音效,减少血量值,当血量小于等于0时分发游戏结束事件。
关于虫子的操作稍后再看,继续看GameView,onCreate中初始化血量,杀死虫子数等数据,setAnimationCache初始化虫子的播放动画。创建点击回调onTouch,当点击的坐标命中到某虫子时表示杀死该虫子。
添加虫子:
function GameView:addBug() local bugType = BugBase.BUG_TYPE_ANT if math.random(1, 2) % 2 == 0 then bugType = BugBase.BUG_TYPE_SPIDER end local bugModel if bugType == BugBase.BUG_TYPE_ANT then bugModel = BugAnt:create() else bugModel = BugSpider:create() end local bug = BugSprite:create(GameView.IMAGE_FILENAMES[bugType], bugModel) :start(GameView.HOLE_POSITION) :addTo(self.bugsNode_, GameView.ZORDER_BUG) self.bugs_[bug] = bug return self end
蚂蚁和蜘蛛均派生自BugBase,随机产生蚂蚁和蜘蛛,创建虫子对象后再创建虫子精灵调用start开始移动虫子并播放虫子移动时候的动画,下一节主要讲解虫子对象和虫子精灵。
相关文章推荐
- 3、cocos2d-Lua的运行流程与场景
- 2、cocos2d-Lua创建示例demo
- 1、cocos2d-x Lua安装配置
- 【quick-cocos2d-x 游戏开发之一】开发工具sublime text及其强力插件QuickXDev
- cocos2dx之物理引擎
- Cocos3.0 的android返回键功能实现
- cocos2dx AssetsManager的一个BUG
- 如何优化cocos2d/x程序的内存使用和程序大小
- 使用Quick-Cocos2d-x开发植物大战僵尸03-游戏加载页面
- Cocos2dx------2048游戏
- Cocos2d-x的骨骼动画Spine和Armature
- cocos2d-x中使用tinyxml遇到的问题及解决
- cocos2dx的中文乱码
- cocos2d-x v3.2环境配置(现在3.x版本号可以配置该)
- cocos2d 工具使用方法介绍(包含字体,图片,粒子等工具)
- cocos2d 绝对路径操作方式
- [转]Mac下cocos2dx-3.2+Xcode环境配置和项目创建
- cocos2dx实现功能强大的RichText控件
- Cocos2dx 中的CCCallFunc,CCCallFuncN,CCCallFuncND,CCCallFuncO比较
- Cocos物理世界(box2)