Использование ArrayLIst для создания объектов маркеров в игре в стиле космических захватчиков
В настоящее время я работаю над игрой в стиле космических захватчиков, но у меня возникли некоторые проблемы с пулями. На данный момент я могу стрелять только один. Я пытался заставить его работать со списком массивов, но я просто не могу заставить его работать. Самое близкое, что я получил к работе, было то, что он выпустил несколько пуль, но все они порождались из того же места, что и пули, не появлялись по отношению к положению кораблей. Игра также вылетала, когда я удалял объект после того, как он превысил границу. Может кто-нибудь помочь мне увидеть, где я иду не так. Вот некоторый код, который я до сих пор комментировал, это мои попытки заставить работать список массивов.
import java.util.ArrayList;
import org.newdawn.slick.Input;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.GameContainer;
public class Player extends Entity
{
private int speed = 5;
private ArrayList<Bullet> bulletList;
private boolean firing;
private Bullet bullet;
public Player()
{
bullet = new Bullet();
//bulletList = new ArrayList<Bullet>();
this.setImage("ship");
this.setPosition(350,450);
this.setDimenseions(100, 100);
this.createRectangle();
}
@Override
public void entityLogic(GameContainer gc, int deltaTime)
{
Input input = gc.getInput();
if(input.isKeyDown(Input.KEY_A))
{
this.x -= speed;
}
if(input.isKeyDown(Input.KEY_D))
{
this.x += speed;
}
if(input.isKeyDown(Input.KEY_W))
{
this.y -= speed;
}
if(input.isKeyDown(Input.KEY_S))
{
this.y += speed;
}
if(input.isKeyPressed(Input.KEY_SPACE))
{
firing = true;
bullet.x = this.getX()+40;
//BulletList.add(new Bullet());
}
if(firing)
{
/*Carries out the logic for the bullet*/
//for(Bullet b : bulletList)
//{
//b.entityLogic(gc, deltaTime);
//}
//Moves the bullet negativly along the y axis
bullet.entityLogic(gc, deltaTime);
}
}
@Override
public void entityRendering(Graphics g)
{
g.drawImage(this.getImage(), this.getX(), this.getY());
if(firing)
{
/*Draws each bullet object in the list*/
//for(Bullet b : bulletList)
//{
//b.entityRendering(g);
//}
bullet.entityRendering(g);
}
}
}
1 ответ
Прежде всего забудьте о своем Bullet bullet
переменная экземпляра. Вам это не нужно, список достаточно.
Другое дело, что вы могли бы использовать LinkedList
вместо этого ArrayList
потому что вам не нужен произвольный доступ, и вы должны часто добавлять и удалять элементы, когда вы перебираете маркеры для проверки на столкновение, используйте ListIterator<T>
и удалить их на лету.
Наконец это должно быть что-то вроде:
List<Bullet> bullets = new ArrayList<Bullet>();
public void entityLogic(GameContainer gc, int deltaTime) {
// since this method is called many times you should shoot a bullet just every X msec
if (spacebar pressed) {
// you spawn a new bullet according to player position
Bullet bullet = new Bullet(player.x,player.y);
// you add it to the list
bullets.add(bullet);
}
// destroy bullets which are outside the viewport
for (int i = 0; i < bullets.size(); ++i) {
Bullet bullet = bullets.get(i);
if (bullet.isOutsideBounds()) {
bullets.remove(i);
i--;
}
}
public void entityRendering(Graphics g) {
for (Bullet bullet : bullets)
bullets.entityRenering(g);
}
}
Это просто чтобы дать вам основную идею.
Я не знаю slick2d и как он управляет потоками рендеринга и логики, если это два разных потока, то вы должны использовать синхронизированный список, например:
List<Bullet> bullets = Collections.synchronizedList(new ArrayList<Bullet>());