首页 > 代码库 > 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的完整代码