2011-05-05 64 views
1

我正在製作一個iphone應用程序,其中一個球將圍繞屏幕滾動,這取決於用戶如何傾斜設備。理論上,如果設備平躺在桌子上,球不會移動。如果設備傾斜完全向上,我希望球以最大速度直線向下滾動。速度取決於設備傾斜的平面位置距離多遠。此外,它也適用於用戶向右或向左或向上傾斜或四者的組合。我現在正在使用加速度計,並且球移動並且工作正常,我對物理學不太瞭解。如果有人對如何讓這個工作順利進行,請讓我知道。使用加速度計傾斜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

如果你想使它看起來更逼真,並充分利用現有的東西,看一些現有的物理引擎和2D框架,Box2D的和Cocos2d的,但也有許多其他問題。

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;