물리 시뮬레이션 기본(Cocos Code IDE, Lua 언어)

15478 단어 cocos2d-x루아
Cocos Code IDE를 사용하여 Lua 언어로 물리 시뮬레이션을 다루는 샘플입니다.


실행 환경, IDE
Cocos2d-x 버전
언어


Cocos Code IDE Mac OS X 1.0.0-RC2
Cocos2d-x V3.2
Lua 언어


샘플 코드



프로젝트를 새로 생성합니다. (File 메뉴의 New->Cocos Lua Project...에서 만들 수 있습니다.)
프로젝트명은 적당히 붙여 주세요. 화면은 세로 화면(portrait)을 지정합니다.

main.lua 파일을 수정합니다.

main.lua/26행
cc.Director:getInstance():getOpenGLView():setDesignResolutionSize(320, 480, 0) -- 縦画面用に(480, 320, 0)から(320, 480, 0)に変更

main.lua/31행
--gameScene:playBgMusic() --使わないのでコメントアウト

GameScene.lua를 다시 씁니다.

GameScene.lua
require "Cocos2d"
require "Cocos2dConstants"

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

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

    scene:getPhysicsWorld():setDebugDrawMask(cc.PhysicsWorld.DEBUGDRAW_ALL) -- デバッグ表示用(任意)

    local visibleSize = cc.Director:getInstance():getVisibleSize()

    -- 画面と同じサイズのノードを作ります
    local node = cc.Node:create()
    node:setAnchorPoint(0.5, 0.5) -- アンカーポイントを設定しないとwarningが出る
    node:setPosition(visibleSize.width/2, visibleSize.height/2)
    scene:addChild(node)

    -- 物体を作成し、四角いエッジの形を割り当てます
    local body = cc.PhysicsBody:create()
    local rectangle = cc.PhysicsShapeEdgeBox:create(cc.size(visibleSize.width, visibleSize.height))
    body:addShape(rectangle)
    body:setDynamic(false) 
    node:setPhysicsBody(body)  

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

        -- スプライトを作る
        local sprite = cc.Sprite:create("box.png")
        sprite:setPosition(location)
        scene:addChild(sprite)

        -- 同型の物体を割り当てる
        local physicsBody = cc.PhysicsBody:createBox(sprite:getContentSize())
        sprite:setPhysicsBody(physicsBody)
    end

    -- タッチイベントの登録
    local listener = cc.EventListenerTouchOneByOne:create()
    listener:registerScriptHandler(onTouchBegan, cc.Handler.EVENT_TOUCH_BEGAN )
    local eventDispatcher = scene:getEventDispatcher()
    eventDispatcher:addEventListenerWithSceneGraphPriority(listener, scene)

    return scene
end

return GameScene

사각형 이미지를 box.png 이름으로 만들고 res 디렉토리에 추가합니다.

box.png

실행하고 화면을 터치하면 터치 한 위치에 사각형 스프라이트가 만들어져 떨어집니다.



해설



준비: 장면을 물리 시뮬레이션을 위해 생성



createWithPhysics 메서드로 장면을 만듭니다.
local scene = cc.Scene:createWithPhysics()

디버그 표시(선택 사항)


scene:getPhysicsWorld():setDebugDrawMask(cc.PhysicsWorld.DEBUGDRAW_ALL)

설정하면 물체의 모양이 표시됩니다. 디버그시에는 표시해 두면 설정되어 있는 물체의 형태를 알기 쉽습니다.

화면 크기와 동일한 테두리 만들기(선택 사항)



필요한 경우 화면 크기와 동일한 프레임을 만들어 화면에서 물체가 나오지 않도록 합니다.
만약, 아래에 차폐물이 없으면 물체는 영원히 낙하를 계속합니다.
-- 画面と同じサイズのノードを作ります
local node = cc.Node:create()
node:setAnchorPoint(0.5, 0.5) -- アンカーポイントを設定しないとwarningが出る
node:setPosition(visibleSize.width/2, visibleSize.height/2)
scene:addChild(node)

-- 物体を作成し、四角いエッジの形を割り当てます
local body = cc.PhysicsBody:create()
local rectangle = cc.PhysicsShapeEdgeBox:create(cc.size(visibleSize.width, visibleSize.height))
body:addShape(rectangle)
body:setDynamic(false) 
node:setPhysicsBody(body)  

스프라이트를 만들고 물체를 할당



스프라이트를 만들고 그 모양을 물체로 스프라이트로 설정합니다.
-- スプライトを作る
local sprite = cc.Sprite:create("box.png")
sprite:setPosition(location)
scene:addChild(sprite)

-- 同型の物体を割り当てる
local physicsBody = cc.PhysicsBody:createBox(sprite:getContentSize())
sprite:setPhysicsBody(physicsBody)

원형의 경우 createBox 대신 createCircle(반경)을 사용합니다.

물체를 고정물로 만들기


body:setDynamic(false) 와 같이 객체에 setDynamic을 사용합니다. 다른 물체와의 충돌이나 중력의 영향을 받지 않게 됩니다.

무중력으로 만들거나 중력을 설정하는 방법


scene:getPhysicsWorld():setGravity(cc.p(0, 0)) -- 無重力

초기 상태는 (0, -98)이며 물체는 아래로 떨어집니다.
오른쪽으로 떨어지거나 (98, 0), 위로 떨어지거나 (0, 98) 할 수 있습니다.
낙하 속도를 높이려면 숫자를 늘리십시오.

물체가 중력의 영향을 받지 않도록 합니다.



PhysicsBody:setGravityEnable(false)를 사용합니다.

객체 충돌 시 함수 호출



길어질 것 같으므로, 다른 기사로 투고 예정입니다.

여기에 게시했습니다.
물리 시뮬레이션으로 물체 충돌시 처리(Cocos Code IDE, Lua 언어)

수정사항: PhysicsBody의 번역을 물리체에서 물체로 변경하고 있습니다. 다만, PhysicsBody는 물체의 형상이나 재질, 그 외 중력의 영향의 유무 등 물리 엔진상에서의 행동을 기술하는 것으로, 단순한 물체의 이상의 의미를 가지고 있습니다. Cocos2d에서는 강체(rigid body, 변형하지 않는 물체)만을 취급하기 때문에 강체라도 좋을 것입니다만 물체가 알기 쉬울까라고 생각하고 있습니다.

좋은 웹페이지 즐겨찾기