Vector 需要我的游戏中2D轨道的帮助吗

Vector 需要我的游戏中2D轨道的帮助吗,vector,processing,game-physics,game-development,Vector,Processing,Game Physics,Game Development,在我正在制作的一个游戏中,我的想法是鼠标光标代表一个质心,并且有物体围绕着它旋转。 光标本身不是对象,并且光标与对象之间没有碰撞 理想的方法是,我可以输入目标的x和y坐标,也许还有轨道半径,然后物体进入轨道并不断加速 当我移动鼠标时,物体会跟着移动;当我停止它时,它会回到相同的轨道半径 对象的加速度也应该能够改变,从而使鼠标产生或多或少的质量 我认为实现这一点的最好方法可能是使用向量 在射弹类中,我给了每个射弹4个字段:x坐标、y坐标、PVector速度和PVector acc(加速度) 我尝试

在我正在制作的一个游戏中,我的想法是鼠标光标代表一个质心,并且有物体围绕着它旋转。 光标本身不是对象,并且光标与对象之间没有碰撞

理想的方法是,我可以输入目标的x和y坐标,也许还有轨道半径,然后物体进入轨道并不断加速
当我移动鼠标时,物体会跟着移动;当我停止它时,它会回到相同的轨道半径
对象的加速度也应该能够改变,从而使鼠标产生或多或少的质量

我认为实现这一点的最好方法可能是使用向量

在射弹类中,我给了每个射弹4个字段:x坐标、y坐标、PVector速度和PVector acc(加速度)

我尝试的第一件事是给物体恒定的加速度。速度矢量从零开始,计算加速度矢量,然后将其大小设置为某个值,并将其添加到速度矢量中。 这产生了非常大的轨道,缓慢的加速,当鼠标移动时,轨道就变大了

下一步,我试图使加速度增加,当它更接近质量中心时,受到实际行星的启发。这也不管用。轨道仍然太大,无法控制。有点失望,我试着让加速度不断增加,结果最好。轨道现在越来越小,但它只是不断减小到某个半径,然后停止。如果停止减小的半径是可配置的,这将是完美的,但无论参数如何,轨道总是太大,轨道大小一直缓慢地令人沮丧地减小。我的猜测是,加速度和速度以某种方式达到平衡,然后轨道停止下降

void move(float x,float y,float accm)
  {
    PVector target = new PVector(x, y);
    PVector ball = new PVector(this.x, this.y);
    acc = PVector.sub(target, ball);
    acc.setMag(accm);
    speed.add(acc);
    println(acc.mag() + " " + speed.mag());
    this.x = this.x + speed.x;
    this.y = this.y + speed.y;
  }
这是提供最佳结果的函数。在
draw()
中调用该函数:

draw()中

if(mousePressed==true)
{
对于(i=0;i 25)
n=0;
}

通过限制速度矢量并不断增加加速度矢量,幅值差开始增加,并且由于加速度矢量增加且速度矢量恒定且加速度矢量指向目标,矢量之和开始缓慢地越来越指向目标。如果(k<25)
存在限制加速度的条件,通过改变加速度的限制,你可以改变轨道半径。

我想你可能会更快地得到答案,并将你的问题表述为“如何在游戏中模拟重力?”

无论如何,我会尝试一下

在类射弹中,我给了每个射弹4个字段:x坐标、y坐标、PVector速度和PVector acc

到目前为止听起来不错,只是不需要将加速度向量与对象一起存储。您将在模拟的每个“记号”上为每个对象计算一个新的加速度向量

我会在这里使用标准的物理术语,并将每个物体的矢量称为
速度
,而不是
速度

下一步,我试图使加速度增加,当它更接近质量中心时,受到实际行星的启发

如果使用正确的算法计算轨道,这种行为应该会自然发生

你的“太阳”和“行星”都有质量。质量通过重力相互吸引,重力从

记住,
Force=mass*acceleration
,加速度为
a=m*G/d^2
,其中
m
是另一个物体(在本例中是太阳)的质量,
d
是两个物体之间的距离。因此,重要的部分是,由于重力作用,物体的加速度随两个物体之间距离的平方而变化

因此,模拟中单个刻度的基本算法如下所示:

  • 对于每个行星,计算一个加速度矢量
  • 使用到“太阳”的距离的平方作为加速度向量的大小(乘以一个常数,该常数取决于“引力常数”和太阳的质量),方向当然是从行星到太阳的方向
  • 将此加速度矢量添加到行星的速度矢量
  • 将速度矢量添加到行星的(x,y)位置,使其向前移动
对于每个模拟记号的长度、引力常数和太阳质量,有了适当的值,这应该开始看起来相当合理了

因为你假设行星都是独立的,不能碰撞,所以你可以对每一颗行星独立进行计算

然而,我认为游戏可能会更有趣,更准确的模拟。事实上,每一个物体对其他物体都有引力。这意味着在所有对象对上循环,并进行相同类型的加速度/速度/位置计算

游戏的重点可能是让“行星”从屏幕的一侧移动到另一侧,因为它们都相互影响,朝着不同的方向移动,因此启动配置变得越来越困难


为了使所有这些工作顺利进行,将“太阳”的质量设置为行星质量的数倍,并根据模拟的时间选择一个合理的引力常数值,这一点非常重要。您必须使用这些常量才能找到最佳结果。

我也对答案感兴趣,因此我将尝试帮助您获得一些答案。您可以添加Java标记作为最后一个res
if(mousePressed == true)
  {
    for(i=0;i<nproj;i++)
    {
      a[i].move(mouseX, mouseY,k);
    }
    k += n;
  }
void move(float x,float y,float accm)
  {
    PVector target = new PVector(x, y);
    PVector ball = new PVector(this.x, this.y);
    acc = PVector.sub(target, ball);
    acc.setMag(accm);
    vel.add(acc);
    this.x = this.x + vel.x;
    this.y = this.y + vel.y;
    vel.limit(15);
  }
if(mousePressed == true)
  {
    for(i=0;i<nproj;i++)
    {
      a[i].move(mouseX, mouseY,k);
    }
    k += n;
    if(k > 25)
    n = 0;
  }