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框架的了解,我们可以参考\ ...
随机推荐
- ionic中 .col : 默认的定宽列
.col : 默认的定宽列 在ionic的栅格中,每一行的各列默认是等宽的,这使得实现一个图片 浏览界面非常简单.下图是instagram app的截图: instagram <!DOCTYPE ...
- CSS中如何把Span标签设置为固定宽度
一.形如<span>ABC</span>独立行设置SPAN为固定宽度方法如下: span {width:60px; text-align:center; display:blo ...
- Video Cards
Video Cards time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...
- SEO策略与细节:细节决定成败
昨天展开seo探讨会.听了一场医疗界seo大神的讲座.收益匪浅今天讲他的演讲内容整理出来与大家分享.希望对医疗界的seo带来些帮助.站长们一起成长! 一.首页 1.元标签设置 标题:上海癫痫病医院哪家 ...
- oracle的row_number()和rownum
row_number() 函数和rownum的介绍: 1.row_number() 方法的格式: row_number()over([partition by col1] order by col2) ...
- Got Stucked in C++ Static Library Loading.. for some time
I used to load library using 1 single .dll file, so when I happen to do method calling between 2 pro ...
- this的应用
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- Lucene中的合并因子mergeFactor
mergeFactor 是用来决定segment该如何被addDocument()方法进行合并的. 当mergeFactor取比较小的值时,索引时所使用的内存较少 而且搜素未优化的速度会比较快.因此, ...
- mysql笔记4之数据操作
1修改数据 插入:insert into stu(id,name,age,addr) values(2,"李四",44,"重庆"); 2修改某一列 updata ...
- 动态规划3-------poj1050
首先还是对题目的意思进行说明,给出一个矩阵的数,然后求出一个子矩阵这个子矩阵包含的数的和是最大的. 首先对于题目进行转化,利用一个数组add进行存放临时数据,第一行存放原来数据的第一行,第二行存放 ...