Quick Cocos2dx 初步战斗

时间:2023-03-09 04:31:08
Quick Cocos2dx 初步战斗

呵呵,图片先来一发:

Quick Cocos2dx 初步战斗

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

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

吐槽完成,以上。

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

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

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

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

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

framework.scheduler

framework.transition

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

主要更新的代码部分:

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

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