我是 MOAI 的新手,主要是因为我的研究生课程也强迫我使用它。显然,他们喜欢在较短的期限内陡峭的学习曲线。:)
无论如何,我有一个问题,我的主游戏循环在它自己的线程上调用了一个触发 2 秒动画的函数,我也把它放在了一个单独的线程上。为了让动画在我移除道具之前完成,我尝试了自旋锁定并尝试使用easedrivers。两者都使动画工作正常,但在那两秒钟内,我的主线程似乎根本没有执行。
该游戏使用 Box2D,因此在这两秒钟内它不会崩溃,但所有游戏循环逻辑在此动画期间都不起作用。我认为将它放在自己的线程上的全部意义在于它可以与游戏循环一起运行。有没有人有什么建议?
--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 是从主游戏循环中调用的,看起来我的线程阻塞也阻塞了父线程。
提前感谢您的帮助!