При броске у вас есть два компонента.
Вертикальное ускорение, вызванное магией гравитации.Это будет ay.
Горизонтальная составляющая: без воздушного трения это постоянная скорость.
Допустим, вы бросаете мяч и вв момент выхода из вашей руки он имеет скорость 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)