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框架的了解,我们可以参考\ ...
随机推荐
- jarsigner
开发者应用认领说明 Flyme应用中心应用认领,采用Android的apk安装包签名机制来完成.如果你不清楚签名是什么,请联系开发人员协助您. 在Android平台发布应用程序之前,必须经过一个签名流 ...
- sql server统计字段的值在某些范围内中的个数
有一张表test如下: create table test ( id ,) primary key, num int ) 插入数据: ); ); ); ); ); ); ); ); ); ); ); ...
- robot framework -记录关键字
1.set value if (当条件满足时,进行变量赋值) 2.focus (将焦点定在制定的元素) 3.win close +title(关闭制定title) 4.get list items ...
- 转:lr_eval_string函数的用法解析
在LR中,C的变量和LR的参数是不一样的. 任何C的变量都不能被LR的函数直接调用. 应该用lr_eval_string来取值. 比如{NewParam}(LR中参数化的变量)直接用这个引用是没有问题 ...
- 用cas来实现php的单点登陆
最近项目中需要做单点登录,客户端包含Java.ruby和PHP,java有几个应用程序,php是discuz+supesite+ucenter,配置步骤如下: 1.cas服务端:下载地址:http:/ ...
- L8,the best and the worst
expressions: enter for 报名参加,只有作为参加的意思的时候才会用for enter the room进入房间 a little prize for the worst garde ...
- maven 教程一 入门
摘要: (1)maven是项目管理工具,类似makefile.主要的生命阶段有 validate:验证工程是否正确,所有需要的资源是否可用. compile:编译项目的源代码. test:使用 ...
- Memcached函数整理
public bool Memcached::add ( string $key , mixed $value [, int $expiration ] ) 向key中添加值,如果key存在,返回f ...
- 利用transform制作幻灯片
html代码 <html><head></head><body><div class='hpic'> <ul style=" ...
- SQL Server2008数据库中删除用户,提示数据库主体在该数据库中拥有 架构,无法删除
一个数据库,运行在SQL Server 2008下,数据库用户无法删除,在删除时提示“数据库主体在该数据库中拥有架构,无法删除”.原因很简单,就是由于此用户在数据库中拥有某些架构的所有权,将相关架构的 ...