zoukankan      html  css  js  c++  java
  • 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源码地址

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

  • 相关阅读:
    All in One 你想知道的 hacker 技术都在这里
    5 个 Git 工作流,改善你的开发流程
    完全基于 Java 的开源深度学习平台,亚马逊的大佬带你上手
    感谢 Vue.js 拯救我这个前端渣渣,让 PowerJob 有了管理后台界面
    linux报错Loading mirror speeds from cached hostfile解决方法
    Linux使用mailx通过第三方SMTP发送邮件,带附件操作
    打包发送邮件
    springboot项目中使用设计模式一策略模式
    Spring Boot 开发 WebService 服务
    常见限流算法介绍(漏桶算法、令牌桶算法)及实现--待整理
  • 原文地址:https://www.cnblogs.com/adoontheway/p/3909511.html
Copyright © 2011-2022 走看看