当前位置: 首页 > 知识库问答 >
问题:

在libgdx中创建圆形动态观察

於鸿羲
2023-03-14

我正在尝试在我的游戏中实现重力。我目前有一个月球,它应该绕着一颗行星运行(在我的游戏中都使用了细胞类)。

使用以下代码(缩短):

在类单元格中:

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;
}

在类重力场中:

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;
}

因此,对于我的重力场,我基本上将拖动向量应用于拉动的单元格。

在细胞中,细胞被移动到重力器上

 pos.add(drg);

并朝着自己的运动方向

pos.add(vel);

在我的 orbit() 方法中,我试图找到并设置 vel 以形成一个圆形轨道。

我的问题是我无法找到一个完美的轨道。月球仍然轻微地,并且随着距离的缩小,越来越向行星加速。

我不明白为什么它不起作用。我使用正确的公式吗?

我用过的写出来:

v= sqrt((M*m)/r) 对于我的轨道向量速度 f = M*m/r^2 对于向行星倾斜的力 a= f/m 对于向行星的加速度

谢谢你的帮助!

共有1个答案

南门正祥
2023-03-14

这很简单。您将需要2种纹理,您的轨道和月球。你所要做的就是继续旋转月球在轨道上。

如果您正在使用精灵,您可以这样做:

sprite.setRotation(rotationVaue);
rotationValue+=1;

但是这里需要注意的一件非常重要的事情是两个图像应该具有相同的分辨率。

我最近做了同样的事情,我甚至在堆栈溢出上问了一个问题,这是链接:

圆弧的碰撞检测

 类似资料:
  • 问题内容: 我想制作一个圆形的大拇指和大拇指向下的按钮。 我应该使用ImageView还是Button作为超类? 我将如何在Swift中做到这一点? 问题答案: 这是一个圆形按钮示例: 斯威夫特3: Swift 2.x:

  • 我试图对上皮细胞空间的内部进行建模,但我被困在圆柱形空间内部边缘的运动中。基本上,我正在尝试实现StickyBorders,并将这些边界上的代理保留在我正在创建的圆柱形空间中。 有没有办法在Repast Simphony中使用柱坐标?我找到了这个例子(https://www.researchgate.net/publication/259695792_An_Agent-Based_Model_of

  • 在我的情况下,矩形接触圆形,但我认为没关系。 起初,我试着用两个Ficture来做同样的身体,但旋转有一个问题:我不能有一个带旋转的Ficture,另一个没有。 我认为,它应该与关节有某种联系,但我不知道我应该使用什么关节。也许还有其他解决方案?

  • 我想将方形图像转换为圆形图像,但当我应用“边框半径:50px”时,它给了我椭圆形的形状。我尝试了很多东西,但都不起作用。任何帮助都将不胜感激。这是我的超文本标记语言代码- <代码> 这是我的CSS代码- 这是我的图片在网站上的样子。我希望它们有一个圆形。

  • 问题内容: 我做了一个绘制椭圆并相互链接的迷你代码,现在我尝试移动椭圆(圆),但是我在编码时遇到了问题 移动两个圆圈,并且直线一定不能移动(Graph节点),请帮帮我,谢谢:)更新后(感谢MadProgrammer),现在我可以移动所有 图形了 问题答案: 基本上,因为可以使用而不是使用 这将确保整个组件被重新粉刷。 虽然我不反对使用repaint(int, int),因为您的绘画过程相对简单,但

  • 我花了数小时寻找解决方案:我正在用libgdx开发一个自上而下的小游戏(可能这与我使用的引擎有关)。现在我必须在我的角色(圆形)和墙(矩形)之间实现碰撞检测。如果可以滑动,我希望角色在碰撞时沿着墙滑动。让我解释一下: 如果我向上移动45度,我可能会撞到墙的下面、左边或角落。 如果我与左边相撞,我想停止x运动,只向上移动。如果我离开墙壁,那么我想继续向上移动。与下侧相同(停止y运动) 如果我与角落相