Quick Cocos2dx 初步战斗
呵呵,图片先来一发:
最近懒,很懒,连我自己都觉得有点可耻了。
但是实在没有什么东西啊,温水煮青蛙的什么的。
吐槽完成,以上。
目前完成了简单的战斗部分,AI还需要抽出来。
然后突然之间想到手游的帧频是60fps/s,然后就放弃了之前比较平滑的CCMoveTo,换成了每帧去计算坐标。
还增加了掉血计算与表现,与死亡逻辑处理。
虽然处理得不是很干净,但是这个是后续需要优化的部分。
本次的主要用到的知识点:
写这篇blog的目的是在于给自己一点动力,能够一步一个脚印去记录自己。
主要更新的代码部分:
GameUnit.lua:增加了死亡逻辑处理
local GameUnit = class("GameUnit", function()
return display.newNode()
end)
local scheduler = import("framework.scheduler")
local Progress = import("app.views.Progress") function GameUnit:ctor(hero)
-- body
local clas = hero.class
cc.EventProxy.new(hero, self)
:addEventListener(clas.CHANGE_STATE_EVENT, handler(self, self.onStateChange))
:addEventListener(clas.KILL_EVENT, handler(self, self.onKilled))
:addEventListener(clas.HP_CHANGED_EVENT, handler(self, self.onHpChanged))
:addEventListener(clas.EXP_CHANGED_EVENT, handler(self, self.onExpChanged)) self.player = hero
self:initDisplay()
end function GameUnit:onStateChange( event )
self:updateShapeDisplay(self.player:getState())
end --更新角色显示{"anim_walk","anim_eat","anim_placeladder","anim_idle","anim_ladderwalk","anim_laddereat","anim_death"}
function GameUnit:updateShapeDisplay(state)
local animname = "anim_idle"
if state == "walking" then
animname = "anim_walk"
elseif state == "firing" then
animname = "anim_eat"
elseif state == "dead" then
animname = "anim_death"
end
printInfo("GameUnit state changed to %s playing : %s", state, animname)
if self.shape ~= nil then
local animation = self.shape:getAnimation()
animation:setSpeedScale(0.6)
animation:play(animname)
self:setPosition(self.player:getX(), self.player:getY())
self:setScaleX(self.player:getDirection()) end if self.player:isDead() then
scheduler.performWithDelayGlobal(handler(self, self.autoRemove), 1.5)
end
end function GameUnit:onKilled( event)
-- body
end function GameUnit:onHpChanged( event )
self.hpbar:setProgress(self.player:getHp()/self.player:getMaxHp() * ) end function GameUnit:autoRemove()
local action = CCFadeTo:create(1.0, 0.0)
transition.execute(self.shape, action, {
onComplete = function( )
self:removeSelf()
end
})
end function GameUnit:onExpChanged( event )
-- body
end --初始化显示
function GameUnit:initDisplay()
-- 角色外观
local shape = CCArmature:create(self.player:getRes())
self.shape = shape
self:updateShapeDisplay(self.player:getState())
shape:setAnchorPoint(CCPoint(0.5,))
self:addChild(shape) --角色血条
self.hpbar = Progress.new("progres_bg.png","progress.png")
self.hpbar:pos(0.5, shape:getContentSize().height)
self:addChild(self.hpbar)
end
--传入|更新数据
function GameUnit:setData()
-- body
end
--取得数据
function GameUnit:getData()
return self.hero
end
--添加事件:重复利用这个对象的时候会用到
function GameUnit:addEvents()
-- body
end
--移除事件:重复利用这个对象的时候会用到
function GameUnit:removeEvents()
-- body
end return GameUnit
PlayerController.lua:增加了伤害跳字,优化了角色移动的计算方式
local PlayerController = class("PlayerController") function PlayerController:ctor()
end function PlayerController:initEventListener(hero)
end function PlayerController:tick(spMaps)
---更新数据
--[[
for name,sp in ipairs(spMaps) do
if sp:getAI() == nil then
sp:setAI(ai)
end
end]]
local enemy
local me = app:getObject("me")
local mytarget = me:getTarget()
if mytarget == nil then
me:searchTarget()
end mytarget = me:getTarget()
if mytarget == nil then
printLog(, "Win==============")
else
enemy = app:getObject(mytarget)
if enemy:isDead() then
printLog(, "Win==============")
return
end
local myShape
local distance = self:dist(enemy:getX(),enemy:getY(), me:getX(), me:getY())
if distance < me:getRadius() then
if me:getState() == "walking" then--走动状态中的话进行待命
myShape = spMaps[me:getId()]
myShape:stopActionByTag()
me:standby()
elseif me:getState() == "idle" then--待命状态的话根据冷却时间判断是否攻击
if me:canFire() then
me:fire(enemy)
local percent = math.random(,)
local stat_sp
if percent >= then
stat_sp = self:getHarmSp(,enemy:getX(),enemy:getY()+)
enemy:decreaseHp()
else
stat_sp = self:getHarmSp(,enemy:getX(),enemy:getY()+)
end local parent = display.getRunningScene()
assert(parent ~= nil, "parent is nil")
assert(stat_sp ~= nil, "stat_sp is nil")
if stat_sp ~= nil and parent ~= nil then
parent:addChild(stat_sp)
transition.execute(stat_sp, CCMoveTo:create(1.0, CCPoint(enemy:getX()-, enemy:getY()+)), {
onComplete = function()
stat_sp:removeSelf()
end
})
end
else
print("Cooling down....")
end
end
else
if me:getState() ~= "walking" then
me:walk()
myShape = spMaps[me:getId()]
--[[local duration = distance/me:getSpeed()
local action = CCMoveTo:create(duration,CCPoint(enemy:getX(),enemy:getY()))
action:setTag(100)
myShape:runAction(action)]]
else
me:updatePos()
end
end
end
--更新显示:用显示去更新数据,这个是不对的
for key,sp in pairs(spMaps) do
local data = app:getObject(key)
if data ~= nil then
sp:setPosition(data:getX(), data:getY())
--[[data:setX(sp:getPositionX())
data:setY(sp:getPositionY())]]
end
end
end function PlayerController:getHarmSp( harm, posx, posy )
local sp
local harmstr = string.format("%d", harm)
if harm > then
sp = CCNode:create()
sp:pos(posx, posy)
for i=,#harmstr do
local tempsp = display.newSprite("fight/"..string.sub(harmstr, i,i)..".png",(i-)*,)
local size = tempsp:getContentSize()
printLog(, "tempsp size w:%f h:%f", size.width, size.height)
if tempsp ~= nil then
sp:addChild(tempsp)
end
end
else
sp = display.newSprite("shanbix_wenzi.png", posx, posy)
end
return sp
end function PlayerController:dist( ax,ay,bx,by )
local dx,dy = ax - bx, ay - by
return math.sqrt(dx*dx + dy*dy)
end function PlayerController:useSkill(skill)
self.view:useSkill(skill)
end function PlayerController:control( view )
-- body
self.view = view
end return PlayerController
PlayerController
Quick Cocos2dx 初步战斗的更多相关文章
- Quick Cocos2dx Http通讯
服务端:Python 通讯协议:Http 参考文章: 1 用python实现一个基本的http server服务器 http://blog.sina.com.cn/s/blog_416e3063010 ...
- quick cocos2d-x 入门---井字棋
学习quick cocos2d-x 第二天 ,使用quick-x 做了一个井字棋游戏 . 我假设读者已经 http://wiki.quick-x.com/doku.php?id=zh_cn阅读了这个链 ...
- Mac下搭建quick cocos2d-x编译环境
一. 我知道在你的电脑中一定已经安装好了Xcode(没有自己下载去吧),打开Xcode,开启"偏好设置"对话框(commond + ,).假设打开之后出现的是这种一个对话框,那么直 ...
- 用Quick Cocos2dx做一个连连看(一)
呵呵,不知道能不能坚持下来,先写着吧. 预备知识:Quick Cocos2dx 2.2.5基本知识 或者 Cocos2dx基本知识, lua入门 开发工具:Sublime Text 2.0/3.0 原 ...
- quick cocos2dx 3.x 配置win32工程
公司项目主体部分用c++,而ui部分用lua写,所以选择了用quick框架.项目先开发了ios/mac版,这两天试着配置其win32工程,遇到一些问题,记录一下(纯c++版本cocos2dx配置方法应 ...
- quick cocos2d-x 2.2.4 window环境调试
BabeLua简介 BabeLua是一款基于VS2012/2013(简称VS)的免费开源的Lua集成开发环境,在Lua编辑和调试方面,具有如下功能和特性: ●Lua语法高亮 ●语法检查 ●自动补全 ● ...
- Quick Cocos2dx MVC初步
今天看到了自己之前两年前写的一个地图编辑器, 写了不到一半就放弃了, 但是还是github上的小伙伴fork了, 真的感觉对不起那位伙计, 同时也鄙视一下一直以来懒得要死的自己, 希望这个demo不要 ...
- Quick Cocos2dx controller的初步实现
很久没有记笔记了,今天记一下,最近都在瞎忙活,都不知道自己干了些啥. 我的Controller是在官方的mvc sample的里面的PlayerDualController上更改的,所以很多地方还没来 ...
- quick cocos2dx lua 内存释放
前言 对于内存的优化,网上有很多例子和教程.总体来说,就那么几种解决方案,在最后我会简单提下,这里先说下在quick中,对于图片的处理. 1.查看内存调试信息 对于quick框架的了解,我们可以参考\ ...
随机推荐
- Oracle10 多行和并
SELECT fspc, wmsys.wm_concat (jsrzmc) as jsr FROM dxjsrxx GROUP BY fspc select fspc, LISTAGG(jsrzmc, ...
- Inno Setup入门(十四)——替换安装程序和卸载程序的图标
通常Inno生成的安装文件的图标是一个光盘和显示器,如下图.同时,程序安装好之后,在安装目录下的卸载程序的图标也是一样的,其实我们也可以自己修改. 首先生成的安装文件图标.这个比较简单,只需要在Set ...
- calc()使用笔记
calc()可以给元素做运算, calc(expression) eg: .a { width: -webkit-calc(100% - 2px); width: -moz-calc(100% - 2 ...
- Android OpenGL ES(十一)绘制一个20面体 .
前面介绍了OpenGL ES所有能够绘制的基本图形,点,线段和三角形.其它所有复杂的2D或3D图形都是由这些基本图形构成. 本例介绍如何使用三角形构造一个正20面体.一个正20面体,有12个顶点,20 ...
- Python数据分析Python库介绍(1)
一直想写点Python的笔记了,今天就闲着无聊随便抄点,(*^__^*) 嘻嘻…… ---------------------------------------------------------- ...
- PHP上传图片三个步骤详细分析
学习PHP时,你可能会遇到PHP上传图片问题,这里将介绍PHP上传图片问题的解决方法,在这里拿出来和大家分享一下.今天我们就开始一起学习PHP上传图片.上传图片原理:首先判断文件类型是否为图片格式,若 ...
- easyui easyui-filebox 显示中文
<input class="easyui-filebox" name="uploadFile" id="uploadFileid" d ...
- struts2中的<s:select>默认选项
//... public class SelectAction extends ActionSupport{ private List<String> searchEngine; priv ...
- HDU 4738 Caocao's Bridges(割边)
乍一看一个模板题,仔细一看还是模板题,但是三个坑.1,不是连通图,放0个.2 守卫为0,放1个. 3注意重边. #include<iostream> #include<cstdio& ...
- 二叉树,平衡树,红黑树,B~/B+树汇总
二叉查找树(BST),平衡二叉查找树(AVL),红黑树(RBT),B~/B+树(B-tree).这四种树都具备下面几个优势: (1) 都是动态结构.在删除,插入操作的时候,都不需要彻底重建原始的索引树 ...