2011-06-30 86 views
3

我們正在逐幀移動物體並使用加速度計進行遊戲。Corona SDK - 逐幀動畫和加速計問題

我們關注了兩個事件 - 關於繪製框架和acc。

問題是,在我們收到acc事件後,我們立即將x值放入一個變量中。

然後我們使用這個變量來移動屏幕上的一個對象,但是存在CONSIDERABLE慢。 (我打開手機,一秒鐘後對象正常移動,但第二個對於遊戲來說只是太多了,我期望立即響應)。

我在做什麼錯?有沒有另外的解決方法來做到這一點,或者我可以給加速度計一些參數?

不幸的是,這是一個嚴重的問題 - 一個真正的攔截器。如果這不起作用,我必須找到另一個解決方案(而不是電暈)來實施遊戲。

在此先感謝! Danail

PS:這裏的一些來源:

local lastXGravity = 0 

local function move(event) 
     eventTime=event.time 
     elapsedTime = eventTime - lastDrawTime 
     lastDrawTime = eventTime 

     xSpeed = lastXGravity 
     local xMoved = xSpeed * elapsedTime 
     object.x= object.x + xMoved 
end 

function acc(event) 
     lastXGravity = event.xGravity 
end 

Runtime:addEventListener("accelerometer", acc) 
Runtime:addEventListener("enterFrame", move) 
+0

您需要顯示事件處理程序和對象移動的代碼。您遇到的延遲沒有明顯的原因。只有代碼可以告訴我們發生了什麼...... – JeffK

+0

當然,我的歉意!添加一個微型片給你一瞥。 – Danail

回答

1

在Ansca論壇剛剛得到了這一點的球員:

system.setAccelerometerInterval(50) 

這也不太實際的伎倆,但

system.setAccelerometerInterval(100) - 警告 - 電池下水!

做到了:)

1

我不知道科羅納開發任何東西,但也有一些普遍的問題。首先什麼是重力包含?只是重力矢量或總加速度= gravity + userAcceleration?你需要獲得userAcceleration = totalAcceleration - 重力或者直接提供事件的某個成員,否則就沒有機會。

如果您有用戶加速,則需要整合兩次以獲取該位置。見Equations of motion。在您的情況下,代碼將是這樣的:

速度= userAcceleration * elapsedTime

位置= 0.5 * userAcceleration * elapsedTime^2

在一般精確的位置檢測由加速度計和陀螺儀仍然是一個未解決的問題,所以不要期望得到確切的結果。但是,如果你只是想評估一個方向上的衝動,它可能會起作用。例如見Getting displacement from accelerometer data with Core Motion

+0

我只需要做到以下幾點:轉角越大,物體的速度越快。不需要將加速度疊加到速度上,這是另一項任務。我沒有嘗試位置檢測,這是非常先進的問題。 – Danail

0

我開源我的第一個電暈SDK製作的遊戲(實際上沒有真的很好),它採用同樣的方式傾斜你描述(越傾斜,更快的移動和反之亦然)。

這就是所謂的 '向上傾斜怪物',你可以在這裏下載: http://developer.anscamobile.com/code/tilt-monster

0

當地isSimulator = 「模擬器」 ==系統。的getInfo( 「環境」)

- 加速器不支持模擬器

如果isSimulator然後 - 請顯示一個警告框 結束

- 文本參數 當地labelx = 50 地方X = 220 局部Y = 95 本地fontSize的= 24

本地frameUpdate =假

local xglabel = display.newText(「gravity x =」,labelx,y,native.systemFont,fontSize) xglabel:setTextColor(255,255,255) local xg = display.newText(「0.0」,x,y,native。 localFont,fontSize) xg:setTextColor(255,255,255) y = y + 25 local yglabel = display.newText(「gravity y =」,labelx,y,native.systemFont,fontSize) local yg = display.newText(「 0.0「,x,y,native.systemFont,fontSize) yglabel:setTextColor(255,255,255) yg:setTextColor(255,255,255) y = y + 25 local zglabel = display.newText(」gravity z =「,labelx,y ,native.systemFont,fontSize) local zg = display.newText(「0.0」,x,y,native.syst emFont,fontSize的) zglabel:setTextColor(255,255,255) ZG:setTextColor(255,255,255) Y = Y + 50 本地xilabel = display.newText( 「時刻x =」,labelx,Y,native.systemFont,fontSize的) 本地xi = display.newText(「0.0」,x,y,native.systemFont,fontSize) xilabel:setTextColor(255,255,255) xi:setTextColor(255,255,255) y = y + 25 local yilabel = display.newText(「instant y:setTextColor(255,255,255)yilabel:setTextColor(255,255,255) yi:set(x),y​​ =「,labelx,y,native.systemFont,fontSize) local yi = display.newText(」0.0「,x,y,native.systemFont, y = y + 25 local zilabel = display.newText(「instant z =」,labelx,y,native.systemFont,fontSize) local zi = display.newText(「0.0」,x,y,native.systemFont,fontSize) zilabel:setTextColor (255,255,255) 滋:setTextColor(255,255,255)

- 創建與加速器事件移動的圓

本地的centerX = display.contentWidth/2 本地centerY = display.contentHeight/2

圈= display.newCircle(0,0,20) Circle.x = centerX Circle。Y = centerY 界:setFillColor(0,0,255) - 藍色

本地的TextMessage =函數(STR,位置,scrTime,大小,顏色,字體)

local x, t 

size = tonumber(size) or 24 
color = color or {255, 255, 255} 
font = font or "Helvetica" 

if "string" == type(location) then 
    if "Top" == location then 
     x = display.contentHeight/4 
    elseif "Bottom" == location then 
     x = (display.contentHeight/4)*3 
    else 
     -- Assume middle location 
     x = display.contentHeight/2 
    end 
else 
    -- Assume it's a number -- default to Middle if not 
    x = tonumber(location) or display.contentHeight/2 
end 

scrTime = (tonumber(scrTime) or 3) * 1000  -- default to 3 seconds (3000) if no time given 

t = display.newText(str, 0, 0, font, size) 
t.x = display.contentWidth/2 
t.y = x 
t:setTextColor(color[1], color[2], color[3]) 

-- Time of 0 = keeps on screen forever (unless removed by calling routine) 

if scrTime ~= 0 then 

    -- Function called after screen delay to fade out and remove text message object 
    local textMsgTimerEnd = function() 
     transition.to(t, {time = 500, alpha = 0}, 
      function() t.removeSelf() end) 
    end 

    -- Keep the message on the screen for the specified time delay 
    timer.performWithDelay(scrTime, textMsgTimerEnd) 
end 

return t  -- return our text object in case it's needed 

端 - 文字信息( )

本地函數xyzFormat(OBJ,值)

obj.text = string.format("%1.3f", value) 

-- Exit if not time to update text color 
if not frameUpdate then return end 

if value < 0.0 then 
    -- Only update the text color if the value has changed 
    if obj.positive ~= false then 
     obj:setTextColor(255, 0, 0)  -- red if negative 
     obj.positive = false 
     print("[---]") 
    end 
else 
    if obj.positive ~= true then 
     obj:setTextColor(255, 255, 255)  -- white if postive 
     obj.positive = true 
     print("+++") 
    end 
end 

本地函數onAccelerate(事件)

xyzFormat(xg, event.xGravity) 
xyzFormat(yg, event.yGravity) 
xyzFormat(zg, event.zGravity) 
xyzFormat(xi, event.xInstant) 
xyzFormat(yi, event.yInstant) 
xyzFormat(zi, event.zInstant) 

frameUpdate = false  -- update done 

-- Move our object based on the accelerator values 

Circle.x = centerX + (centerX * event.xGravity) 
Circle.y = centerY + (centerY * event.yGravity * -1) 

-- Display message and sound beep if Shake'n 

if event.isShake == true then 
    -- str, location, scrTime, size, color, font 
    textMessage("Shake!", 400, 3, 52, {255, 255, 0}) 
end 

本地函數onFrame() frameUpdate =真 結束

- 添加運行聽衆 運行:的addEventListener( 「加速度」,onAccelerate) ; 運行時:addEventListener(「enterFrame」,onFrame);

我希望這段代碼能幫到你。