游戏分析:
功能:小人(固定在屏幕右侧中央),飞镖(由小人发射),敌人(随机产生,从屏幕右方平移到左方)
人发射飞镖打敌人(啊啊啊啊~~~~~竟然没实现敌人碰到小人后,小人死亡~~~~~请原谅我是个新手,太粗糙了。。。。)
构架:就一个主场景MainScene,简单粗暴
游戏实现:场景和层:只有个主场景就没得说了,直接在主场景上添加了一个层,然后可触摸,添加触摸的事件监听
self.touchLayer_ = display.newColorLayer(cc.c4b(255,255,255,255))
:addTo(self)
self.touchLayer_:setTouchEnabled(true)
self.touchLayer_:addNodeEventListener(cc.NODE_TOUCH_EVENT,function (event)
<span style="white-space:pre"> </span>if event.name == "ended" then
<span style="white-space:pre"> </span> self:onTouchEnded(event.x, event.y)
<span style="white-space:pre"> </span>end
<span style="white-space:pre"> </span>return true
<span style="white-space:pre"> </span>end)
-----由于触摸结束要发射子弹,所以在onTouchEnded里要写子弹的生成和发射(后面详解)
小人:一个精灵,放到层上,没动做
敌人:由定时器每秒随机产生一个,然后移动到屏幕右方,注意需用数组将敌人存起来,以便分析与子弹有无碰撞
local scheduler = require(cc.PACKAGE_NAME ..".scheduler") --这句放在最开头,是导入定时器类(?为啥用..连接,暂时不清楚)
scheduler.scheduleGlobal(function()
self:addMonster()
end,1)-----定时器,每秒执行addMonster函数
</pre><pre name="code" class="plain">那么addMonster自然就是添加敌人了,这里注意两个地方:
transition.moveTo(monster, {x= -monster:getContentSize().width/2, y = actualY,
<span style="white-space:pre"> </span>time = actualDuration,
<span style="white-space:pre"> </span>onComplete=function (event)
<span style="white-space:pre"> </span>self.monsters_[event]= nil
<span style="white-space:pre"> </span>event:removeSelf()
<span style="white-space:pre"> </span>end
<span style="white-space:pre"> </span>})
----onComplete:移动结束后将怪物删除,就是说,如果移动出了屏幕,且还没有发生碰撞,那么就把它删了,否则1-占资源,2-判断碰撞是它还在数组里,getPosition时会get不到
--放入怪物数据,以便以后删除
--print(monster)
self.monsters_[monster] = monster --此处为何不是self.monsters_[#self.monsters+1] = monster 呢,因为上面的onComplete要用,参考学习笔记理解
子弹:点击屏幕射击,按点击方向移动一段时间。子弹是点击生成的所以生成方法放到onTouchEnded()里
--点击的位置在忍着右方才发射飞镖
local location = cc.p(x,y)
local projectile = display.newSprite("images/bullet.jpg"):addTo(self)
projectile:pos(20,display.height/2)
local px,py = projectile:getPosition()
local offset = cc.pSub(location,cc.p(px,py))
if (offset.x<=0)then
projectile:removeFromParent() --忍者左方则删除飞镖
return end
其余注意事项与怪物类似
碰撞检测:(由于没有用物理世界,所以碰撞检测就是遍历在屏幕内的飞镖和怪物,判断距离如果小于某个值则认为碰撞,两个都移除)
碰撞是要一直检测的,检测函数应该所以放在每帧刷新里
self:addNodeEventListener(cc.NODE_ENTER_FRAME_EVENT,handler(self,self.update)) --添加帧事件监听,每帧执行self.update
(为啥要用handler(self,self.update)而不是直接self.update呢?========mark一下不懂的问题)
self:scheduleUpdate() --需要打开帧定时器
源码看关联文章