Java 在太空入侵者风格的游戏中使用ArrayLIst创建子弹对象
我目前正在开发一款太空入侵者风格的游戏,但我遇到了一点麻烦,因为有多个子弹的例子。目前我只能开一辆。我一直在尝试让它与数组列表一起工作,但我似乎无法让它工作。我发现它最接近工作状态的地方是,它发射了多发子弹,但它们都是从同一个位置产生的,因为子弹并没有从船的位置产生。当我移除一个超过边界的物体时,游戏也崩溃了。谁能帮我看看哪里出了问题。这是我到目前为止已经完成的一些代码,注释掉的部分是我试图让数组列表工作的部分Java 在太空入侵者风格的游戏中使用ArrayLIst创建子弹对象,java,arraylist,slick2d,Java,Arraylist,Slick2d,我目前正在开发一款太空入侵者风格的游戏,但我遇到了一点麻烦,因为有多个子弹的例子。目前我只能开一辆。我一直在尝试让它与数组列表一起工作,但我似乎无法让它工作。我发现它最接近工作状态的地方是,它发射了多发子弹,但它们都是从同一个位置产生的,因为子弹并没有从船的位置产生。当我移除一个超过边界的物体时,游戏也崩溃了。谁能帮我看看哪里出了问题。这是我到目前为止已经完成的一些代码,注释掉的部分是我试图让数组列表工作的部分 import java.util.ArrayList; import
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);
}
}
}
import java.util.ArrayList;
导入org.newdawn.slick.Input;
导入org.newdawn.slick.Graphics;
导入org.newdawn.slick.GameContainer;
公共类播放器扩展实体
{
私人内部速度=5;
私人ArrayList公告列表;
私有布尔触发;
私人子弹;
公共玩家()
{
bullet=新bullet();
//bulletList=新的ArrayList();
本文件为setImage(“船舶”);
此设置位置(350450);
这个。设置尺寸(100100);
这是createRectangle();
}
@凌驾
public void entityLogic(GameContainer gc,int deltaTime)
{
Input=gc.getInput();
if(input.isKeyDown(input.KEY_A))
{
这个.x-=速度;
}
if(input.isKeyDown(input.KEY\u D))
{
这个.x+=速度;
}
if(input.isKeyDown(input.KEY_W))
{
这个.y-=速度;
}
if(input.isKeyDown(input.KEY_))
{
这个.y+=速度;
}
如果(按输入键isKeyPressed(输入键_空格))
{
发射=真;
bullet.x=this.getX()+40;
//BulletList.add(新的Bullet());
}
如果(发射)
{
/*执行项目符号的逻辑*/
//对于(项目符号b:项目符号列表)
//{
//b、 实体逻辑(gc、deltaTime);
//}
//沿y轴负向移动项目符号
bullet.entityLogic(gc、deltaTime);
}
}
@凌驾
公共空间实体招标(图g)
{
g、 drawImage(this.getImage()、this.getX()、this.getY());
如果(发射)
{
/*绘制列表中的每个项目符号对象*/
//对于(项目符号b:项目符号列表)
//{
//b、 整体招标(g);
//}
项目符号。整个招标(g);
}
}
}
首先,忘记您的Bullet
实例变量。你不需要它,清单就足够了
另一件事是,您可以使用LinkedList
而不是ArrayList
,因为您不需要随机访问,并且必须频繁添加和删除项目,当您迭代项目符号以检查冲突时,请使用ListIterator
并动态删除它们
最后,它应该是这样的:
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);
}
}
列表项目符号=新建ArrayList();
public void entityLogic(GameContainer gc,int deltaTime){
//因为这个方法被调用了很多次,所以你应该每X毫秒发射一颗子弹
如果(按空格键){
//你根据玩家的位置产生一个新的子弹
子弹=新子弹(player.x,player.y);
//您可以将其添加到列表中
项目符号。添加(项目符号);
}
//销毁视口外的子弹
对于(int i=0;i
这只是给你一个基本的想法
我不知道slick2d以及它如何管理渲染线程和逻辑线程,如果它们是两个不同的线程,那么您应该使用一个同步列表,例如:
List<Bullet> bullets = Collections.synchronizedList(new ArrayList<Bullet>());
List项目符号=Collections.synchronizedList(新的ArrayList());
首先,忘记您的Bullet
实例变量。你不需要它,清单就足够了
另一件事是,您可以使用LinkedList
而不是ArrayList
,因为您不需要随机访问,并且必须频繁添加和删除项目,当您迭代项目符号以检查冲突时,请使用ListIterator
并动态删除它们
最后,它应该是这样的:
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);
}
}
列表项目符号=新建ArrayList();
public void entityLogic(GameContainer gc,int deltaTime){
//因为这个方法被调用了很多次,所以你应该每X毫秒发射一颗子弹
如果(按空格键){
//你根据玩家的位置产生一个新的子弹
子弹=新子弹(player.x,player.y);
//您可以将其添加到列表中
项目符号。添加(项目符号);
}
//销毁视口外的子弹
对于(int i=0;i
这只是给你一个基本的想法
我不知道slick2d以及它如何管理渲染线程和逻辑线程,如果它们是两个不同的线程,那么您应该使用一个同步列表,例如:
List<Bullet> bullets = Collections.synchronizedList(new ArrayList<Bullet>());
List项目符号=Collections.synchronizedList(新的ArrayList());
谢谢。这就解决了问题。我不知道我怎么没看到。我想假期过后我开始生锈了。谢谢。这就解决了问题。我不知道我怎么没看到。我想假期过后我开始生锈了。