我试图将一个球扔成一个圆弧,无论是向左还是向右弧。
这是我的代码:
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;
它实际上看起来不像是“弧形”,它似乎更像是一条对角线?
答案 0 :(得分:3)
投掷时你有两个组成部分。
由重力魔法引起的垂直加速度。这将是一个。
水平分量:没有空气摩擦,这是一个恒定的速度。
假设你扔球,在离开手的那一刻,它的速度为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)
答案 1 :(得分:0)
方程是(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为负。
答案 2 :(得分:0)
一些事情:(免责声明:我根本不熟悉动作脚本,但我做了几场需要投掷弧线的游戏。)
首先,cos和sin都有-1和1之间的界限。通常x以像素为单位绘制,因此将x改变0.5不会明显产生差异。此外,由于x应该是一个int,它甚至不会显示。
其次,计算这种物理所需的计算能力可能不是必要的 - 也许是你正在进行精确的物理模拟。
还要考虑Hyperboreus的第二个评论:水平通常是不变的。因此,假设这是横向卷轴式的,您需要改变y分量而不是x。