【问题标题】:Collison with Circles [closed]与圆圈碰撞[关闭]
【发布时间】:2016-08-18 12:36:30
【问题描述】:

我目前正在开展一个项目,用户必须使用 Spaceship(Sprite) 避开小行星(使用 ShapeRenderer 绘制)。小行星被保存在一个列表数组中。现在我正在尝试在 Sapceship 和 Asteroids 碰撞时创建碰撞方法。为了让它尽可能简单,我想在宇宙飞船周围画一个圆圈并检查碰撞。 Eclipse 说我有一个我有一个java.lang.IllegalStateException: begin must be called first

小行星类:

public Circle getBounds()
{
   return new Circle(p.x, p.y, radius);
}

小行星类:

public void update() 
{

    for (Asteroid a : asteroids) 
    {
        a.update(Gdx.graphics.getDeltaTime(), xMin, xMax, yMin, yMax);
    }

        for (int i = 0; i < anzahl; i++) 
        {

          Asteroid a1 = asteroids.get(i);

           for (int j = i + 1; j < anzahl; j++) 
           {

            Asteroid a2 = asteroids.get(j);

            float abstand = a1.abstand(a2);

            if (abstand < a1.getRadius() + a2.getRadius()) 
            {

                berechneKollision(a1, a2);

            }

        }

    }

}


public void render(ShapeRenderer renderer) 
{

    for (Asteroid a : asteroids) 
    {
        renderer.setColor(1, 1, 0, 1);
        renderer.circle(a.getP().x, a.getP().y, a.getRadius());
    }
}

宇宙飞船类:

 public Circle getBounds(){
    return new Circle(sprite.getX(), sprite.getY(), sprite.getWidth());
}

碰撞管理器:

    public class CollisionManager extends Asteroids {

       private Spaceship s = new Spaceship();

    public void checkCollisions(){
        for(int i = 0; i < asteroids.size(); i++)
        {
            if(asteroids.get(i).getBounds().contains(s.getBounds()))                        
            {
            //asteroids.remove(asteroids);
            System.out.println("KOLLISION");
            }
        } 
    }

}

屏幕:

public abstract class Screen {

    public abstract void create();

    public abstract void render(SpriteBatch batch);

    public abstract void update();

    public abstract void update(ShapeRenderer renderer);

    public abstract void update(OrthoCamera cam);

    public abstract void resize(int width, int height);

    public abstract void render(ShapeRenderer renderer);

    public abstract void dispose(int width, int height);

    public abstract void dispose();

    public abstract void pause();

    public abstract void resume();

    public abstract void checkCollisions();
}

菜单屏幕:

public class MenuScreen extends Screen {

   private OrthoCamera cam;
   private Spaceship spaceship;
   private Asteroids asteroids;
   CollisionManager cm;

   .
   .
   .

    public void checkCollisions() 
    {
    cm.checkCollisions();
    }

主类:

 public class MyGdxGame implements ApplicationListener {


SpriteBatch batch;
ShapeRenderer renderer;
OrthoCamera cam;
public static int WIDTH = 1080 , HEIGHT = 720; // resolution

@Override
public void create() {
    batch = new SpriteBatch();
    renderer = new ShapeRenderer();
    ScreenManager.setScreen(new MenuScreen());

}
@Override
public void render() {

    Gdx.gl.glClearColor(1, 1, 1, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    if(ScreenManager.getCurrentScreen() != null){
        ScreenManager.getCurrentScreen().checkCollisions();
        ScreenManager.getCurrentScreen().update();
        ScreenManager.getCurrentScreen().update(renderer);
        ScreenManager.getCurrentScreen().update(cam);

    }

    if(ScreenManager.getCurrentScreen() != null){
        ScreenManager.getCurrentScreen().render(batch);
        ScreenManager.getCurrentScreen().render(renderer);
    }
}

【问题讨论】:

  • 我看到的只是一大段代码,但我看不到你的问题...
  • 你真的给cm赋值了吗?
  • 在代码插入的匆忙中忘记了
  • 忘记创建 cm 的实例,但是现在我在 ShapeRenderer 有一个 IllegalStateException

标签: java android graphics libgdx


【解决方案1】:

你需要打电话

shaperenderer.begin(ShapeRenderer.ShapeType type)

画前和

shaperenderer.end();

在 astroids 类的渲染中绘制结束后。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多