Заставить мяч катиться с помощью iphone, наклоненного с помощью акселерометра - PullRequest
1 голос
/ 05 мая 2011

Я создаю приложение для 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;

Ответы [ 2 ]

0 голосов
/ 06 мая 2011

Я думаю, что ключевая вещь, которую вы здесь запутываете, это разница между ускорением и скоростью.Вы хотите, чтобы «количество наклона» работало как ускорение.В каждом кадре скорость мяча должна меняться в зависимости от ускорения, затем позиция шарика должна меняться в зависимости от скорости мяча.

Так что в 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;
0 голосов
/ 05 мая 2011

Если вы хотите, чтобы это выглядело более реалистично и использовали существующие вещи, посмотрите на некоторые из существующих физических движков и 2d-фреймворков, Box2d и Cocos2d, но есть и много других.

...