私はMOAIを初めて使用します。主に、卒業生プログラムが私を強制しているために使用しています。彼らは明らかに短い締め切りでの急な学習曲線のファンです。:)
とにかく、自分のスレッドのメインゲームループが、別のスレッドに配置した2秒のアニメーションをトリガーする関数を呼び出すという問題があります。小道具を取り外す前にアニメーションを終了できるようにするために、スピンロックを試し、イーズドライバーを使用してみました。どちらもアニメーションを正常に動作させますが、この2秒間、メインスレッドがまったく実行されていないようです。
ゲームはBox2Dを使用しているため、この2秒間はクラッシュしませんが、このアニメーションではすべてのゲームループロジックが機能しません。独自のスレッドに配置することの全体的なポイントは、ゲームループと連動して実行できるようにすることだと思いました。誰か提案はありますか?
--inside of a another function where cheeseProp is created.
function cheeseProp:destroy ()
animateLogoThread = MOAIThread:new ()
--animateLogoThread = MOAICoroutine.new()
layer:removeProp ( self )
score = score + 10
animateLogoThread:run ( animateLogo(self.type) )
--animateLogo(self.type)
timerFrames = 0
cheeseCounter = cheeseCounter - 1
cheeseArray[self] = nil
self = nil
end
function animateLogo(logoNum)
local logoGfx = MOAIGfxQuad2D.new ()
logoGfx:setRect ( -100, -100, 100, 100 )
logoGfx:setTexture ( "assets/logo1.png" )
local x1, y1 = beeBody:getPosition()
local logoProp = MOAIProp2D.new()
logoProp:setDeck(logoGfx)
logoProp:setLoc ( x1, y1 )
layer:insertProp(logoProp)
logoProp:moveScl( -1, -1, 2.0)
action = logoProp:seekLoc ( x1 + 400, y1 + 400, 2.0 )
while action:isBusy () do coroutine:yield () end
-- local ease = MOAIEaseDriver.new ()
-- ease:reserveLinks ( 4 )
-- ease:setLink ( 1, logoProp, MOAIProp2D.ATTR_X_LOC, 400 )
-- ease:setLink ( 2, logoProp, MOAIProp2D.ATTR_Y_LOC, 400 )
-- ease:setLink ( 3, logoProp, MOAIProp2D.ATTR_X_SCL, -1 )
-- ease:setLink ( 4, logoProp, MOAIProp2D.ATTR_Y_SCL, -1 )
-- ease:setSpan ( 2.0 )
-- ease:start ()
-- MOAIThread.blockOnAction(ease)
layer:removeProp(logoProp)
end
コメントアウトされたコードからわかるように、blockOnActionでeasedriversを試しましたが、現在、animateLogoを生成して実行しているスレッドがあります。どちらもまったく同じように動作します。関連性のないはずのテクスチャ選択コードを少し取り出して、コードを読みにくくしました。上で述べたように、cheeseProp:destroyはメインのゲームループから呼び出されます。スレッドのブロックによって親スレッドもブロックされているようです。
助けてくれてありがとう!