육지 Cocos2d-x에서 물리 엔진 사용 시작

목차



1 소개
2 물리 엔진 활성화
3 물체를 떨어뜨리다
4 벽 만들기
5 향후 예정

소개



본 기사는 cocos2d-x 및 Cocos Code IDE를 도입하고, 그림(스프라이트)을 표시하고, 터치에 반응하여 그림을 움직이고, BGM이나 효과음을 울린 사람으로, 자신이 만들고 싶은 것은 물체가 중력에 따라 낙하하는 게임이라는 사람을 위한 각서입니다. cocos2-dx에서는 chipmunk와 Box2d, 두 개의 물리 엔진을 사용할 수 있지만 더 쉽게 사용할 수있는 chipmunk에 대해 설명합니다. 흐름으로 물리 엔진을 활성화하고, 다음에 떨어지는 물체를 추가하고, 마지막으로 그 낙하물을 받아들이는 벽을 추가합니다.

물리 엔진 사용



아래 코드를 사용하여 설명을 진행합니다.
두 번째 줄 cc.Scene:createWithPhysics()는 물리 엔진 chipmunk를이 GameScene.lua 장면에 적용합니다.

GameScene.lua
local GameScene = class("GameScene",function()
    -- l)物理エンジンをこの場面に対し有効化
    return cc.Scene:createWithPhysics()
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
end

function GameScene:playBgMusic()
    -- BGMを再生する
    local bgMusicPath = cc.FileUtils:getInstance():fullPathForFilename("background.mp3") 
    cc.SimpleAudioEngine:getInstance():playMusic(bgMusicPath, true)
    -- 効果音を先に読み込んでおく
    local effectPath = cc.FileUtils:getInstance():fullPathForFilename("effect1.wav")
    cc.SimpleAudioEngine:getInstance():preloadEffect(effectPath)
end

-- create layer
function GameScene:createLayer()
    local layer = cc.Layer:create()

    -- b)タッチイベントで呼ばれる関数
    local function onTouchBegan(touch, event)
        local location = touch:getLocation()

        -- 絵(スプライト)を追加
        local sprite = cc.Sprite:create("land.png")
        sprite:setPosition(location)
        layer:addChild(sprite)

        return true
    end

    -- c)タッチイベントで呼ばれる関数を登録
    local listener = cc.EventListenerTouchOneByOne:create()
    listener:registerScriptHandler(onTouchBegan, cc.Handler.EVENT_TOUCH_BEGAN )

    -- d)このレイヤーでのタッチイベント取得を有効化
    local eventDispatcher = layer:getEventDispatcher()
    eventDispatcher:addEventListenerWithSceneGraphPriority(listener, layer)

    return layer
end

return GameScene

위의 코드 그대로 실행하면 터치한 곳에 그림(스프라이트)이 추가되는 것만으로 낙하하지 않습니다.



물체를 떨어뜨리다



그럼 b) 안에 아래의 m)을 추기합니다.

GameScene.lua
...
    -- b)タッチイベントで呼ばれる関数
    local function onTouchBegan(touch, event)
        local location = touch:getLocation()

        -- 絵(スプライト)を追加
        local sprite = cc.Sprite:create("land.png")
        sprite:setPosition(location)
        layer:addChild(sprite)

        -- m)物体を作成し絵(スプライト)に取り付ける
        local physicsBody = cc.PhysicsBody:createBox(sprite:getContentSize())
        sprite:setPhysicsBody(physicsBody)

        return true
    end
...

m)에서 그림의 크기에 맞게 사각형 물체를 만들고 그 물체를 그림 (스프라이트)에 부착하고 있습니다. 변경 사항을 저장하고 실행하고 화면을 클릭하면 그림이 떨어지기 시작합니다. 또한 떨어지는 동안 서로 충돌합니다.



떨어지는 물체는 그대로 화면 밖으로 떨어집니다. 다음은 화면을 벽으로 둘러 쌉니다.

벽 만들기



createLayer 함수에 아래 n), l)을 추가합니다.

GameScene.lua
...
function GameScene:createLayer()
    local layer = cc.Layer:create()

    -- n)ゲーム画面の中央を基点とする接続点を作る
    local node = cc.Node:create()
    node:setAnchorPoint(0.5, 0.5)
    node:setPosition(self.visibleSize.width/2, self.visibleSize.height/2)
    -- l)その接続点に四角の物体をつける
    local body = cc.PhysicsBody:createEdgeBox(cc.size(self.visibleSize.width, self.visibleSize.height))
    body:setDynamic(false) 
    node:setPhysicsBody(body)
    layer:addChild(node)

    -- b)タッチイベントで呼ばれる関数
    local function onTouchBegan(touch, event)
        local location = touch:getLocation()

        -- 絵(スプライト)を追加
        local sprite = cc.Sprite:create("land.png")
        sprite:setPosition(location)
        layer:addChild(sprite)

        -- m)物体を作成し絵(スプライト)に取り付ける
        local physicsBody = cc.PhysicsBody:createBox(sprite:getContentSize())
        sprite:setPhysicsBody(physicsBody)

        return true
    end

l)의 노드(Node)입니다만, 이것은 스프라이트등의 “무언가”를 일괄하여 취급하기 위한 집약 기능입니다. 예를 들어, 노드에 여러 그림을 추가한 후 노드를 움직이면 여러 그림이 함께 움직입니다. 여기에서는, 지금 벽이 되는 사각형 물체는 투명하고 그림이 없기 때문에, 변함없이 노드를 설치처로서 사용하고 있습니다.
m)에서 게임 화면 크기의 사각형 물체를 만들고 위의 노드에 부착합니다.



이상은 물리 엔진을 활성화하고 낙하물과 벽을 추가하는 간단한 설명입니다.

물리 엔진을 사용하지 않는 경우, 스스로 모든 그림을 움직이면서, 모든 물체의 충돌 위치 등을 매시 체크하는 처리를 기술해야 하고, 또한, 중력을 동반하는 가속 운동을 맞추는 실장은 수고가 걸려 합니다. 그러나, chipmunk를 이용하는 것으로, 유저는 위치와 물체의 크기등을 지정하는 것만으로, 후에는 자동적으로 물리 엔진이 움직여 줍니다. 간단한 코드이지만이 혜택을 충분히 느낄 수 있습니다.

향후 예정



물리 엔진을 이용한 게임 개발에서는 특정 물체끼리 접촉하면 득점 또는 게임 종료라는 행동이 자주 사용됩니다.

다음 번에는 물체 접촉 시 이벤트 처리 코드에 대해 설명합니다.

좋은 웹페이지 즐겨찾기