lua蛮小巧的,比用c++来做简单,c++内存管理,字符串操作都太麻烦,这点脚本就是好用啊。
但cocos配合lua,编译模拟器时也不好,要编译好久,而且占用空间几个g几个g地增长,需要装vs2012以上的版本,怎么能这样呢,哥的老电脑怎么跑啊,还有就是cocos搭配lua现在的资料太少,不好学啊。
现在开始做游戏吧
在建立cocos游戏项目时,它会自己生成一个游戏,《杀死蚂蚁》,我就不用自带的游戏代码了,当做参考,自己动手实现游戏逻辑。
有两个场景
第一个场景中点击play按钮后,进入第二个场景
第一个场景主要代码
local function main()
local sceneGame = cc.Scene:create()
local layer = createdInGameLayer()
sceneGame:addChild(layer);
local label = cc.Label:createWithSystemFont("Hello Cocos!","Gadugi",25)
label:setPosition(500,100)
label:setVisible(true)
label:setTextColor(cc.c4b(0,0,255,255))
layer:addChild(label)
layer:setTouchEnabled(true)
--ccp replaced by cc.p(x,y)
---ccc4 replaced by cc.c4b
local bgObj = display.newSprite("MainSceneBg.jpg")
bgObj:move(display.center):addTo(sceneGame)
local playBt = display.newSprite("PlayButton.png")
playBt:setScale(0.5,0.5)
playBt:move(display.center):addTo(bgObj)
playBt:setPositionY(100)
local function onTouchBegin(touch, x, y)
local rect = playBt:getBoundingBox()
if containsPoint(rect, cc.p(x, y)) then
switchScene()
end
return false
end
-- (onTouchBegin,true,0,false)它的回调函数的第二个参数是个table,table[1], table[2]是坐标
layer:registerScriptTouchHandler(onTouchBegin);
cc.Director:getInstance():replaceScene(sceneGame)
end
--local status, msg = xpcall(main, __G__TRACKBACK__)
--if not status then
-- error(msg)
--end
main()
还需要这些代码:
cc.FileUtils:getInstance():setPopupNotify(false)
cc.FileUtils:getInstance():addSearchPath("src/")
cc.FileUtils:getInstance():addSearchPath("res/")
require "config"
require "cocos.init"
主要知识点:
1.显示场景
local scene = cc.Scene:create()
cc.Director:getInstance():replaceScene(scene)
2.显示图片
local layer = createdInGameLayer()
sceneGame:addChild(layer);
local bgObj = display.newSprite("MainSceneBg.jpg")
bgObj:move(display.center):addTo(sceneGame)
local playBt = display.newSprite("PlayButton.png")
playBt:setScale(0.5,0.5)
playBt:move(display.center):addTo(bgObj)
playBt:setPositionY(100)
local bg = cc.Sprite:create("PlaySceneBg.jpg")
bg:setPosition(cc.p(566,320))
layer:addChild(bg)
3.处理点击事件
layer:setTouchEnabled(true)
local function onTouchBegin(touch, x, y)
local rect = playBt:getBoundingBox()
if containsPoint(rect, cc.p(x, y)) then
switchScene()
end
return false
end
-- (onTouchBegin,true,0,false)它的回调函数的第二个参数是个table,table[1], table[2]是坐标
layer:registerScriptTouchHandler(onTouchBegin);
第二个场景代码:
local function switchScene()
local scene = cc.Scene:create()
local layer = cc.Layer:create()
playScene = scene
playLayer = layer
scene:addChild(layer)
layer:setTouchEnabled(true)
local bg = cc.Sprite:create("PlaySceneBg.jpg")
bg:setPosition(cc.p(566,320))
layer:addChild(bg)
local filename = TEXTURE_FILENAME_ANT
local texture = display.loadImage(filename)
local frameWidth = texture:getPixelsWide() / 3
local frameHeight = texture:getPixelsHigh()
local frames = {}
for i = 0, 1 do
local frame = display.newSpriteFrame(texture, cc.rect(frameWidth * i, 0, frameWidth, frameHeight))
frames[#frames + 1] = frame
end
-- create animation
local animation = display.newAnimation(frames, 0.15)
-- caching animation
display.setAnimationCache(filename, animation)
cc.Director:getInstance():getScheduler():scheduleScriptFunc(tickUpdate,0,false)
playLayer:registerScriptTouchHandler(
function(event, x, y)
--移动
--原生接口self.sp:runAction(cc.MoveTo:create(5, cc.p(display.cx, display.cy)))
--antSprite:removeSelf()
--怎么停止动画???
for k,v in pairs(bugs) do
if isTouchedSprite(v, x, y) then
local deadBug = cc.Sprite:create(filename, cc.rect(frameWidth * 2, 0, frameWidth, frameHeight))
deadBug:setPosition(cc.p(v:getPositionX(), v:getPositionY()))
v:removeSelf()
bugs[v] = nil
layer:addChild(deadBug)
audio.playSound("BugDead.wav")
transition.fadeOut(deadBug, {time=1})
end
end
return false
end
)
cc.Director:getInstance():replaceScene(scene)
end
计时器
local function tickUpdate(dt)
lastTime = lastTime + dt
if lastTime > 1 then
--添加精灵
lastTime = 0
addBug()
end
checkBugHole()
end
检查蚂蚁是否进洞
local function checkBugHole()
for _,v in pairs(bugs) do
local point = cc.p(v:getPositionX(), v:getPositionY())
local distance = (point.x - holePoint.x)*(point.x - holePoint.x)
+ (point.y - holePoint.y)*(point.y - holePoint.y)
if distance < 10 then
audio.playSound("BugEnterHole.wav")
v:removeSelf()
bugs[v] = nil
end
end
end
添加蚂蚁
--添加精灵
local function addBug()
local antSprite = cc.Sprite:create(TEXTURE_FILENAME_ANT, cc.rect(0,0,frameWidth,frameHeight))
local x,y=nil
if math.random(1,2) == 1 then
x = math.random(CLIENT_WIDTH)
if math.random(1,2) == 1 then
y = CLIENT_HEIGHT
else
y = 0
end
else
y = math.random(CLIENT_HEIGHT)
if math.random(1,2) == 1 then
x = CLIENT_WIDTH
else
x = 0
end
end
--x = holePoint.x
--y = 0
antSprite:setPosition(cc.p(x,y))
playLayer:addChild(antSprite)
bugs[antSprite] = antSprite
local angleDelta = nil
if x == holePoint.x then
if y > -1 and y < 1 then
angleDelta = 90
else
angleDelta = -90
end
else
angleDelta = math.atan((y-holePoint.y)/(x-holePoint.x))
angleDelta = angleDelta * 180 / 3.14159
end
--圆周率是多少???
if x > CLIENT_WIDTH / 2 then
if angleDelta > 0 then
angleDelta = angleDelta - 180
else
angleDelta = angleDelta + 180
end
end
transition.rotateTo(antSprite,{time = 0.1, rotation = -angleDelta})
transition.moveTo(antSprite, {time = 5, x = holePoint.x, y = holePoint.y})
antSprite:playAnimationForever(display.getAnimationCache(TEXTURE_FILENAME_ANT))
end
prite是否被点击到了
--sprite是否被点击到了
local function isTouchedSprite(sprite, x, y)
local position = cc.p(sprite:getPositionX(), sprite:getPositionY())
local radio = 30
return (position.x - x) * (position.x - x) + (position.y - y) * (position.y - y) < radio * radio
end
local function containsPoint(rect, point)
return point.x >= rect.x and point.x <= rect.x + rect.width
and point.y >= rect.y and point.y <= rect.y + rect.height
end