我正在尝试在游戏中实现Gravity。 我目前有一个应该围绕行星运行的月球(在我的游戏中都使用了Cell类)。
使用(缩短)以下代码:
在课程单元格中:
private Cell graviator;
private Vector2 pos;
private Vector2 vel;
private Vector2 drg;
private int mass;
private float drgSpeed;
private GravityField grav=new GravityField(this);
public void move(){
calculateDrag();
if(orbiting){
orbit();
}
pos.add(vel);
pos.add(drg);
}
private void calculateDrag() {
drg.scl(drgSpeed);
}
private void orbit(){
Vector2 temp=new Vector2(drg.x,drg.y);
temp.rotate90(0);
temp.nor();
speed=(float)Math.sqrt((mass+graviator.getMass())/getGraviatorDistance()); // v= sqrt((M*m)/r)
temp.scl(speed);
vel=temp;
}
GravityField课程:
private Cell cell;
public void computeGravity(Cell cell2) {
float force = getForce(cell2);
if (cell != cell2.getGraviator()) {
if (cell2.getMass() < cell.getMass()) {
if (force > cell2.getLargestForce()) {
cell2.setGraviator(cell);
cell2.setLargestForce(force);
cell2.setDrg(getDragVector(cell2));
cell2.setDrgAcc(getAcceleration(cell2));
}
}
} else {
cell2.setLargestForce(force);
cell2.setDrg(getDragVector(cell2));
cell2.setDrgAcc(getAcceleration(cell2));
}
}
public Vector2 getDragVector(Cell cell2) {
Vector2 temp = new Vector2(cell.getPos().x - cell2.getPos().x, cell.getPos().y - cell2.getPos().y);
temp.nor();
return temp;
}
public Vector2 getDirection(Cell cell2) {
return new Vector2(cell.getPos().x - cell2.getPos().x, cell.getPos().y - cell2.getPos().y);
}
public float getDistance(Vector2 direction) {
return direction.len();
}
public float getForce(Cell cell2) {
Vector2 temp = new Vector2(cell.getPos().x - cell2.getPos().x, cell.getPos().y - cell2.getPos().y);
return cell.getMass() * cell2.getMass() / (temp.len() * temp.len()); //f = M*m/r^2
}
public float getAcceleration(Cell cell2) {
Vector2 temp = new Vector2(cell.getPos().x - cell2.getPos().x, cell.getPos().y - cell2.getPos().y);
float force = cell.getMass() * cell2.getMass() / (temp.len() * temp.len());
float acceleration = force / cell2.getMass(); // a= f/m
return acceleration;
}
因此,使用我的GravityField,我基本上将一个dragVector应用于拉出的Cell。
在Cell中,使用
将细胞移向graviator pos.add(drg);
并朝着自己的moveVector vel
pos.add(vel);
在我的orbit()方法中,我试图找到并设置vel来制作一个圆形轨道。
我的问题是我不知何故无法完成一个完美的轨道。月亮仍然是微微的,缩小的距离逐渐加速到地球。
我无法弄清楚它为什么不起作用。我使用正确的公式吗?
写完我用过:
我的OrbitVector速度 v= sqrt((M*m)/r)
f = M*m/r^2
对于朝向地球的力量。a= f/m
<select>
<option value="volvo">Volvo (30.000)</option>
<option value="saab">Saab (40.000)</option>
<option value="opel">Opel (15.000)</option>
<option value="audi">Audi (45.000)</option>
</select>
<select>
<option value="dog">Dog (300)</option>
<option value="cat">Cat (50)</option>
<option value="fish">Fish (5)</option>
</select>
向地球加速
感谢您的帮助!
答案 0 :(得分:0)
这很简单。你需要2个纹理,你的轨道和月亮。你要做的就是让月球在轨道上旋转。
如果您正在使用精灵,您可以这样做:
sprite.setRotation(rotationVaue);
rotationValue+=1;
但这里要注意的一件非常重要的事情是图像应该具有相同的分辨率。
我最近做了同样的事情,我甚至在stackoverflow上问了一个关于它的问题,这里是链接: