我正在制作一个iphone应用程序,根据用户如何倾斜设备,球会在屏幕上滚动。如果设备理论上平放在桌子上,则球不会移动。如果设备完全向上倾斜,我希望球以最大速度直线向下滚动。速度取决于设备倾斜与平坦位置的距离。此外,它也适用于用户向右或向左或向上倾斜或四者组合的情况。我现在正在使用加速度计,球移动,它工作正常,我只是不熟悉物理。如果有人对如何顺利工作有任何建议,请告诉我。
谢谢!
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
float xx = -[acceleration x];
float yy = [acceleration y];
float z = -[acceleration z];
z = 1 - z;
NSString * zaxis = [NSString stringWithFormat:@"%f", z];
lblz.text = zaxis;
lbly.text = [NSString stringWithFormat:@"%f", yy];
lblx.text = [NSString stringWithFormat:@"%f", xx];
CGFloat newx;
CGFloat newy;
if (yy > 0)
{
newy = ball.center.y - ((1 - yy) * z);
}
else
{
newy = ball.center.y + ((1 - yy) * z);
}
if (xx > 0)
{
newx = ball.center.x - ((1 - xx) * z);
}
else
{
newx = ball.center.x + ((1 - xx) * z);
}
CGPoint newPoint = CGPointMake(newx, newy);
ball.center = newPoint;
答案 0 :(得分:0)
如果你想让它看起来更现实并利用现有的东西,看看一些现有的物理引擎和2d框架,Box2d和Cocos2d,但还有很多其他的。
答案 1 :(得分:0)
我认为你在这里弄乱的关键是加速度和速度之间的差异。您希望“倾斜量”作为加速度。每个框架的球速度应该通过加速度改变,然后球的位置应该由球速度改变。
所以只是在X中它应该是这样的:
float accelX = acceleration.x;
mVel.x += accelX; \\mVel is a member variable you have to store
ball.center.x += mVel.x;
---更复杂的版本
现在我想的越多,它可能不是你希望加速的“倾斜量”。您可能希望倾斜量为“目标速度”。但是你仍然希望使用加速来实现目标。
mTargetVel.x = acceleration.x;
//Now apply an acceleration to the velocity to move towards the Target Velocity
if(mVel.x < mTargetVel.x) {
mVel.x += ACCEL_X; //ACCEL_X is just a constant value that works well for you
}
else if(mVel.x > mTargetVel.x) {
mVel.x -= ACCEL_X;
}
//Now update the position based on the new velocity
ball.center.x += mVel.x;