入门级--《见缝插针》游戏开发

</pre>场景只用了一个MainScene,游戏的界面转换都是在层上实现的。<p></p><p></p><p>MainScene的内容:纯色背景一个:<span style="white-space:pre"> </span></p><pre name="code" class="html">	  display.newColorLayer(cc.c4b(225,225,225,225))
        :addTo(self,-1)
然后有一个层放置文字,标签等ui
self.backLayer = --display.newColorLayer(cc.c4b(225,225,225,225))
        display.newLayer()
<span style="white-space:pre">		</span>:addTo(self,1)
<span style="white-space:pre">	</span>--self.backLayer:setTouchEnabled(true)
<span style="white-space:pre">	</span>self.level = 1;
    cc.ui.UILabel.new({
            UILabelType = 2, text = "见缝插针", size = 64})
        :align(display.CENTER, display.cx, display.height-150)
        :addTo(self.backLayer)
  
    


     self.start_bt = cc.ui.UIPushButton.new("frame.jpg")
    <span style="white-space:pre">				</span>:setButtonLabel(cc.ui.UILabel.new({text = "关卡"..self.level,size = 32}))
    <span style="white-space:pre">				</span>:onButtonClicked(function ()
    <span style="white-space:pre">					</span>print("1")
                        self.gameLayer = GameLayer.new():addTo(self)--切换到游戏层
                        self.backLayer:removeFromParent()--把ui组件所在的层都移除
                    <span style="white-space:pre">		</span>end)
    <span style="white-space:pre">				</span>:align(display.CENTER, display.cx, display.height*2/3-40)
    <span style="white-space:pre">				</span>:addTo(self.backLayer)
uiPushButton的onButtonClicked函数来实现界面跳转
 


接下来就跳转到Gamelayer里了,这个就是游戏界面了,实现:首先用一个节点来放置需要转动的大球和小球,然后通过帧定时器让他们转动;另外这个层是可触摸的,点击屏幕则将小球添加到转动的节点上,并且将下方按序排列的待插入的小球整体上移。具体代码:

首先初始化函数实现两个功能:一个是触摸事件监听,一个是设置不同关卡的参数

self.levelTable = {
	[1] = {name ="第一关" , angle = 7 , startnum = 1 , waitnum = 10} ,
	[2] = {name ="第二关" , angle = 3 , startnum = 2 , waitnum = 10},
	[3] = {name ="第三关" , angle = 3.5, startnum = 3 , waitnum = 10},
	[4] = {name ="第四关" , angle = 3.5 , startnum = 4 , waitnum = 10} ,
	[5] = {name ="第五关" , angle = 3.5 , startnum = 4 , waitnum = 10} ,
	[6] = {name ="第六关" , angle = 4 , startnum = 5 , waitnum = 10} ,
	[7] = {name ="第七关" , angle = 4 , startnum = 5 , waitnum = 10} ,
	[8] = {name ="第八关" , angle = 4.5, startnum = 6 , waitnum = 10}
}
	
	self:addNodeEventListener(cc.NODE_TOUCH_EVENT,function ()
		print("add Small boal")
		self:addBoal()
	end)    --添加触摸事件监听(为什么touchnabale不在这里写呢,因为当从结果界面跳回游戏界面时,要从不可触摸改为可触摸,此时是不执行ctor的所以不在这里实现是否可触摸的设置)
	self:onStart(1)  --游戏初始化函数
然后是进入onstart函数,这个函数里实现了:首先生成空节点,用于把需要转动的元素都添加上来,实现转动,这个节点上有一个大球,以及游戏开始时就有的小球;设置可触摸;设置定时器(实现转动)

<span style="white-space:pre">function GameLayer:onStart(level)</span>   --传入进入游戏时的关卡数
<span style="white-space: pre;">	</span>self.level = level
	self.addboal_ ={}    --已填加到转动节点的小球
	self.waitboal_ ={}   --待添加的小球
	if self.turnNode then    --当从结果界面切回游戏界面时,需要将转动节点的内容清空
		--self.turnNode:removeFromParent()   --在callback里已经移除了:self:removeAllChildren()
		self.turnNode = nil
	end
	self.turnNode = display.newNode()   --转动节点
	:align(display.CENTER,display.cx, display.height*2/3+30)
	:addTo(self)
	
	--旋转角度
	self.angle =self.levelTable[self.level].angle
	--当前转过的角度
	self.turnangle=0
	--初始化小球数
	self.startnum = self.levelTable[self.level].startnum
	self.waitnum = self.levelTable[self.level].waitnum

	local bigboal = display.newSprite("boal1.png")
	:addTo(self.turnNode)
	print("大球位置:",bigboal:getPosition())
	local R = 150 +48


	for i =1 ,self.startnum do
		--计算初始化的小球平均分配
		local x = math.sin(math.rad(360/self.startnum*(i-1)))*R
		local y = math.cos(math.rad(360/self.startnum*(i-1)))*R
		local smboal = display.newSprite("s.png")
		:pos(x, y)
		:addTo(self.turnNode)
		self.addboal_[smboal]= smboal
		dump(self.addboal_)		
	end

	for i =1 ,self.waitnum do   --待插入的小球
		local x = display.cx
		local y = display.height/2-100-60*i
		local smboal = display.newSprite("s.png")
			:pos(x,y)
			:addTo(self) 
	

<pre name="code" class="html"><span style="font-family: Arial, Helvetica, sans-serif;"><span style="white-space:pre">				</span>--添加待插入小球上的数字</span>
local num = cc.ui.UILabel.new({text = self.waitnum-i+1,size= 30}):addTo(smboal) num:setPosition(-num:getContentSize().width/2+smboal:getContentSize().width/2,smboal:getContentSize().height/2)self.waitboal_[self.waitnum-i+1] = smboalend---设置可触摸self:setTouchEnabled(true)--设置定时器,需要在最开头添加 local scheduler = require(cc.PACKAGE_NAME .. ".scheduler")if self.timer thenscheduler.unscheduleGlobal(self.timer) ---停止上一关游戏时的定时器self.timer = nilendself.timer = scheduler.scheduleGlobal(function() 每0.05秒执行一次self:update()函数self:update() end,0.05)
 

end
接下来实现update函数

function GameLayer:update()
		
	if self.waitnum <= 0 then
		scheduler.unscheduleGlobal(self.timer)
		self:setTouchEnabled(false)
		local param = {}   ---传入结果界面需要的参数,是否成功,当前关卡,以及当从结果界面切回时调用的函数
		param.success = 1
		param.level = self.level 
		param.callback = handler(self, self.callback)
		local gameWin = gameWin.new(param)   --切入结果界面
		cc.Director:getInstance():getRunningScene():addChild(gameWin, 120)
		return
	end

	self.turnNode:rotateBy(0,self.angle)  --旋转大球和小球
	self.turnangle = math.mod(self.turnangle+self.angle,360)
end


实现触摸响应的函数

function GameLayer:addBoal()
	if self.waitnum <= 0 then
		-- scheduler.unscheduleGlobal(self.timer)
		self:setTouchEnabled(false)
		return
	end
	local x = math.sin(math.rad(self.turnangle )) * 200
	local y = math.cos(math.rad(self.turnangle + 180)) * 200
	local smboal = display.newSprite("s.png")
	:pos(x , y)
	:addTo(self.turnNode)
	--判断是否碰撞
	for k,p in pairs(self.addboal_) do
		local dx = p:getPositionX()-smboal:getPositionX()
		local dy = p:getPositionY()-smboal:getPositionY()
		local dist = math.sqrt(dx*dx+dy*dy)
		if dist<48 then
			--失败处理
			print("gameover")
			scheduler.unscheduleGlobal(self.timer)
			local param = {}
			param.success = 0
			param.level = self.level 
			param.callback = handler(self, self.callback)
			local gameWin = gameWin.new(param)
			cc.Director:getInstance():getRunningScene():addChild(gameWin, 120)
		end
	end
	self.addboal_[smboal] = smboal
	self.waitboal_[self.waitnum]:removeFromParent()
	self.waitboal_[self.waitnum]=nil
	self.waitnum= self.waitnum-1
	for i =1 ,self.waitnum do 
		local x = display.cx
		local y = display.height/2-100-60*i
		self.waitboal_[self.waitnum-i+1]:setPosition(x,y)
	end
	print(self.waitnum)

end

结果层实现:

local gameWin = class("gameWin", function (  )
	return display.newColorLayer(cc.c4b(225, 225, 225, 225))
end)

function gameWin:ctor(param)
    self.success = param.success
	self.callback = param.callback
	self.level = param.level
    local text1 = "text"
    local text2 = "text"
    if self.success ==1 then 
       text1 = "YOU WIN !!!"
       text2 = "下一关"
       self.level = self.level +1
    else
        text1 = "YOU LOSE !!!"
        text2 = "重玩本关"
    end
	cc.ui.UILabel.new({
            UILabelType = 2, text = text1, size = 64})
        :align(display.CENTER, display.cx, display.height-150)
        :addTo(self)

    

     self.start_bt = cc.ui.UIPushButton.new("frame.jpg")
    				:setButtonLabel(cc.ui.UILabel.new({UILableType = 2 ,text = text2,size = 32}))
    				:onButtonClicked(handler(self, self.btnCallBack))
    				:align(display.CENTER, display.cx, display.height*2/3-40)
    				:addTo(self)

    --self.start_bt:setButtonLabel(cc.ui.UILabel.new({
      --      UILabelType = 2, text = "下一关", size = 30 }))
      
end

function gameWin:btnCallBack()
	self.callback(self.level)
    self:removeFromParent()
end


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值