1

この質問のフォローアップ、セラミックタイルエンジンを使用したスト​​ーリーボード、および衝突検出を使用したスト​​ーリーボードはまだ謎です。コードは次のとおりです。

-- hide status bar
display.setStatusBar(display.HiddenStatusBar)
local storyboard = require("storyboard")
--Set up the physics world
local physics = require("physics")
physics.start()
physics.setGravity(0, 0)
physics.setDrawMode('hybrid')
local scene = storyboard.newScene()
local widget = require("widget")

-- Add Hero to Physics
local hero = display.newImage("images/man.png")
hero.x = 40
hero.y = 80
local heroCollisionFilter = { categoryBits = 4, maskBits = 2 }
local heroBody = { filter=heroCollisionFilter, isSensor=true }
physics.addBody(hero, "dynamic", heroBody)

function scene:createScene( event )
    local group = self.view
    local ceramic = require("Ceramic")
    ceramic.showPrints = false
    local map = ceramic.buildMap("maps/map.lua")
    -- collisionLayer = map.layer['Collision']
    -- collisionLayer.ccName = "map"
    -- physics.addBody(collisionLayer, "static", { friction=0.5, bounce=0.3 } )
    map.y = 0
    map.setCameraDamping(10)
    map.layer['World']:insert(hero)
end

function onGlobalCollision(event)
    if(event.phase == "began") then
        print( "Global report: " .. event.object1.ccName .. " & " .. event.object2.ccName .. " collision began" )
    elseif(event.phase == "ended") then
        print( "Global report: " .. event.object1.ccName .. " & " .. event.object2.ccName .. " collision ended" )
    end
    print( "**** " .. event.element1 .. " -- " .. event.element2 )
end

Runtime:addEventListener("collision", onGlobalCollision)
scene:addEventListener( "createScene", scene )

return scene

スクリーンショットは次のようになります。

スクリーンショット

ただし、printメッセージがターミナルにまったく表示されないため、衝突が発生することはありません。

私は使用しています:

  • コロナSDK
  • セラミック タイル エンジン
  • コロナ モジュール: 絵コンテ、物理演算

衝突検出を有効にするにはどうすればよいですか? パラメータは正しいですか?


編集 2013/10/27

タイル マップの設定は次のとおりです。

衝突レイヤー設定

Mac OS X で実行している場合、衝突は発生しません (ハイブリッド レイヤーのみが色を変更します)。

Windows 7 で実行すると、コードは次の行でクラッシュします。

ceramic.buildMap("maps/map.lua")

エラーあり:

Ceramic.lua でグローバル 'reversePolygon' (nil 値) を呼び出そうとしています: 617

次の行をコメントアウトすると、エラーはなくなりました。

collisionLayer = map.layer['Collision']
collisionLayer.ccName = "map"
physics.addBody(collisionLayer, "static", { friction=0.5, bounce=0.3 } )

ただし、衝突関数は呼び出されません。

4

2 に答える 2

1

タイル化およびセラミック タイル エンジンを使用したコロナ SDK の衝突検出に行き詰まっている将来の人々のために

さらにテストを行ったところ、コリジョン イベントが発生しない問題は、間違ったコリジョン イベントのセットを使用したことが原因であることがわかりました。動作中の衝突イベントは次のとおりです。

local function onLocalCollision(self, event)
    print("collision")
    if event.phase == "began" then
        print("Collision began")
    elseif event.phase == "ended" then
        print("Collision ended")
    end
end

function onGlobalCollision(event)
    if(event.phase == "began") then
        print( "Global report: " .. event.object1.ccName .. " & " .. event.object2.ccName .. " collision began" )
    elseif(event.phase == "ended") then
        print( "Global report: " .. event.object1.ccName .. " & " .. event.object2.ccName .. " collision ended" )
    end
    print( "**** " .. event.element1 .. " -- " .. event.element2 )
end

function onPostCollision(event)
    print("postCollision")
end

-- Local Collision
hero.collision = onLocalCollision
hero:addEventListener("collision", hero)
-- Global Collision
Runtime:addEventListener("collision", onGlobalCollision)
Runtime:addEventListener("postCollision", onPostCollision)

各衝突オブジェクトには名前が必要です (プロパティ名ccName、任意の名前を選択できますが、Tiled のオブジェクト リストに設定する必要があります)。

また、 と を削除しましたcategoryBitsmaskBits、衝突検出が無効になっているようです。

注意点:

  • コリジョン レイヤーは、プログラミングによってシーンに追加する必要はありません (自動的に追加されます)。
  • 1 セットの衝突検出方法 (ローカル/グローバル) のみが必要です (ただし、2 セットは並行して実行できます)。
  • 必要のないときはハイブリッド表示モードをオフにして、パフォーマンスを向上させます
  • レイヤー形式は関係ありません (Base64 / CSV は問題なく動作します)。
  • physics:enabled Collision Layer プロパティを追加することを忘れないでください ( @CalebP のコメントによるphysics:frictionと、オプションです)。physics:bounce
于 2013-10-27T05:18:32.847 に答える