Я хочу получить начальную точку маркера, но не могу сделать ее окончательной, а 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();
}
}
}
}
Мой 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 extension Circle, хотя это сделало бы замену пули на нечто вроде прямоугольника немного более сложной, если вы когда-нибудь решите это сделать.
Тогда вы можете хранить дополнительную информацию. Это также позволяет вам перенести некоторое поведение в этот класс вместо того, чтобы делать все внутри вашего класса MyGame. Это всегда хорошо, так как облегчает понимание кода.