Заставить мяч катиться с помощью 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;
2 ответа
Я думаю, что ключевая вещь, которую вы здесь запутываете, это разница между ускорением и скоростью. Вы хотите, чтобы "количество наклона" работало как ускорение. В каждом кадре скорость шаров должна меняться с ускорением, затем положение шаров должно меняться по скорости шаров.
Так что просто в 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;
Если вы хотите, чтобы это выглядело более реалистично и использовали существующие вещи, посмотрите на некоторые из существующих физических движков и 2d-фреймворков, Box2d и Cocos2d, но есть много других.