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 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。

 Github源码地址

最后来一张目前的效果图:

原文地址:https://www.cnblogs.com/adoontheway/p/3909511.html