首页 > 代码库 > Quick Cocos2dx controller的初步实现
Quick Cocos2dx controller的初步实现
很久没有记笔记了,今天记一下,最近都在瞎忙活,都不知道自己干了些啥。
先来一张目前的效果图:
我的Controller是在官方的mvc sample的里面的PlayerDualController上更改的,所以很多地方还没来得及清理掉。
源码如下:
1 local PlayerController = class("PlayerController") 2 3 function PlayerController:ctor() 4 end 5 6 function PlayerController:tick() 7 local enemy 8 local me = app:getObject("me") 9 local mytarget = me:getTarget()10 if mytarget == nil then11 print("I have no target...")12 me:searchTarget()13 else14 printf("My target id : %s",me:getTarget())15 end16 17 mytarget = me:getTarget()18 if mytarget == nil then19 print("Win...")20 else21 enemy = app:getObject(mytarget)22 local distance = self:dist(enemy:getX(),enemy:getY(), me:getX(), me:getY())23 if distance < 10 then24 me:fire(enemy)25 print("Attack.....")26 else27 print("Keep moving....")28 me:walk()29 end30 end31 end32 33 function PlayerController:dist( ax,ay,bx,by )34 local dx,dy = ax - bx, ay - by35 return math.sqrt(dx*dx + dy*dy)36 end37 38 return PlayerController
这个类暂时比较简单,只有两个方法。
PlayerController:tick 这个方法是每帧调用的,用来计算各种数据数据并保存到model,并且通知角色进行状态变更等事情,这个类后续会越来越复杂。
PlayerController:dist( ax,ay,bx,by )这个是计算两点之间的距离,可以用来判断角色是否进入战斗状态啦,子弹是否打中人了之类的事情。
因为游戏的逻辑处理部分都会在这里进行,cpu性能优化有很大一部分在这里进行,但是目前我们只需要一步一步的实现功能,优化的事情后续再说。
我们在初始化角色的时候存入到app这个目前作为model的存在里面去:
1 local player = Hero.new({ 2 id = "me", 3 nickname = "beach", 4 level = 1, 5 x = display.cx - 150, 6 y = display.cy, 7 direction = -1, 8 speed = 10 9 })10 app:setObject("me", player)11 12 local enemy = Hero.new({13 id = "enemy",14 nickname = "bitch",15 level = 1,16 y = display.cy,17 x = display.cx + 150,18 direction = 119 })20 app:setObject("enemy", enemy)
然后在战斗场景中讲对应的Sprite存放到一个Map里面,因为这里的View层所在:
1 spMaps = {} 2 3 local manager = CCArmatureDataManager:sharedArmatureDataManager() 4 manager:addArmatureFileInfo("Zombie.png","Zombie.plist","Zombie.xml") 5 local attacker = app:getObject("me") 6 local attackerSp = CCArmature:create(attacker:getRes()) 7 local animation = attackerSp:getAnimation() 8 animation:setSpeedScale(0.4) 9 animation:play("anim_walk")10 attackerSp:setPosition(attacker:getX(), attacker:getY())11 attackerSp:setScaleX(attacker:getDirection())12 self.layer:addChild(attackerSp)13 14 local enemy = app:getObject("enemy")15 local attackerSp1 = CCArmature:create(enemy:getRes())16 local animation1 = attackerSp1:getAnimation()17 animation1:setSpeedScale(0.2)18 animation1:play("anim_walk")19 attackerSp1:setPosition(enemy:getX(), enemy:getY())20 attackerSp1:setScaleX(enemy:getDirection())21 self.layer:addChild(attackerSp1)22 23 spMaps["me"] = attackerSp24 spMaps["enemy"] = attackerSp125 26 self.layer:addNodeEventListener(cc.NODE_TOUCH_EVENT, function( event )27 self.onTouch(event)28 end)29 self.layer:setTouchEnabled(true)30 31 controller = PlayerController.new()32 33 handler = scheduler.scheduleGlobal(self.onEnterFrame, 0.5)
然后在战斗场景的帧回调中调用PlayerController:tick()并且更新显示:
1 function FightScene:onEnterFrame()2 controller:tick()3 for key,sp in pairs(spMaps) do4 local data =http://www.mamicode.com/ app:getObject(key)5 if data ~= nil then6 sp:setPosition(data:getX(), data:getY())7 end8 end9 end
大概就是这个样子,其他的具体功能还有待实现。
下一步看心情研究一下扩展lua。
DEMO的完整代码
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。