픽업 Cocos2d-x로 미니 게임 상태 변화 구현

목차



1 소개
2 초기화부터 게임 오버 및 재개
4 향후 예정

소개



본 기사는, cocos2d-x 및 Cocos Code IDE를 도입해, 그림을 표시하거나 실기로 실행해 보거나 한 사람으로, 앞으로 게임의 상태 변화를 구현하고 싶은 사람을 위한, 각서입니다. 상태 정의에는 Lua의 배열 같은 것을 사용해, 실제로 터치 이벤트로 게임 오버, 재시작으로 그림의 위치를 ​​되돌린다고 하는 처리를 설명합니다.

초기화부터 게임 오버 및 재개



아래 코드를 실행하면 터치 한 점으로 그림이 이동하여 배경 음악이 멈추고 게임 오버가됩니다. 게임 오버가 나타난 후 터치하면 그림이 초기 위치로 돌아가고 배경 음악이 재생됩니다.

GameScene.lua

local MUSIC_BGM         = "background.mp3"
local EFFECT_GAMEOVER   = "effect1.wav"

-- a)ゲーム状態の定義
local State = {Init = 1, Run = 2, Pause = 3, PreGameOver = 4, GameOver = 5}

local GameScene = class("GameScene",function()
    return cc.Scene:create()
end)

function GameScene.create()
    local scene = GameScene.new()

    scene:addChild(scene:createLayer())

    return scene
end


function GameScene:ctor()
    self.visibleSize = cc.Director:getInstance():getVisibleSize()
    self.origin = cc.Director:getInstance():getVisibleOrigin()
    self.schedulerID = nil

    -- b)ゲーム状態を初期状態にする
    self.state = State.Init
end

function GameScene:playBgMusic()
    -- BGMを再生
    local bgMusicPath = cc.FileUtils:getInstance():fullPathForFilename(MUSIC_BGM) 
    cc.SimpleAudioEngine:getInstance():playMusic(bgMusicPath, true)
    -- 効果音を先読み
    local effectPath = cc.FileUtils:getInstance():fullPathForFilename(EFFECT_GAMEOVER)
    cc.SimpleAudioEngine:getInstance():preloadEffect(effectPath)
end

function GameScene:createLayer()
    local layer = cc.Layer:create()
    -- ここから初期化開始

    -- 背景
    local sprite_background = cc.Sprite:create("farm.jpg")
    sprite_background:setPosition(self.visibleSize.width/2, self.visibleSize.height/2)
    sprite_background:setScale(1.2)
    layer:addChild(sprite_background)

    -- 絵
    local sprite = cc.Sprite:create("land.png")
    sprite:setPosition(100,100)
    layer:addChild(sprite)

    -- ゲームオーバー表示
    local label_gameover = cc.Label:createWithTTF("GAME OVER","fonts/Marker Felt.ttf", 55)
    label_gameover:setPosition(self.visibleSize.width/2,self.visibleSize.height/2)
    label_gameover:setColor(cc.c3b(250, 250, 250))
    label_gameover:enableShadow()
    label_gameover:setOpacity(0)
    layer:addChild(label_gameover)

    -- タッチ開始時に呼ばれる
    local function onTouchBegan(touch, event)
        local location = touch:getLocation()

        if self.state == State.Run then
        -- ゲームオーバーにする処理
            --DEBUG 絵の位置をタッチ位置に変更
            sprite:setPosition(location)

            -- BGMを止める
            cc.SimpleAudioEngine:getInstance():stopMusic()

            -- ゲーム終了通知音を鳴らす
            local effectPath = cc.FileUtils:getInstance():fullPathForFilename(EFFECT_GAMEOVER)
            cc.SimpleAudioEngine:getInstance():playEffect(effectPath)

            -- d)ゲーム状態をゲーム終了前状態に変更
            self.state = State.PreGameOver

            -- ゲームオーバ表示をフェードインした後ゲームオーバー状態に変更
            local fade = cc.FadeIn:create(2)
            local function funcToGameOver(node)
                -- e)ゲーム状態をゲームオーバーに変更
                self.state = State.GameOver
            end
            local callFunc = cc.CallFunc:create(funcToGameOver)
            label_gameover:runAction(cc.Sequence:create(fade,callFunc))
        end

        if self.state == State.GameOver then
        -- ゲームオーバーになった後ゲームを再開する処理

            -- BGMを再生
            local bgMusicPath = cc.FileUtils:getInstance():fullPathForFilename(MUSIC_BGM) 
            cc.SimpleAudioEngine:getInstance():playMusic(bgMusicPath, true)

            -- ゲームオーバー表示をフェードアウト
            label_gameover:runAction(cc.FadeOut:create(2))

            -- 絵の位置を初期化
            sprite:setPosition(100,100)

            -- f)ゲーム状態をランへ変更
            self.state = State.Run
        end

        return true  -- trueを返す
    end

    -- タッチイベントで呼ばれる関数を登録し、このレイヤーでのタッチイベント取得を有効化
    local listener = cc.EventListenerTouchOneByOne:create()
    listener:registerScriptHandler(onTouchBegan,cc.Handler.EVENT_TOUCH_BEGAN )
    local eventDispatcher = layer:getEventDispatcher()
    eventDispatcher:addEventListenerWithSceneGraphPriority(listener, layer)

    -- c)ゲーム状態をランに変更
    self.state = State.Run

    return layer
end

return GameScene

a) 게임의 상태를 정의, Lua의 연상 배열(정의 이름과 값이 조합된 배열)을 사용할 수 있습니다.
b) 변수 self.state에 Init 설정
c) 같은 변수에 Run 설정
d) 동일한 변수에 PreGameOver 설정
e) 동일한 변수에 GameOver 설정
f) 동일한 변수에 RUN 설정





향후 예정



파라파라 그림을 움직인다. 애니메이션에 대해 설명합니다.

좋은 웹페이지 즐겨찾기