如何获得每个子弹的起点? Libgdx简单的游戏

时间:2014-06-12 22:56:44

标签: java android c++ arrays libgdx

我想获得子弹的起点,但我无法使其成为最终,并且bullet.x和bullet.y总是在变化,所以我不知道如何保存每个的起始坐标子弹。它在一个随机的地方产生然后移动。我已经尝试将bullet.x和bullet.y保存到变量启动时但是当子弹移动时也会发生变化

这是我的代码: -

public class MyGame extends ApplicationAdapter {
SpriteBatch batch;
Texture ballImage, bulletImage;
OrthographicCamera cam;
Circle ball, bullet;
Array <Circle> bullets;
//long lastShot;

@Override
public void create ()
{
    System.out.println("game created");
    ballImage = new Texture(Gdx.files.internal("ball.png"));
    bulletImage = new Texture(Gdx.files.internal("bullet.png"));

    cam = new OrthographicCamera();
    cam.setToOrtho(true,320,480);//true starts top left false starts bottom left

    batch = new SpriteBatch();  

    ball = new Circle();
    ball.radius=20;
    ball.x=320/2-ball.radius; // half screen size - half image
    ball.y=480/2-ball.radius;

    bullets = new Array<Circle>();
    spawnBullet();

}

public void spawnBullet()
{
    Circle bullet = new Circle();
    bullet.radius=8;
    bullet.x=bullet.radius; // half screen size - half image
    bullet.y=MathUtils.random(0, 480-bullet.radius);
    bullets.add(bullet);
    System.out.println("x: "+bullet.x+" Y: "+bullet.y);

}

@Override
public void render ()
{
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    cam.update();
    batch.setProjectionMatrix(cam.combined);
    batch.begin();
    batch.draw(ballImage,ball.x-ball.radius,ball.y-ball.radius);
    for(Circle bullet: bullets)
    {
        batch.draw(bulletImage, bullet.x-bullet.radius, bullet.y-bullet.radius);
    }
    batch.end(); 

    if(Gdx.input.isTouched())
    {           
        Vector3 pos = new Vector3();
        pos.set(Gdx.input.getX(), Gdx.input.getY(),0);
        cam.unproject(pos); 
        ball.y = pos.y ;    
    }


    if(ball.y<0+ball.radius)ball.y=ball.radius;
    if(ball.y>480-ball.radius)ball.y=480-ball.radius;

    Iterator<Circle> i = bullets.iterator();    

     while(i.hasNext())
    {

        Circle bullet = i.next();   
        //System.out.println("x2: "+bullet.x+" Y2: "+bullet.y);


        if(bullet.y>240){
        bullet.x++;
        bullet.y--;}

        bullet.x++;

        //right border collision
        if(bullet.x>320)
        {
            i.remove();
            spawnBullet();
        }
         //circle collision
            if(ball.overlaps(bullet))
            {
            i.remove();
            spawnBullet();
            }   
    } 
}   
  }

1 个答案:

答案 0 :(得分:3)

我的libgdx有点生疏。也就是说,这看起来像一个相当规律的设计问题。从本质上讲,你的MyGame课程试图做太多,这意味着解决其中的问题很困难。

现在,您尝试使用圆圈作为子弹,这意味着您只能获得Circle类提供的内容。您希望存储额外信息并向圈子添加行为,因此您应该创建一些可以执行此操作的内容。我建议创建一个Bullet类,如下所示:

public class Bullet {
    private Circle circle;
    private int startX;
    private int startY;

    public Bullet(int startX, int startY){
        circle = //create circle from startX and startY
        this.startX = startX;
        this.startY = startY;
    }
    //getters and setters here...
}

你也可以使用Bullet扩展圆圈,但如果你决定将子弹改成像矩形的东西稍微更难一些。

然后您可以存储其他信息。它还允许您将某些行为移动到该类中,而不是在MyGame类中执行所有操作。这总是好的,因为它使代码更容易理解。