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框架的了解,我们可以参考\ ...
随机推荐
- git clone分支
有时git clone下来会出现很多branch,更麻烦的是如果主分支没代码那你就只能看到.git目录了.如下面的这个: $ git clonegit://gitorious.org/android- ...
- C: Run a System Command and Get Output? 在C程序中调用工具,并且得到结果。
现在在做一个WIFI API相关的库,这样就可以让其他的人管理WIFI. 在调用API的时候要回复SHELL打印的信息,比如说搜索热点,而且不在SHELL中打印出来.然后把信息返回给调用API的程序. ...
- kill -0
http://unix.stackexchange.com/questions/169898/what-does-kill-0-do 检查有没有权限杀他
- springAOP 的pointcut
<bean id="amqFilter" class="com.xxx.hotel.base.aspectj.AmQConsumerFilter"/> ...
- navicat连接oracle时发现 ORA-12737 set CHS16GBK
oracle安装目录下找到目录:\product\11.2.0\dbhome_1\BIN, 将箭头标注的三个文件(截图中为navicat中的目录,已经测试成功,亲们可以参考)从目录中拷贝纸navica ...
- weak和assign区别
weak比assign多了一个功能,当对象消失后自动把指针变成nil haofanazenmeban[4002:406590] controller:<SecondViewController: ...
- c语言scanf详解
函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]);scanf()函数是通用终端格式化输入函数,它从标准输入设备(键 ...
- java基本输入类型数据System.out.println()或System.out.print()
- haxe 配置
安装所有类库: 命令提示符 haxelib install 类库名 如:haxelib install openfl 配置安卓: 命令提示符 haxelib run openfl setup andr ...
- RedHat Enterprise Linux AS4&5 安装gcc过程
三.Gcc安装方法(redhat 4): 一.安装步骤 1.使用which gcc命令查看gcc是否安装安装 2.如若没有安装则下载如下安装包,所需安装包如下 一共需要拷贝以下五个安装包: binut ...