我们正在进行游戏,逐帧移动物体并使用加速度计。
我们已经吸引了两个事件 - 关于绘制框架和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 )
答案 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);
我希望,此代码可以帮助您。