将设备倾斜映射到玩家角色(等)的移动行为

时间:2011-04-17 05:11:27

标签: ios rotation accelerometer

上下文是一款iPad游戏,我希望通过设备的X / Y倾斜来控制屏幕上的对象。

我想知道是否有人可以指出我的资源方向,以决定倾斜与运动行为的适当映射(例如,人们是否倾向于使用“原始”旋转值来控制加速度,速度或直接位置,以及玩家被发现与设备旋转到对象移动的这些不同类型“映射”的舒适程度。)

我理解适当的选择可能取决于所控制的游戏/对象的特定类型,并且需要一些反复试验,但我想知道至少是现有知识的起点。

3 个答案:

答案 0 :(得分:3)

首先,您需要应用低通滤波器来隔离噪声和用户颤抖的手的倾斜,Apple在accelerometer examples

中显示了这一点。
x = accel.x * alpha + x * (1.0 - alpha);
y = accel.y * alpha + y * (1.0 - alpha);

更多的alpha会导致更多的响应,但代价是噪音更大。

除非您的游戏有意模拟屏幕上的球平衡,否则您可能不希望将倾斜值应用于加速度,而是将目标速度或目标位置应用于目标位置,应用“假”平滑加速来获取它在那里。

另外,如果Unity3d对于您的项目是可接受的,this answer有一个很好的想法,并且this paper在使用倾斜控制作为输入的实际限制上有一些方便的数字,包括重点指出用户控制绝对角度位置比倾斜速度更容易。

答案 1 :(得分:0)

所以,我们希望移动我们的角色 - 我们称之为'loco' - 基于加速度计的x和y数据。

现在,如果我们确实希望倾斜的大小影响到行星的行进速度,我们可以简单地将加速度计x或y值直接计算到我们的算法中进行移动。

例如:(psuedocode)

// we'll call our accelerometer value for x 'tiltX'
// tiltX is .5; // assume that accelerometer updated the latest x value to .5
// unitOfMovement = 1; // some arbitraty increment you choose for a unit of movement

loco.x += unitOfMovement * tiltValueX;

这将导致loco为每个游戏周期移动该像素数(或者您正在驱动更新以进行移动的任何周期)并且此处是1像素乘以加速度计值。因此,如果角色通常在完全倾斜X(1.0)处向右移动1个像素,那么如果tiltX从加速度计在.5处进入,则loco将移动一半。当tiltX的值增加时,Loco的移动也会增加。

另一个考虑因素是您是否希望将运动直接与加速度计事件的速率联系起来?可能不是,所以你可以使用一个数组来保存加速度计发送的最后十个x值(y值也是相同的概念)并使用最新的数组平均值(x值的总和/数组中的元素数)每个游戏循环。这样,无论加速度计的更新速率如何,灵敏度都会比驱动机芯更合适。

答案 2 :(得分:0)

看看Point in Tilt Direction - iPhone我认为第一个答案是非常有用的。