入门级--《飞镖忍者》游戏分析总结

游戏分析:

        功能:小人(固定在屏幕右侧中央),飞镖(由小人发射),敌人(随机产生,从屏幕右方平移到左方)

                   人发射飞镖打敌人(啊啊啊啊~~~~~竟然没实现敌人碰到小人后,小人死亡~~~~~请原谅我是个新手,太粗糙了。。。。)

构架:就一个主场景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()  --需要打开帧定时器

源码看关联文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值