Как получить эффект столкновения или бодрости, когда мяч попадает на дорожку - PullRequest
2 голосов
/ 24 марта 2010
                        ** STILL NOT WORKING **

Я использую приведенную ниже формулу для перемещения шара по кругу, где accelX и accelY - значения от акселерометра, он работает нормально.

Но проблема в этом коде - mRadius (я установил его значение на 50), мне нужно изменить mRadius в соответствии со значениями акселерометра, а также мне нужен эффект отскока, когда он касается трека. В настоящее время я разрабатываю код, предполагая, что на доске только один шар.

float degrees = -atan2(accelX, accelY);
int x = cCentrePoint.x + mRadius * cos(degrees);
int y = cCentrePoint.y + mRadius * sin(degrees);

Вот снимок игры, которую я хочу развить:

Игра с мячом http://iphront.com/wp-content/uploads/2009/12/bdece528ea334033.jpg.jpg

Обновлено: я отправляю обновленный код ...

 mRadius = 5;
 mRange = NSMakeRange(0,60);

-(void) updateBall: (UIAccelerationValue) accelX 
                                  withY:(UIAccelerationValue)accelY
{

    float degrees = -atan2(accelX, accelY);
    int x = cCentrePoint.x + mRadius * cos(degrees);
    int y = cCentrePoint.y + mRadius * sin(degrees);

    //self.targetRect is rect of ball Object
    self.targetRect = CGRectMake(newX, newY, 8, 9);
    self.currentRect = self.targetRect;

    static NSDate *lastDrawTime;

    if(lastDrawTime!=nil)
    {
       NSTimeInterval secondsSinceLastDraw =
                    -([lastDrawTime timeIntervalSinceNow]);

       ballXVelocity = ballXVelocity + (accelX * secondsSinceLastDraw) 
               * [self isTouchedTrack:mRadius andRange:mRange];
       ballYVelocity = ballYVelocity + -(accelY * secondsSinceLastDraw) 
               * [self isTouchedTrack:mRadius andRange:mRange];

      distXTravelled = distXTravelled + secondsSinceLastDraw
                          * ballXVelocity * 50;
      distYTravelled = distYTravelled + secondsSinceLastDraw 
                          * ballYVelocity * 50;

      //Updating the ball rect  
      CGRect temp = self.targetRect;
      temp.origin.x += distXTravelled;
      temp.origin.y += distYTravelled;

      //calculating new radius after updating ball position
      int radius = (temp.origin.x - cCentrePoint.x) / 
                               cos(degreesToRadians(degrees));

     if( !NSLocationInRange(abs(radius),mRange))
     {
         //Colided with the tracks...Need a better logic here
      ballXVelocity = -ballXVelocity;
     }
     else
     {
           // Need a better logic here
       self.targetRect = temp; 
     }

  }

  [lastDrawTime release];
  lastDrawTime = [ [NSDate alloc] init];
}

В приведенном выше коде я инициализировал mRadius и mRange (указать трек) для некоторой константы для тестирования, я не получаю движение мяча, как ожидалось (эффект отскока при столкновении с треком) относительно акселерометра. Помогите мне распознать, где я ошибся, или прислать фрагменты кода или ссылки, которые выполняют аналогичную работу.

Я ищу лучшую логику, чем мой код, если вы нашли способ поделиться со мной.

Ответы [ 2 ]

2 голосов
/ 24 марта 2010

Если я правильно понимаю ваш код, то положение мяча напрямую контролируется ориентацией iPhone (наклон). Таким образом, наклон iPhone вправо приведет к тому, что мяч окажется на правой стороне дорожки (3 часа). Я полагаю, вы, возможно, захотите, чтобы шары ускорение (или, по крайней мере, его скорость) контролировались. Затем вы объединяете ускорение со скоростью и скорость для размещения с учетом ограничений (стенок рельса).

Как это настроено сейчас, я не понимаю, как бы вы контролировали более одного шара (согласно изображению, которое вы разместили).

Тогда для эффекта отскакивания: если вы имеете в виду отскок от стены дорожки, то это будет небольшая модуляция mRadius. Если вы имеете в виду отскок от другого шара, то вы должны модулировать угловое положение (посредством угловой скорости) двух шаров, чтобы отразить реакцию.

РЕДАКТИРОВАТЬ: для интеграции ускорения в скорость, а затем в положение, для этой игры , вы можете сделать с прямоугольной интеграцией 1-го порядка. Кроме того, будет более реалистичным сделать ускорение пропорциональным углу наклона. Учитывая значения ускорения от самого iPhone, вы можете назначить соотношение 1: 1 между ускоренными шариками и показаниями устройства. Итак, вы хотели бы что-то вроде:

BallAccX = AccelX * Am_I_NOT_touching_a_wall_in_X_direction() * Ka
BallVelX = BallVelX + BallAccX * dT * Kv
BallPosX = BallPosX + BallVelX * dT * Kp

Примечание: приведенные выше формулы для скорости и положения: аппроксимация 1-го порядка , но их должно быть достаточно для этой игры.

Ka, Kv, Kp - некоторые коэффициенты пропорциональности. Выберите их, чтобы сделать связь между ощущаемым ускорением и движением мяча, как вам нравится. dT - разница во времени между обновлениями состояния мяча. Функция Am_I_NOT_touching_a_wall_in_X_direction () возвращает 1, если мяч может свободно перемещаться горизонтально (в направлении наклона), и 0 в противном случае.

Расчеты для движения Y симметричны.

0 голосов
/ 06 декабря 2010

После многих попыток я подумал, что не так просто создать эффект в реальном времени, не используя физический движок. Так что лучше использовать BOX2d или Бурундуки или любые другие физические движки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...