Quick Cocos2dx 初步战斗
呵呵,图片先来一发:
最近懒,很懒,连我自己都觉得有点可耻了。
但是实在没有什么东西啊,温水煮青蛙的什么的。
吐槽完成,以上。
目前完成了简单的战斗部分,AI还需要抽出来。
然后突然之间想到手游的帧频是60fps/s,然后就放弃了之前比较平滑的CCMoveTo,换成了每帧去计算坐标。
还增加了掉血计算与表现,与死亡逻辑处理。
虽然处理得不是很干净,但是这个是后续需要优化的部分。
本次的主要用到的知识点:
framework.scheduler
framework.transition
写这篇blog的目的是在于给自己一点动力,能够一步一个脚印去记录自己。
主要更新的代码部分:
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 初步战斗相关推荐
- quick cocos2dx 3.x 配置win32工程
公司项目主体部分用c++,而ui部分用lua写,所以选择了用quick框架.项目先开发了ios/mac版,这两天试着配置其win32工程,遇到一些问题,记录一下(纯c++版本cocos2dx配置方法应 ...
- quick cocos2d-x 精灵大小(宽高)获取
quick下sprite的大小获取,记录一下: local w = sprite:getContentSize().width local h = sprite:getContentSize().he ...
- Quick Cocos2dx 场景转换问题
项目结构是这样子的: 主场景代码是这样子的: local MainScene = class("MainScene", function()return display.newSc ...
- Quick cocos2dx学习笔记
http://www.swfdiy.com/?p=1663 http://blog.csdn.net/ecaifu800/article/details/23917943 quick 在cdx+lua ...
- quick cocos2d-x 使用CCTableView 例子
可以运行,已经测试过了,参考网络上别人的代码,觉得很有用,记录.直接上代码: 发现一个很坑爹的地方,就是tableview定size的宽高,与tableview的cell的高宽是恰恰相反..这个API ...
- Quick Cocos2dx 调试问题
最近由于忙了一段时间,忙完了之后又迷茫了这么久,然后终于开始继续Quick-x的学习之路了. 然后遇到了一个比较棘手的问题. 虽然照着官方mvc的例子敲代码,但是还是不停的报错,报错的问题下次集结成一 ...
- Cocos2D-x 入门(1)
Cocos2D-x 是什么? 它是全球公认最好用的2D游戏应用开发引擎 :「保卫萝卜」.「捕鱼达人」.「找你妹」.「一个都不能死 」都是它搞出来的.它免费.开源.跨平台,不但好用,而且易学, 当前最流 ...
- Quick-cocos2d-x 与COCOS2DX 区别
quick-cocos2d-x(后文简称 quick)与 cocos2d-x 的关系,用一句话概括:quick 是 cocos2d-x 针对 Lua 的豪华套装威力加强版. 项目地址:quick-co ...
- linux查找nginx目录,Linux下查看nginx安装目录
Effective C++ -----条款53:不要轻忽编译期的警告 严肃对待编译器发出的警告信息.努力在你的编译器的最高(最严苛)警告级别下争取"无任何警告"的荣誉. 不要过度依 ...
最新文章
- 10大高性能开发宝石,我要消灭一半程序员!
- Apress水果大餐——移动开发
- 在计算机技术中描述信息最小单位是,计算机二级考试单选题
- 服务器自动关机怎么查,怎样设置WIN7系统的自动关机和查询系统上次的关机时间?...
- C++实现topological sort拓扑排序算法(附完整源码)
- ASP.NET Core 系列视频完结,新项目实战课程发布。
- FreeBSD学习笔记17-FreeBSD下安装MySQL数据库
- java argument parse_snmp4j 之 ArgumentParser
- python 操作 saltstack Api(二) 示例
- 0302 GDB调试走起【给PHP写插件】
- gite改提交的用户名称
- 数独大师级技巧_数独游戏技巧(图解)
- 网络安全等级保护概述
- 神武临时服回服务器在那个位置,2021年6月25日游戏更新公告
- 测试三极管的口诀[转]
- 小朋友排队问题(树状数组)
- Java之节点流和处理流(Buffered字节字符处理流)
- tableau大屏bi_Excel,Tableau,Power BI ...您应该使用什么?
- 解决ChatGPT网络总是掉线问题
- 【数学与算法】向量内积(点乘)和外积(叉乘)概念及几何意义