옻칠 Cocos2d-x에서 물리 엔진 사용하기 접촉하면 "뭔가"하고 싶습니다.
목차
1 소개
2 물체의 접촉 설정 및 처리
2.1 물체의 분류 설정
2.2 물체의 접촉 대상 설정
2.3 접촉시에 불려 가는 함수를 기술해 등록한다
3 향후 예정
소개
본 기사는 cocos2d-x 및 Cocos Code IDE를 도입하여 그림(스프라이트)을 표시하고 터치에 반응하여 그림을 움직여 BGM이나 효과음을 울리고 물리 엔진 chipmunk를 사용하여 물체를 낙하시켰다 사람으로, 특정 물체가 접촉했을 때에 뭔가하고 싶은 사람을 위한, 각서입니다. 우선, 접촉시에 물체를 특정하기 위한 정보를 설정하고, 실제로 접촉시키고 설정한 정보를 바탕으로 물체를 이동하는 예를 사용하여 설명합니다.
물체의 접촉 설정 및 처리
아래 코드를 사용하여 설명합니다. 실행하면 화면에서 물체가 떨어지고 지면을 만지면 위로 다시 위에서 떨어지기 시작합니다.
GameScene.lualocal WALL = 0x01
local BALL = 0x02
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()
-- n)ゲーム画面の中央を基点とする接続点を作る
local node = cc.Node:create()
node:setAnchorPoint(0.5, 0.5)
node:setPosition(self.visibleSize.width/2, 0)
-- l)その接続点(但し位置は画面下端)に四角の壁をつける
local bodyWall = cc.PhysicsBody:createEdgeBox(cc.size(self.visibleSize.width, 10))
bodyWall:setDynamic(false)
node:setPhysicsBody(bodyWall)
layer:addChild(node)
-- 落下物(スプライト)を追加し物体を取り付ける
local sprite = cc.Sprite:create("land.png")
sprite:setPosition(270,900)
layer:addChild(sprite)
local bodyBall = cc.PhysicsBody:createBox(sprite:getContentSize())
sprite:setPhysicsBody(bodyBall)
-- o)壁と落下物それぞれの分類と接触対象を設定
bodyWall:setCategoryBitmask(WALL)
bodyWall:setContactTestBitmask(BALL)
bodyBall:setCategoryBitmask(BALL)
bodyBall:setContactTestBitmask(WALL)
-- p)接触時に呼ばれる関数
local function onContactBegin(contact)
local a = contact:getShapeA():getBody()
local b = contact:getShapeB():getBody()
-- q)接触した物体aとbのどちらかがボールなら、そのスプライト部を取得して、
if a:getCategoryBitmask()== BALL then
ball = a:getNode()
elseif b:getCategoryBitmask()== BALL then
ball = b:getNode()
end
-- 上に戻す
if ball ~= nil then
local jump = cc.JumpTo:create(1,cc.p(270,800),30,5)
ball:runAction(jump)
end
return true -- trueを返すこと
end
-- r)接触時に呼び出す関数を登録し、このレイヤーでの接触イベント取得を有効にする
local contactListener = cc.EventListenerPhysicsContact:create()
contactListener:registerScriptHandler(onContactBegin, cc.Handler.EVENT_PHYSICS_CONTACT_BEGIN)
local eventDispatcher = layer:getEventDispatcher()
eventDispatcher:addEventListenerWithSceneGraphPriority(contactListener, layer)
return layer
end
return GameScene
중요한 점만 순서대로 설명합니다.
o)에서 하벽과 낙하물 각각의 분류 및 접촉 대상을 설정합니다.
예를 들어, 특정 물체 A가 물체 B와 접촉할 때 이벤트가 발생하도록 하려면
물체 A의 분류는 1이고, 물체 A의 접촉 대상은 2(물체 B의 분류),
물체 B의 분류는 2로, 물체 B의 접촉 대상은 1(물체 A의 분류),
라는 바람으로 설정합니다. 서로의 분류가 접촉 대상으로 설정되면 접촉 이벤트가 발생합니다. 이것이 설정되어 있지 않으면 접촉 이벤트가 발행되지 않습니다. 또, 분류 번호는 비트열(1,2,4,..)로 나눕니다.
p) 접촉 이벤트가 발생하면 호출되는 함수입니다.
q)에서 a = contact:getShapeA():getBody()
는 접촉한 물체를 얻는 명령입니다. 이에 더하여 getNode()
하는 것으로, 그 물체가 달려 있는 그림의 부분을 취득할 수 있습니다. 여기서, a, b 어느 쪽에 낙하물의 정보가 들어갈지 모르기 때문에, 양쪽 모두를 조사할 필요가 있습니다.
r)에서 p)의 함수를 접촉 이벤트 개시시에 호출하는 함수로서 등록해, 이 레이어에 대한 접촉 이벤트의 취득을 유효화하고 있습니다.
물리 엔진의 중력 계산에 맡기고 낙하시켜, 낙하물이 벽에 닿은 순간, 이번은 점프 액션으로 개시점까지 되돌리게 되어 있습니다.
향후 예정
다음은 Cocos Code IDE를 사용한 Android, iPhone 기기에서의 디버깅 실행과 Cocos Code IDE에서 생성된 프로젝트 파일의 Eclipse, xCode에서의 빌드 및 실행에 대해 설명합니다.
Reference
이 문제에 관하여(옻칠 Cocos2d-x에서 물리 엔진 사용하기 접촉하면 "뭔가"하고 싶습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/CasualGameDev/items/33304d107755ff2983d3
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
본 기사는 cocos2d-x 및 Cocos Code IDE를 도입하여 그림(스프라이트)을 표시하고 터치에 반응하여 그림을 움직여 BGM이나 효과음을 울리고 물리 엔진 chipmunk를 사용하여 물체를 낙하시켰다 사람으로, 특정 물체가 접촉했을 때에 뭔가하고 싶은 사람을 위한, 각서입니다. 우선, 접촉시에 물체를 특정하기 위한 정보를 설정하고, 실제로 접촉시키고 설정한 정보를 바탕으로 물체를 이동하는 예를 사용하여 설명합니다.
물체의 접촉 설정 및 처리
아래 코드를 사용하여 설명합니다. 실행하면 화면에서 물체가 떨어지고 지면을 만지면 위로 다시 위에서 떨어지기 시작합니다.
GameScene.lualocal WALL = 0x01
local BALL = 0x02
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()
-- n)ゲーム画面の中央を基点とする接続点を作る
local node = cc.Node:create()
node:setAnchorPoint(0.5, 0.5)
node:setPosition(self.visibleSize.width/2, 0)
-- l)その接続点(但し位置は画面下端)に四角の壁をつける
local bodyWall = cc.PhysicsBody:createEdgeBox(cc.size(self.visibleSize.width, 10))
bodyWall:setDynamic(false)
node:setPhysicsBody(bodyWall)
layer:addChild(node)
-- 落下物(スプライト)を追加し物体を取り付ける
local sprite = cc.Sprite:create("land.png")
sprite:setPosition(270,900)
layer:addChild(sprite)
local bodyBall = cc.PhysicsBody:createBox(sprite:getContentSize())
sprite:setPhysicsBody(bodyBall)
-- o)壁と落下物それぞれの分類と接触対象を設定
bodyWall:setCategoryBitmask(WALL)
bodyWall:setContactTestBitmask(BALL)
bodyBall:setCategoryBitmask(BALL)
bodyBall:setContactTestBitmask(WALL)
-- p)接触時に呼ばれる関数
local function onContactBegin(contact)
local a = contact:getShapeA():getBody()
local b = contact:getShapeB():getBody()
-- q)接触した物体aとbのどちらかがボールなら、そのスプライト部を取得して、
if a:getCategoryBitmask()== BALL then
ball = a:getNode()
elseif b:getCategoryBitmask()== BALL then
ball = b:getNode()
end
-- 上に戻す
if ball ~= nil then
local jump = cc.JumpTo:create(1,cc.p(270,800),30,5)
ball:runAction(jump)
end
return true -- trueを返すこと
end
-- r)接触時に呼び出す関数を登録し、このレイヤーでの接触イベント取得を有効にする
local contactListener = cc.EventListenerPhysicsContact:create()
contactListener:registerScriptHandler(onContactBegin, cc.Handler.EVENT_PHYSICS_CONTACT_BEGIN)
local eventDispatcher = layer:getEventDispatcher()
eventDispatcher:addEventListenerWithSceneGraphPriority(contactListener, layer)
return layer
end
return GameScene
중요한 점만 순서대로 설명합니다.
o)에서 하벽과 낙하물 각각의 분류 및 접촉 대상을 설정합니다.
예를 들어, 특정 물체 A가 물체 B와 접촉할 때 이벤트가 발생하도록 하려면
물체 A의 분류는 1이고, 물체 A의 접촉 대상은 2(물체 B의 분류),
물체 B의 분류는 2로, 물체 B의 접촉 대상은 1(물체 A의 분류),
라는 바람으로 설정합니다. 서로의 분류가 접촉 대상으로 설정되면 접촉 이벤트가 발생합니다. 이것이 설정되어 있지 않으면 접촉 이벤트가 발행되지 않습니다. 또, 분류 번호는 비트열(1,2,4,..)로 나눕니다.
p) 접촉 이벤트가 발생하면 호출되는 함수입니다.
q)에서 a = contact:getShapeA():getBody()
는 접촉한 물체를 얻는 명령입니다. 이에 더하여 getNode()
하는 것으로, 그 물체가 달려 있는 그림의 부분을 취득할 수 있습니다. 여기서, a, b 어느 쪽에 낙하물의 정보가 들어갈지 모르기 때문에, 양쪽 모두를 조사할 필요가 있습니다.
r)에서 p)의 함수를 접촉 이벤트 개시시에 호출하는 함수로서 등록해, 이 레이어에 대한 접촉 이벤트의 취득을 유효화하고 있습니다.
물리 엔진의 중력 계산에 맡기고 낙하시켜, 낙하물이 벽에 닿은 순간, 이번은 점프 액션으로 개시점까지 되돌리게 되어 있습니다.
향후 예정
다음은 Cocos Code IDE를 사용한 Android, iPhone 기기에서의 디버깅 실행과 Cocos Code IDE에서 생성된 프로젝트 파일의 Eclipse, xCode에서의 빌드 및 실행에 대해 설명합니다.
Reference
이 문제에 관하여(옻칠 Cocos2d-x에서 물리 엔진 사용하기 접촉하면 "뭔가"하고 싶습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/CasualGameDev/items/33304d107755ff2983d3
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
local WALL = 0x01
local BALL = 0x02
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()
-- n)ゲーム画面の中央を基点とする接続点を作る
local node = cc.Node:create()
node:setAnchorPoint(0.5, 0.5)
node:setPosition(self.visibleSize.width/2, 0)
-- l)その接続点(但し位置は画面下端)に四角の壁をつける
local bodyWall = cc.PhysicsBody:createEdgeBox(cc.size(self.visibleSize.width, 10))
bodyWall:setDynamic(false)
node:setPhysicsBody(bodyWall)
layer:addChild(node)
-- 落下物(スプライト)を追加し物体を取り付ける
local sprite = cc.Sprite:create("land.png")
sprite:setPosition(270,900)
layer:addChild(sprite)
local bodyBall = cc.PhysicsBody:createBox(sprite:getContentSize())
sprite:setPhysicsBody(bodyBall)
-- o)壁と落下物それぞれの分類と接触対象を設定
bodyWall:setCategoryBitmask(WALL)
bodyWall:setContactTestBitmask(BALL)
bodyBall:setCategoryBitmask(BALL)
bodyBall:setContactTestBitmask(WALL)
-- p)接触時に呼ばれる関数
local function onContactBegin(contact)
local a = contact:getShapeA():getBody()
local b = contact:getShapeB():getBody()
-- q)接触した物体aとbのどちらかがボールなら、そのスプライト部を取得して、
if a:getCategoryBitmask()== BALL then
ball = a:getNode()
elseif b:getCategoryBitmask()== BALL then
ball = b:getNode()
end
-- 上に戻す
if ball ~= nil then
local jump = cc.JumpTo:create(1,cc.p(270,800),30,5)
ball:runAction(jump)
end
return true -- trueを返すこと
end
-- r)接触時に呼び出す関数を登録し、このレイヤーでの接触イベント取得を有効にする
local contactListener = cc.EventListenerPhysicsContact:create()
contactListener:registerScriptHandler(onContactBegin, cc.Handler.EVENT_PHYSICS_CONTACT_BEGIN)
local eventDispatcher = layer:getEventDispatcher()
eventDispatcher:addEventListenerWithSceneGraphPriority(contactListener, layer)
return layer
end
return GameScene
다음은 Cocos Code IDE를 사용한 Android, iPhone 기기에서의 디버깅 실행과 Cocos Code IDE에서 생성된 프로젝트 파일의 Eclipse, xCode에서의 빌드 및 실행에 대해 설명합니다.
Reference
이 문제에 관하여(옻칠 Cocos2d-x에서 물리 엔진 사용하기 접촉하면 "뭔가"하고 싶습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/CasualGameDev/items/33304d107755ff2983d3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)