嘿,伙计们,我刚刚用Corona SDK完成了我的应用程序,我想试着制作我的第一个游戏。
当我的第一个应用程序正在学习加速度计时,我认为我的游戏也应该使用它。
所以我在屏幕上放了一个小涂鸦,让加速度计在X和Y方向控制他,游戏是横向的,但如果我把设备朝我倾斜,涂鸦就会在Y方向从屏幕上滑下来。
如果我躺在床上或懒洋洋地躺在沙发上,那么游戏就无法玩了。
如何编写补偿这个角度的函数?
这是我目前对加速度计的代码;
display.setStatusBar(display.HiddenStatusBar)
system.setAccelerometerInterval( 50 )
_W = display.contentWidth
_H = display.contentHeight
local player = display.newImageRect("doodle.png", 64, 64)
player:setReferencePoint(display.CenterReferencePoint)
player.x = _W/2
player.y = _H/2
-- Set up the Accelerometer values in Landscape
local motionX = 0
local motionY = 0
local function onAccelerate( event )
motionX = 10 * event.yGravity;
motionY = 10 * event.xGravity;
end
Runtime:addEventListener ("accelerometer", onAccelerate);
-- Make the player move on tilt.
local function movePlayer (event)
player.x = player.x + motionX;
player.y = player.y - motionY;
end
Runtime:addEventListener("enterFrame", movePlayer))
我们在ArdentHD方面也面临着类似的挑战。
基本上,您需要做的是校准"静止"的X、Y和Z值。启动游戏后,继续读取加速度计几秒钟。在此期间,您可以显示倒计时或其他内容来安慰用户。
分别计算X、Y和Z的平均值。这些是表示"静止"设备的值。
因此,当用户将设备直立时,您将得到X=0、Y=-1和Z=0。(如果设备在背面,则X=0,Y=0,Z=-1)把它们保存在某个地方。例如:
xOffset = event.xGravity
yOffset = event.yGravity
zOffset = event.zGravity
现在,不是执行
motionX = 10 * event.yGravity;
motionY = 10 * event.xGravity;
在移动计算功能中,执行
motionX = 10 * (event.yGravity - xOffset);
motionY = 10 * (event.xGravity - yOffset);
这将清除原始位置。
此外,请注意,如果您想真正将设备旋转360°,则需要将motionX和motionY计算为xGravity和zGravity以及yGravity和z Gravity的余切。否则,只有当设备处于水平状态时(zGravity常数为-1),运动才会感觉"真实"。