呵呵,图片先来一发:

最近懒,很懒,连我自己都觉得有点可耻了。

但是实在没有什么东西啊,温水煮青蛙的什么的。

吐槽完成,以上。

目前完成了简单的战斗部分,AI还需要抽出来。

然后突然之间想到手游的帧频是60fps/s,然后就放弃了之前比较平滑的CCMoveTo,换成了每帧去计算坐标。

还增加了掉血计算与表现,与死亡逻辑处理。

虽然处理得不是很干净,但是这个是后续需要优化的部分。

本次的主要用到的知识点:

framework.scheduler

framework.transition

写这篇blog的目的是在于给自己一点动力,能够一步一个脚印去记录自己。

主要更新的代码部分:

GameUnit.lua:增加了死亡逻辑处理

GameUnit.lua

  1 local GameUnit = class("GameUnit", function()
  2     return display.newNode()
  3 end)
  4 local scheduler = import("framework.scheduler")
  5 local Progress = import("app.views.Progress")
  6
  7 function GameUnit:ctor(hero)
  8     -- body
  9     local clas = hero.class
 10     cc.EventProxy.new(hero, self)
 11         :addEventListener(clas.CHANGE_STATE_EVENT, handler(self, self.onStateChange))
 12         :addEventListener(clas.KILL_EVENT, handler(self, self.onKilled))
 13         :addEventListener(clas.HP_CHANGED_EVENT, handler(self, self.onHpChanged))
 14         :addEventListener(clas.EXP_CHANGED_EVENT, handler(self, self.onExpChanged))
 15
 16     self.player = hero
 17     self:initDisplay()
 18 end
 19
 20 function GameUnit:onStateChange( event )
 21     self:updateShapeDisplay(self.player:getState())
 22 end
 23
 24 --更新角色显示{"anim_walk","anim_eat","anim_placeladder","anim_idle","anim_ladderwalk","anim_laddereat","anim_death"}
 25 function GameUnit:updateShapeDisplay(state)
 26     local animname = "anim_idle"
 27     if state == "walking" then
 28         animname = "anim_walk"
 29     elseif state == "firing" then
 30         animname = "anim_eat"
 31     elseif state == "dead" then
 32         animname = "anim_death"
 33     end
 34     printInfo("GameUnit state changed to %s playing : %s", state, animname)
 35     if self.shape ~= nil then
 36         local animation = self.shape:getAnimation()
 37         animation:setSpeedScale(0.6)
 38         animation:play(animname)
 39         self:setPosition(self.player:getX(), self.player:getY())
 40         self:setScaleX(self.player:getDirection())
 41
 42     end
 43
 44     if self.player:isDead() then
 45         scheduler.performWithDelayGlobal(handler(self, self.autoRemove), 1.5)
 46     end
 47 end
 48
 49 function GameUnit:onKilled( event)
 50     -- body
 51 end
 52
 53 function GameUnit:onHpChanged( event )
 54     self.hpbar:setProgress(self.player:getHp()/self.player:getMaxHp() * 100)
 55
 56 end
 57
 58 function GameUnit:autoRemove()
 59     local action = CCFadeTo:create(1.0, 0.0)
 60     transition.execute(self.shape, action, {
 61         onComplete = function( )
 62             self:removeSelf()
 63         end
 64         })
 65 end
 66
 67 function GameUnit:onExpChanged( event )
 68     -- body
 69 end
 70
 71 --初始化显示
 72 function GameUnit:initDisplay()
 73     -- 角色外观
 74     local shape = CCArmature:create(self.player:getRes())
 75     self.shape = shape
 76        self:updateShapeDisplay(self.player:getState())
 77        shape:setAnchorPoint(CCPoint(0.5,0))
 78        self:addChild(shape)
 79
 80     --角色血条
 81     self.hpbar = Progress.new("progres_bg.png","progress.png")
 82     self.hpbar:pos(0.5, shape:getContentSize().height)
 83     self:addChild(self.hpbar)
 84 end
 85 --传入|更新数据
 86 function GameUnit:setData()
 87     -- body
 88 end
 89 --取得数据
 90 function GameUnit:getData()
 91     return self.hero
 92 end
 93 --添加事件:重复利用这个对象的时候会用到
 94 function GameUnit:addEvents()
 95     -- body
 96 end
 97 --移除事件:重复利用这个对象的时候会用到
 98 function GameUnit:removeEvents()
 99     -- body
100 end
101
102 return GameUnit

PlayerController.lua:增加了伤害跳字,优化了角色移动的计算方式

  1 local PlayerController = class("PlayerController")
  2
  3 function PlayerController:ctor()
  4 end
  5
  6 function PlayerController:initEventListener(hero)
  7 end
  8
  9 function PlayerController:tick(spMaps)
 10     ---更新数据
 11     --[[
 12     for name,sp in ipairs(spMaps) do
 13         if sp:getAI() == nil then
 14             sp:setAI(ai)
 15         end
 16     end]]
 17     local  enemy
 18     local me = app:getObject("me")
 19     local mytarget = me:getTarget()
 20     if mytarget == nil then
 21         me:searchTarget()
 22     end
 23
 24     mytarget = me:getTarget()
 25     if mytarget == nil then
 26         printLog(10, "Win==============")
 27     else
 28         enemy = app:getObject(mytarget)
 29         if enemy:isDead() then
 30             printLog(10, "Win==============")
 31             return
 32         end
 33         local myShape
 34         local distance = self:dist(enemy:getX(),enemy:getY(), me:getX(), me:getY())
 35         if distance < me:getRadius() then
 36             if me:getState() == "walking" then--走动状态中的话进行待命
 37                 myShape = spMaps[me:getId()]
 38                 myShape:stopActionByTag(100)
 39                 me:standby()
 40             elseif me:getState() == "idle" then--待命状态的话根据冷却时间判断是否攻击
 41                 if me:canFire() then
 42                     me:fire(enemy)
 43                     local percent = math.random(0,10)
 44                     local stat_sp
 45                     if percent >= 6 then
 46                         stat_sp = self:getHarmSp(10,enemy:getX(),enemy:getY()+50)
 47                         enemy:decreaseHp(10)
 48                     else
 49                         stat_sp = self:getHarmSp(0,enemy:getX(),enemy:getY()+50)
 50                     end
 51
 52                     local parent = display.getRunningScene()
 53                     assert(parent ~= nil, "parent is nil")
 54                     assert(stat_sp ~= nil, "stat_sp is nil")
 55                     if stat_sp ~= nil and parent ~= nil then
 56                         parent:addChild(stat_sp)
 57                         transition.execute(stat_sp, CCMoveTo:create(1.0, CCPoint(enemy:getX()-50, enemy:getY()+150)), {
 58                             onComplete = function()
 59                                 stat_sp:removeSelf()
 60                             end
 61                             })
 62                     end
 63                 else
 64                     print("Cooling down....")
 65                 end
 66             end
 67         else
 68             if me:getState() ~= "walking" then
 69                 me:walk()
 70                 myShape = spMaps[me:getId()]
 71                 --[[local duration = distance/me:getSpeed()
 72                 local action = CCMoveTo:create(duration,CCPoint(enemy:getX(),enemy:getY()))
 73                 action:setTag(100)
 74                 myShape:runAction(action)]]
 75             else
 76                 me:updatePos()
 77             end
 78         end
 79     end
 80     --更新显示:用显示去更新数据,这个是不对的
 81     for key,sp in pairs(spMaps) do
 82         local data = app:getObject(key)
 83         if data ~= nil then
 84             sp:setPosition(data:getX(), data:getY())
 85             --[[data:setX(sp:getPositionX())
 86             data:setY(sp:getPositionY())]]
 87         end
 88     end
 89 end
 90
 91 function PlayerController:getHarmSp( harm, posx, posy )
 92     local  sp
 93     local harmstr = string.format("%d", harm)
 94     if harm > 0 then
 95         sp = CCNode:create()
 96         sp:pos(posx, posy)
 97         for i=1,#harmstr do
 98             local tempsp = display.newSprite("fight/"..string.sub(harmstr, i,i)..".png",(i-1)*30,0)
 99             local size = tempsp:getContentSize()
100             printLog(1, "tempsp size w:%f h:%f", size.width, size.height)
101             if tempsp ~= nil then
102                 sp:addChild(tempsp)
103             end
104         end
105     else
106         sp = display.newSprite("shanbix_wenzi.png", posx, posy)
107     end
108     return sp
109 end
110
111 function PlayerController:dist( ax,ay,bx,by )
112     local dx,dy = ax - bx, ay - by
113     return math.sqrt(dx*dx + dy*dy)
114 end
115
116 function PlayerController:useSkill(skill)
117     self.view:useSkill(skill)
118 end
119
120 function PlayerController:control( view )
121     -- body
122     self.view = view
123 end
124
125 return PlayerController

PlayerController

转载于:https://www.cnblogs.com/adoontheway/p/3978854.html

Quick Cocos2dx 初步战斗相关推荐

  1. quick cocos2dx 3.x 配置win32工程

    公司项目主体部分用c++,而ui部分用lua写,所以选择了用quick框架.项目先开发了ios/mac版,这两天试着配置其win32工程,遇到一些问题,记录一下(纯c++版本cocos2dx配置方法应 ...

  2. quick cocos2d-x 精灵大小(宽高)获取

    quick下sprite的大小获取,记录一下: local w = sprite:getContentSize().width local h = sprite:getContentSize().he ...

  3. Quick Cocos2dx 场景转换问题

    项目结构是这样子的: 主场景代码是这样子的: local MainScene = class("MainScene", function()return display.newSc ...

  4. Quick cocos2dx学习笔记

    http://www.swfdiy.com/?p=1663 http://blog.csdn.net/ecaifu800/article/details/23917943 quick 在cdx+lua ...

  5. quick cocos2d-x 使用CCTableView 例子

    可以运行,已经测试过了,参考网络上别人的代码,觉得很有用,记录.直接上代码: 发现一个很坑爹的地方,就是tableview定size的宽高,与tableview的cell的高宽是恰恰相反..这个API ...

  6. Quick Cocos2dx 调试问题

    最近由于忙了一段时间,忙完了之后又迷茫了这么久,然后终于开始继续Quick-x的学习之路了. 然后遇到了一个比较棘手的问题. 虽然照着官方mvc的例子敲代码,但是还是不停的报错,报错的问题下次集结成一 ...

  7. Cocos2D-x 入门(1)

    Cocos2D-x 是什么? 它是全球公认最好用的2D游戏应用开发引擎 :「保卫萝卜」.「捕鱼达人」.「找你妹」.「一个都不能死 」都是它搞出来的.它免费.开源.跨平台,不但好用,而且易学, 当前最流 ...

  8. Quick-cocos2d-x 与COCOS2DX 区别

    quick-cocos2d-x(后文简称 quick)与 cocos2d-x 的关系,用一句话概括:quick 是 cocos2d-x 针对 Lua 的豪华套装威力加强版. 项目地址:quick-co ...

  9. linux查找nginx目录,Linux下查看nginx安装目录

    Effective C++ -----条款53:不要轻忽编译期的警告 严肃对待编译器发出的警告信息.努力在你的编译器的最高(最严苛)警告级别下争取"无任何警告"的荣誉. 不要过度依 ...

最新文章

  1. 10大高性能开发宝石,我要消灭一半程序员!
  2. Apress水果大餐——移动开发
  3. 在计算机技术中描述信息最小单位是,计算机二级考试单选题
  4. 服务器自动关机怎么查,怎样设置WIN7系统的自动关机和查询系统上次的关机时间?...
  5. C++实现topological sort拓扑排序算法(附完整源码)
  6. ASP.NET Core 系列视频完结,新项目实战课程发布。
  7. FreeBSD学习笔记17-FreeBSD下安装MySQL数据库
  8. java argument parse_snmp4j 之 ArgumentParser
  9. python 操作 saltstack Api(二) 示例
  10. 0302 GDB调试走起【给PHP写插件】
  11. gite改提交的用户名称
  12. 数独大师级技巧_数独游戏技巧(图解)
  13. 网络安全等级保护概述
  14. 神武临时服回服务器在那个位置,2021年6月25日游戏更新公告
  15. 测试三极管的口诀[转]
  16. 小朋友排队问题(树状数组)
  17. Java之节点流和处理流(Buffered字节字符处理流)
  18. tableau大屏bi_Excel,Tableau,Power BI ...您应该使用什么?
  19. 解决ChatGPT网络总是掉线问题
  20. 【数学与算法】向量内积(点乘)和外积(叉乘)概念及几何意义

热门文章

  1. linux内存管理和原理分析
  2. php 类中的各种拦截器
  3. Linux编程常见问题
  4. 在ASP.NET中获取文件属性
  5. 从FFmpeg 4. 2源码中提取dshow mjpeg code步骤
  6. OpenCV代码提取:Windows上通过DShow获取Camera视频
  7. 【Qt】信号和槽传递自定义结构体
  8. 【Qt】QTest:编译Qt单元测试程序
  9. 计算机网络Rip例题,计算机网络技术习题
  10. mysql占用资源最小的语句_MySQL一个语句查出各种整形占用字节数及最大最小值的实例...