很久没有记笔记了,今天记一下,最近都在瞎忙活,都不知道自己干了些啥。
我的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 then 11 print("I have no target...") 12 me:searchTarget() 13 else 14 printf("My target id : %s",me:getTarget()) 15 end 16 17 mytarget = me:getTarget() 18 if mytarget == nil then 19 print("Win...") 20 else 21 enemy = app:getObject(mytarget) 22 local distance = self:dist(enemy:getX(),enemy:getY(), me:getX(), me:getY()) 23 if distance < 10 then 24 me:fire(enemy) 25 print("Attack.....") 26 else 27 print("Keep moving....") 28 me:walk() 29 end 30 end 31 end 32 33 function PlayerController:dist( ax,ay,bx,by ) 34 local dx,dy = ax - bx, ay - by 35 return math.sqrt(dx*dx + dy*dy) 36 end 37 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 = 1 19 }) 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"] = attackerSp 24 spMaps["enemy"] = attackerSp1 25 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) do 4 local data = app:getObject(key) 5 if data ~= nil then 6 sp:setPosition(data:getX(), data:getY()) 7 end 8 end 9 end
大概就是这个样子,其他的具体功能还有待实现。
下一步看心情研究一下扩展lua。
最后来一张目前的效果图: