Бросай мяч, используя cocos2d, но без физического движка - PullRequest
0 голосов
/ 27 января 2012

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

спасибо

Ответы [ 2 ]

2 голосов
/ 27 января 2012

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

В типичном случае (с понижениемсила тяжести), у вас будет непостоянная скорость в направлении y и постоянная скорость в направлении x, отсюда следующий код:

-(void) update: (ccTime) dt
{
    // Step only the y-velocity
    velocity_y += GRAVITY * dt; 
    // Step the position values and update the ball sprite position accordingly
    ball.position.x += velocity_x * dt;
    ball.position.y += velocity_y * dt;
}

Затем, когда обнаруживается событие удара,

  1. Захватить скорость пролистывания (вам нужно будет рассчитать изменение положения касания пальцем в текущем и последнем кадре)
  2. Умножить скорость на коэффициент масштабирования, если необходимо.
  3. Установите * speed_x * и * speed_y * на эти начальные значения.
0 голосов
/ 27 января 2012

Для этого я использую формулы движения снаряда, http://en.wikipedia.org/wiki/Projectile_motion, вместе с действиями кокосов. Здесь у вас есть возможный подход:

  • Первый

Реализация подкласса CCActionInterval, который получает параметры формулы снаряда и обновляет позицию снаряда. В этом случае ProjectileAction. Вот ключевые методы, которые вам нужно переопределить:

-(void) startWithTarget:(id)target
{
    self.initialPosition = [target position];
    self.elapsedTime = 0;
    [super startWithTarget:target];
}


-(void) update: (ccTime) tt
{   
    self.elapsedTime += tt;
    float t = self.elapsedTime;
    float theta = CC_DEGREES_TO_RADIANS(self.angle);
    float v0 = self.velocity;
    float g = self.gravitationalAcceleration;
    double x = v0 * cos(theta) * t;
    double y = v0 * sin(theta) * t - 0.5 * g * t * t ;
    [self.target setPosition: ccp(self.initialPosition.x + (float)x, self.initialPosition.y + (float)y)];

}
  • Второй

Используйте жест смахивания, чтобы распознать скорость, которая будет соответствовать начальной скорости мяча в приведенном выше уравнении и параметру theVelocity ниже. Я оставляю эту часть тебе.

  • Третий

Запустить действие. т.е. * +1025 *

    ProjectileLaunch* action = [ProjectileLaunch actionWithDuration:10 
                                                              angle:45
                                                    initialVelocity:theVelocity
                                                                  g:9.8];
    [sprite runAction:action];

Надеюсь, это вам поможет.

Привет.

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