Как бросить мяч по дуге? - PullRequest
2 голосов
/ 27 мая 2011

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

Вот мой код:

var gravity = 2;
this.velocity.y += gravity;
                _angle = 5;
                var theta:Number;
                switch(_direction) {
                    case "left":
                        theta = _angle * Math.PI/180;
                        this.velocity.x = Math.cos(theta) - Math.sin(theta);
                    break;

                    case "right":
                        theta = _angle * Math.PI/180;
                        this.velocity.x = Math.cos(theta) - Math.sin(theta)
                    break;
                }

                this.x += this.velocity.x;
                this.y += this.velocity.y;

На самом деле это не похоже нашар вообще "искривляется", кажется, это больше диагональная линия?

Ответы [ 3 ]

3 голосов
/ 27 мая 2011

При броске у вас есть два компонента.

  1. Вертикальное ускорение, вызванное магией гравитации.Это будет ay.

  2. Горизонтальная составляющая: без воздушного трения это постоянная скорость.

Допустим, вы бросаете мяч и вв момент выхода из вашей руки он имеет скорость v0 = (v0x, v0y) и находится в положении p0.Тогда v0x будет постоянным для всего времени.

Скорость мяча в момент времени t будет v (t) = (v0x, v0y + t * ay)

Для каждого тика вашегоанимации, добавьте deltat * v (t) к текущей позиции мяча, и вы должны быть установлены.

Каждый раз, когда мяч подпрыгивает, вы должны отражать вектор его скорости на отскочившей поверхности и вычитать некоторую процент его общей энергии (Ekin + Epot, хотя Epot будет 0, если он находится на земле, а земля имеет нулевой потенциал), чтобы получить логарифмическое подпрыгивание.

Если вы хотитевоздушное трение тоже, просто вычитайте некоторый небольшой процент от общей энергии с каждым тактом анимации.

Вот некоторый код, не в ActionScript, но я надеюсь, что читаемый.(Параметры для ctor оба Vector2d; clone () используется неявно, но вы можете догадаться, что он делает):

class Vector2d:
    def __init__ (x, y):
        self.x = x
        self.y = y

    def add (other):
        self.x += other.x
        self.y += other.y

    def mulScalar (scalar):
        self.x *= scalar
        self.y *= scalar

    def mulVector (vector) # NOT the cross product
        self.x *= vector.x
        self.y *= vector.y

class BouncingBall:
    AGRAV = ? #gravitational acceleration (mg)
    DELTAT = ? #time between ticks
    ELASTICITY = ? Elasticity of ball/floor

    def __init__ (self, pos, v):
        self.pos = pos
        self.v = v

    def tick (self):
        deltapos = self.v.clone ()
        deltapos.mulScalar (DELTAT)
        self.pos.add (deltapos)
        if self.pos.y <= 0: #bounce
            self.pos.y = 0 #adjust ball to ground, you need to choose DELTAT small enough so nobody notices
            self.v.mulVector (1, -1) #mirror on floor
            self.v.mulScalar (ELASTICITY)
        self.v.add (0, AGRAV * DELTAT)
0 голосов
/ 27 мая 2011

Пара вещей: (отказ от ответственности: я совсем не знаком с ActionScript, но я сделал пару игр, требующих бросать дуги.)

Во-первых, cos и sin имеют границы между -1 и 1Как правило, x отображается в пикселях, поэтому изменение x на 0,5 не приведет к заметным изменениям.Кроме того, поскольку x должен быть целым числом, он даже не будет отображаться.

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

Также рассмотрим второй комментарий Гиперборея: горизонталь обычно постоянна.Таким образом, предполагая, что это боковой скроллер, вам нужно будет изменить компонент y, а не x.

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

Уравнения (V = скорость, t = время истекло, x0, y0 = координаты точки запуска):

x = x0 + Vt * cos(angle)
y = y0 + Vt * sin(angle) - (g * t^2) / 2
                           -------------
                                  ^
                this is gravity effect, without this
                   the trajectory would be a line

Вам не нужно различать левое и правое, для одного направленияV положительный, для другого V отрицательный.

...