先介绍一下这个小游戏,已经上线app store 名字:见缝插针 英文名字:aazz
玩法介绍可以下载看看哦
1,逻辑实现
主场景的 ctor 方法
fun MainScene:ctor(levelIndex)
–每次进入场景的时候把使用的参数 都重置一下
–为什么要重置,好像不重置的时候 切换场景快一点 会有一些 小bug
self:c_clean()
– 失败的文字 开始不显示
self.failLabel = ui.newBMFontLabel({
text = “Failed!”,
font = “white.fnt”,
x = display.cx,
y = display.cy,
align = ui.TEXT_ALIGEN_CENTER,
})
self:addChild(self.failLabel, 6)
self.failLabel:setColor(ccc3(252,129, 131))
self.failLabel:setScale(0.7)
self.failLabel:setOpacity(0)
-- 进入游戏 显示title 第几关
self.titleLabel = ui.newBMFontLabel({
text = "Level "…levelIndex,
font = “blue.fnt”,
x = display.cx,
y = display.top + 50,
align = ui.TEXT_ALIGEN_CENTER,
})
self:addChild(self.titleLabel, 6)
self.titleLabel:setVisible(false)
-- title 稍后做了个简单动画
self:performWithDelay(function()
self.titleLabel:setVisible(true)
local seq = transition.sequence({
CCMoveBy:create(0.1,ccp(0,-120)),
CCMoveBy:create(0.2,ccp(0,20))
})
self.titleLabel:runAction(seq)
end,1.0)
-- 这个是获取某一关的数据 1000关+ 都配置在Levels.lua文件里面 以下是第一关配置的数据 有详细解释哦
-- ={
-- --=1,--关卡--
-- speed1=0.8,--初始角速度
-- speed2=0.8,--变速后角速度(如果不变填写相同的)
-- time=0,--变速时间周期(单位秒,填写0表示不变速)
-- startNumber=3,--默认小球数量(夹角 = 360/数量)
-- myNumber=3,--目标小球数量
-- },
self.peizhiData = Levels.get(levelIndex)
sudu = self.peizhiData.speed1
sudu2 = self.peizhiData.speed2
time = self.peizhiData.time * 60
startNumberLevel = self.peizhiData.startNumber
myLevelNumber = self.peizhiData.myNumber
–真正的 角速度
self.realSudu = sudu
–计时间
self.jishiTime = 0
– 场景内加入一个 自定义颜色的layer
display.newColorLayer(ccc4(255, 250, 215, 255)):addTo(self)
--定义一个层 所有的 自由转动都在这个层上
self.contentLayer = display.newLayer()
self.contentLayer:setPosition(ccp(0,100))
self:addChild(self.contentLayer,2)
--再定一个层 这个层放置所有 还没有插入的球 每插入一个 向上移动一点
self.contentLayer2 = display.newLayer()
self:addChild(self.contentLayer2,1)
self.contentLayer2:setPosition(ccp(0,100))
--定义一个半透明的 背景层
self.bgLayer = display.newColorLayer(ccc4(255, 250, 215, 210)):addTo(self,5)
self.bgLayer:setVisible(false)
--self.tableArray 保存转动中的球
self.tableArray = {}
--保存 没有插进去的球
self.ballDown = {}
--添加 资源
self:addResours()
--当前 layer 角度
self.angleDu = 0.0
-- 注册触摸事件
self.contentLayer:setTouchMode(cc.TOUCH_MODE_ONE_BY_ONE)
self.contentLayer:addNodeEventListener(cc.NODE_TOUCH_EVENT, function(event)
return self:onTouch(event.name, event.x,event.y)
end)
self.contentLayer:setTouchEnabled(true)
– 注册帧事件 注册之后一定要 启用 才生效
self:addNodeEventListener(cc.NODE_ENTER_FRAME_EVENT, function(dt)
return self:updateMy()
end)
–开启 update 每1/60 s 执行一次self:updateMy()
self:scheduleUpdate()
self.gameOver = false
–下面是 静态布局
fun MainScene:addResours()
–中间的 大圆球
self.circleAll = display.newSprite(“circle.png”)
self.circleAll:setPosition(ccp(display.cx,display.cy))
self.contentLayer:addChild(self.circleAll,2)
–中间的现实 当前还剩余多少个球没有插进去
self.nowNumberLabel = ui.newBMFontLabel({
text = myLevelNumber,
font = “white.fnt”,
x = display.cx,
y = display.cy + 100,
align = ui.TEXT_ALIGEN_CENTER,
})
self:addChild(self.nowNumberLabel, 3)
-- 预先放置 配置好的球
-- 比如一开始 配置 就有5个球插上了 那么计算出他们各自的位置
for i=1,startNumberLevel do
–r 是小球的半径
local xx = math.sin(math.rad((i - 1) * 360 / startNumberLevel)) * r
local yy = math.cos(math.rad((i - 1) * 360 / startNumberLevel)) * r
-- 这个是打球和小球之间连接的那条线 也是一个精灵
local sp0 = display.newSprite("steak.png")
--计算出位置
sp0:setPosition(ccp(display.cx + xx * 4 /3,display.cy + yy * 4 /3))
–计算出 角度
sp0:setRotation((i - 1) * 360 / startNumberLevel)
self.contentLayer:addChild(sp0,1)
–小球
local ball1 = display.newSprite(“lCircle.png”)
ball1:setPosition(ccp(display.cx + xx * 2,display.cy + yy * 2))
self.contentLayer:addChild(ball1,2)
–把它们 全放入table
self.tableArray#self.tableArray + 1] = ball1
end
–在下面依次排列所有的 未插入的小球
for i=1,myLevelNumber do
local balldd = display.newSprite(“lCircle.png”)
balldd:setPosition(ccp(display.cx,display.cy - r * 2 - (myLevelNumber + 1 - i) * rLittleBall * 3.0))
self.contentLayer2:addChild(balldd,3)
balldd.number = i
–小球上的 数字
local setLabel = ui.newBMFontLabel({
text = i,
font = “white.fnt”,
x = balldd:getContentSize().width/2,
y = balldd:getContentSize().height/2,
align = ui.TEXT_ALIGEN_CENTER,
})
setLabel:setScale(0.36)
balldd:addChild(setLabel, 2)
--保存所有未插入的小球
self.ballDown#self.ballDown + 1] = balldd
end
–英文不好 见谅啊。 虚线就是红色那个虚线 半透明
local xuxian = display.newSprite(“xuxian.png”,display.cx,display.cy - r - rLittleBall * 3.0)
xuxian:setAnchorPoint(ccp(0.5, 0))
xuxian:setOpacity(100)
self:addChild(xuxian,1)
–失败后 隐藏的按钮
self.backMenu = cc.ui.UIPushButton.new(“menu.png”, {scale9 = false})
:onButtonPressed(function(event)
event.target:setScale(1.1)
end)
:onButtonRelease(function(event)
event.target:setScale(1.0)
end)
:onButtonClicked(function(event)
app:playSound(GAME_SFX.button)
self:donghuaXiaoshi()
self:performWithDelay(function()
app:goMenuScene()
end,1.0)
end)
:pos(-display.cx * 3, display.cy - 200)
:addTo(self,6)
--重新开始的按钮
self.refreshMenu = cc.ui.UIPushButton.new("refresh.png", {scale9 = false})
:onButtonPressed(function(event)
event.target:setScale(1.1)
end)
:onButtonRelease(function(event)
event.target:setScale(1.0)
end)
:onButtonClicked(function(event)
app:playSound(GAME_SFX.button)
self:donghuaXiaoshi()
self:performWithDelay(function()
app:goGameScene()
end,1.0)
end)
:pos(display.cx * 3, display.cy - 200)
:addTo(self,6)
这样的话 整个游戏界面 是出来了。
