Corona SDK - 逐帧动画和加速计问题

时间:2011-06-30 23:49:00

标签: lua corona accelerometer

我们正在进行游戏,逐帧移动物体并使用加速度计。

我们已经吸引了两个事件 - 关于绘制框架和acc。

问题是,在我们收到acc事件后,我们立即将x值放入变量中。

然后我们使用这个变量在屏幕上移动一个对象,但是有一个CONSIDERABLE减速。 (我转动手机,一秒钟后物体移动正常,但是对于游戏来说,一秒钟太多了,我希望能立即做出反应)。

我做错了什么?有没有其他的解决方法可以做到这一点,或者我可以给加速度计一些参数?

不幸的是,这是一个严重的问题 - 一个真正的阻碍者。如果这不起作用,我必须找到另一个解决方案(不是Corona)来实现游戏。

提前致谢!!! 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 )

4 个答案:

答案 0 :(得分:1)

我对Corona的发展一无所知,但有一些普遍的问题。首先是重力包含什么?只是重力矢量或总加速度=重力+用户加速度?你需要获得userAcceleration = totalAcceleration - gravity或某个直接提供它的成员,否则没有机会。

如果您有用户加速,则需要集成两次才能获得该位置。见Equations of motion。在您的情况下,代码将如下:

velocity = userAcceleration * elapsedTime

position = 0.5 * userAcceleration * elapsedTime ^ 2

通常,加速度计和陀螺仪的精确位置检测仍然是一个尚未解决的问题,因此不要指望精确的结果。但是如果你只想评估一个方向的冲动,它可能会起作用。请参阅示例Getting displacement from accelerometer data with Core Motion

答案 1 :(得分:1)

安斯卡论坛上的人刚刚解决了这个问题:

system.setAccelerometerInterval( 50 )

这实际上没有成功,但

system.setAccelerometerInterval( 100 ) - 警告 - 电池滤水器!!

做到了:)

答案 2 :(得分:0)

我开源了我的第一款Corona SDK制造的游戏(实际上确实做得很好),它以你描述的相同方式使用倾斜(倾斜越多,移动越快,反之亦然)。

它被称为'Tilt Monster',你可以在这里下载: http://developer.anscamobile.com/code/tilt-monster

答案 3 :(得分:0)

local isSimulator =“simulator”== system.getInfo(“environment”)

- Simulator

不支持加速器

如果isSimulator那么      - 请显示提示框 端

- 文字参数 本地标签x = 50 本地x = 220 当地的y = 95 本地fontSize = 24

local frameUpdate = false

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.systemFont,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.systemFont,fontSize) zglabel:setTextColor(255,255,255) ZG:setTextColor(255,255,255) y = y + 50 local xilabel = display.newText(“instant x =”,labelx,y,native.systemFont,fontSize) local 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 =”,labelx,y,native.systemFont,fontSize) local yi = display.newText(“0.0”,x,y,native.systemFont,fontSize) yilabel:setTextColor(255,255,255) 义:setTextColor(255,255,255) 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)

- 创建一个随加速器事件移动的圆圈

local centerX = display.contentWidth / 2 local centerY = display.contentHeight / 2

Circle = display.newCircle(0,0,20) Circle.x = centerX Circle.y = centerY 圆:setFillColor(0,0,255) - 蓝色

local textMessage = function(str,location,scrTime,size,color,font)

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

end - textMessage()

本地函数xyzFormat(obj,value)

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 = true 端

- 添加运行时侦听器 运行时:addEventListener(“accelerometer”,onAccelerate); 运行时:addEventListener(“enterFrame”,onFrame);

我希望,此代码可以帮助您。