0

作業中のアプリで、物理エンジン (addBody() および removeBody()) からオブジェクトを追加/削除しようとしています。私が取り組んでいるアプリはモジュール式であるため、問題は 2 つのファイルのいずれかにあります。

オブジェクト ファイル (TransmitterObject) またはメイン ファイル (main):

これは、両方に関連するコードです。

main.lua

local physics = require("physics")
physics.start()
physics.setGravity(0,0)
physics.setDrawMode( "debug" ) 


local TransmitterObject = require("TransmitterObject")

function updateGame(event)

    if(ITERATIONS % 100 == 0) then
        tran1:activate()    --create new physics object here    
    end

    ITERATIONS = ITERATIONS + 1
    --print(ITERATIONS)
end

Runtime:addEventListener("enterFrame", updateGame)

TransmitterObject.lua

function transmitter.new(props) --constructor
    Transmitter = 
    {
        x = props.x,
        y = props.y,
        receivers = props.receivers
    }

    return setmetatable( Transmitter, transmitter_mt )      
end

function transmitter:activate() 
    local group = math.random(1, #self.receivers)
    local receiver = math.random(1,#self.receivers[group])
    local x , y = self.receivers[group][receiver][1], self.receivers[group][receiver][2]
    local d = math.sqrt(math.pow((self.x-x),2) + math.pow((self.y-y),2))
    local dx = math.abs(self.x - x)
    local angle = math.deg(math.acos(dx/d))


    local beam = display.newRect(self.x,self.y, d, 10)
    beam:setReferencePoint(display.TopLeftReferencePoint)
    beam.rotation = 180 + angle
    beam:setFillColor(0,255,0)
    beam.alpha = 0

    local function add(event)
        physics.addBody(beam, "static")
    end

    local function delete(event)
        physics.removeBody(beam)
    end 

    transition.to( beam, { time=1000, alpha=1.0, onComplete=add } )
    transition.to( beam, { time=1000, delay=2500, alpha=0, onComplete=delete})  
end

ここで、この問題をもう少し詳しく説明してみましょう。基本的に、「enterFrame」が 100 回起動するたびに、送信機オブジェクト (tran1) にその関数「activate」を呼び出すように指示します。これにより、座標を取得するための基本的な計算が実行されます。次に、計算された情報を使用して長方形 (ビーム) を作成し、いくつかのプロパティを設定します。それはすべて基本的なことです。次に、非表示 (アルファ = 0) から表示に 1 秒かけて遷移するように指示します。オブジェクトを物理エンジンに追加する関数「add」を呼び出すのはいつですか。同様に、次の行でオブジェクトを削除します。

そうは言っても、physics.setDrawMode( "debug" ) を設定すると、ビーム オブジェクトは静的な物体として表示されますが、衝突は受け入れられません。上記のコードがビーム オブジェクトの衝突を受け入れない理由を知っている人はいますか?

物理エンジン内で適切に動作する他のオブジェクトがあることに注意してください。

4

1 に答える 1

0

うわー、返事が超遅い!
衝突では、ボディの変更はサポートされていません。
私があなたに提案するのは、新しい機能を作成することです。

local function addBody ( event )
physics.addBody(ball, "static")
end

衝突イベントでは、これを追加する必要があります。

timer.performWithDelay(500, addBody)

問題を引き起こす可能性がある唯一のことは遅延ですが、衝突にはあまり時間がかからないため、問題はありません。
このネクロポストで申し訳ありません。
それは、その問題を抱えている可能性のある他の人々を助けるためです
.Fannick

于 2014-01-24T15:03:06.240 に答える