第一个cocos2dx-lua游戏--蚂蚁进洞

来源:互联网 发布:遗传算法编码方式 编辑:程序博客网 时间:2024/06/01 08:01


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)--endmain()
还需要这些代码:
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 = sceneplayLayer = layerscene: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_ANTlocal 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) doif isTouchedSprite(v, x, y) thenlocal deadBug = cc.Sprite:create(filename, cc.rect(frameWidth * 2, 0, frameWidth, frameHeight))deadBug:setPosition(cc.p(v:getPositionX(), v:getPositionY()))v:removeSelf()bugs[v] = nillayer:addChild(deadBug)audio.playSound("BugDead.wav")transition.fadeOut(deadBug, {time=1})endendreturn false   end)cc.Director:getInstance():replaceScene(scene)end

计时器

local function tickUpdate(dt)lastTime = lastTime + dtif lastTime > 1 then--添加精灵lastTime = 0addBug()endcheckBugHole()end

检查蚂蚁是否进洞

local function checkBugHole()for _,v in pairs(bugs) dolocal 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 thenaudio.playSound("BugEnterHole.wav")v:removeSelf()bugs[v] = nilendendend
添加蚂蚁

--添加精灵local function addBug()local antSprite = cc.Sprite:create(TEXTURE_FILENAME_ANT, cc.rect(0,0,frameWidth,frameHeight))local x,y=nilif math.random(1,2) == 1 thenx = math.random(CLIENT_WIDTH)if math.random(1,2) == 1 theny = CLIENT_HEIGHTelsey = 0endelsey = math.random(CLIENT_HEIGHT)if math.random(1,2) == 1 thenx = CLIENT_WIDTHelsex = 0endend--x = holePoint.x--y = 0antSprite:setPosition(cc.p(x,y))playLayer:addChild(antSprite)bugs[antSprite] = antSpritelocal angleDelta = nilif x == holePoint.x thenif y > -1 and y < 1 thenangleDelta = 90elseangleDelta = -90endelseangleDelta = math.atan((y-holePoint.y)/(x-holePoint.x))angleDelta = angleDelta * 180 / 3.14159end--圆周率是多少???if x > CLIENT_WIDTH / 2 thenif angleDelta > 0 thenangleDelta = angleDelta - 180elseangleDelta = angleDelta + 180endendtransition.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 = 30return (position.x - x) * (position.x - x) + (position.y - y) * (position.y - y) < radio * radioend

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

0 0