标签:
上章我们讲解了物体之间的碰撞检测,而本章开始,我们将讲解触摸事件的实现,同时,我们还将给 Player 加上血量条。
在开始之前,我们先来看看本节游戏的一些需求。
对于本教程游戏来说,我们的需求是在点击屏幕的时候,给 Player 一个向上的速度,让它能飞起来,否则它会受到重力的影响向下掉落。当掉落到地面上时,Player 会掉血,所以我们必须不停的点击屏幕以避免 Player 掉落到地上。在避免 Player 掉落的同时,我们还可以通过控制 Player 的飞起和降落来躲开障碍物和拾取心心。
游戏开始后 Player 精力充沛,有满满的血量,但当 Player 撞到障碍物和地面时,会根据碰撞到的类型来扣除不同点数的血量,当 Player 碰到心心时,可以增加一定的血量,并且会消除心心,消除的同时给它一个消除特效,这个特效用粒子系统来完成。Player 血量为0或地图跑外时,游戏结束。
需求分析清楚以后,下面我们就开始实现也上所描述的功能。
首先,我们来添加触摸事件。
触摸响应是游戏开发中一个很重要的模块,它是手游中玩家与游戏交互的主要途径。在 Quick 中,触摸事件机制是非常简单的,它允许任何一个 Node 接受触摸事件,而不局限于 Layer。
在我们的游戏中,我们需要在 Player 开始下落的时候启动触摸事件的响应,所以,我们将在 playerFlyToScene 函数的 startDrop 方法中启动触摸事件的响应,相关代码如下所示:
local function startDrop()
self.player:getPhysicsBody():setGravityEnable(true)
self.player:drop()
self.backgroundLayer:startGame()
self.backgroundLayer:addNodeEventListener(cc.NODE_TOUCH_EVENT, function(event)
return self:onTouch(event.name, event.x, event.y)
end)
self.backgroundLayer:setTouchEnabled(true)
end
这里,我们给 self.backgroundLayer 背景层添加了触摸事件的监听,其中 addNodeEventListener 方法用于注册系统事件的监听,如上所诉的触摸事件,以及帧事件、按键事件等等。
可能你会问:为什么是给 self.backgroundLayer 添加触摸事件的监听呢,为什么不是 self 场景自身,或者 Player?这里我们需要解释一下的是:触摸响应不能直接给 scene 添加事件监听,而如果只给 Player 添加触摸监听,那么我们只能在 Player 这个很小的范围内响应到触摸事件,所以我们需要用一个层来完成。在游戏中又只创建了一个背景层,所以我们就将就着把触摸事件的监听添加到它身上。当然,你也可以新建一个层来添加触摸监听,这里我们就不那么讲究了!
setTouchEnabled 方法用于开启触摸功能,如果 setTouchEnabled(false),那么背景层将不能接受到触摸响应。
另外,onTouch 方法是触摸事件回调,其定义如下:
function GameScene:onTouch(event, x, y)
if event == "began" then
self.player:flying()
self.player:getPhysicsBody():setVelocity(cc.p(0, 98))
return true
-- elseif event == "moved" then
elseif event == "ended" then
self.player:drop()
-- else event == "cancelled" then
end
end
因为我们要实现点击屏幕就给 Player 一个向上的速度,不点的时候 Player 向下掉落。所以,这里我们只需在触摸开始时,让 Player 处于飞行状态且给它一个方向向上的速度(0, 98);在触摸结束时,让 Player 下落就可以了。而不必去考虑在触摸移动 “moved” 和触摸取消 “cancelled” 时的状态。
还有一点要注意的是:在触摸开始时,必须返回 true,不然之后的 “ended” 等消息将不会被响应。
接下来我们来给 Player 添加血量条,这可以用引擎中已经封装好的进度条(ProgressTimer)来实现。
以下是在 Player 中添加的相关代码,我们先来看看。
function Player:createProgress()
self.blood = 100 -- 1
local progressbg = display.newSprite("#progress1.png") -- 2
self.fill = display.newProgressTimer("#progress2.png", display.PROGRESS_TIMER_BAR) -- 3
self.fill:setMidpoint(cc.p(0, 0.5)) -- 4
self.fill:setBarChangeRate(cc.p(1.0, 0)) -- 5
-- 6
self.fill:setPosition(progressbg:getContentSize().width/2, progressbg:getContentSize().height/2)
progressbg:addChild(self.fill)
self.fill:setPercentage(self.blood) -- 7
-- 8
progressbg:setAnchorPoint(cc.p(0, 1))
self:getParent():addChild(progressbg)
progressbg:setPosition(cc.p(display.left, display.top))
end
function Player:setProPercentage(Percentage)
self.fill:setPercentage(Percentage) -- 9
end
其中 createProgress 方法的作用是添加一个进度条,setProPercentage 方法的作用是设置进度条的百分比。下面我们一一讲解下代码:
好了,以上创建血条的代码段应该讲解的够清楚了吧,接下来我们需要做的就是在合适的地方调用它。这里我们在 GameScene 中调用:
self.player = Player.new()
self.player:setPosition(-20, display.height * 2 / 3)
self:addChild(self.player)
self:playerFlyToScene()
self.player:createProgress() -- here
此刻,运行游戏,我们就可以看到如下的效果了。
好了,本章就到处为止,下章将是我们教程的最后一章,大家期待的完整代码将放出,敬请期待吧。
转载请注明出自:http://shannn.com/archives/437
Quick-Cocos2d-x初学者游戏教程(十二) ------------ 触摸事件
标签:
原文地址:http://www.cnblogs.com/dudu580231/p/4807557.html