簡體   English   中英

Java awt為什么我只能刪除鏈表的最新添加

[英]Java awt Why can I only remove most recent addition to Linked List

我正在為大學計算機科學項目用Java awt創建一個太空射擊游戲。

我通過計時器每3秒鍾產生一次的敵人被添加到LinkedList ,並且for loop將它們全部渲染。

在我為玩家的子彈對象准備的課程中,有if語句來檢查激光是否進入敵人的范圍,如果它們全部成立,它將從LinkedList移除敵人。

但是,僅刪除了LinkedList最新添加的內容。 子彈穿過其他子彈,什么也沒發生。 這是我第一次玩游戲,也是我第一次使用LinkedList ,因此請諒解。

控制器類控制敵人, Laser類是子彈, Enemy類是Enemy 還有一個播放器,Main和GUI類。

import java.awt.*;
import java.util.LinkedList;
import java.util.Timer;
import java.util.TimerTask;

public class Controller
{

private LinkedList<Enemy> e = new LinkedList<Enemy>();

Enemy tempEnemy, tempEnemy2
;
Main main;
int refreshSpawn = 3000;    //move timer refresh rate
int xpos;
int width;
int ypos;
int height;
Timer spawnTimer = new Timer();

public Controller(Main main)
{
    this.main = main;
    spawn();
}
public void spawn()
{
    spawnTimer.schedule(new TimerTask()
    {
        public void run()   //run method and timer
        {
            addEnemy(new Enemy(main, (int)(Math.random()*4+2)));
        }
    }, 0, refreshSpawn);
}
public void render(Graphics g)
{
    for(int i = 0; i < e.size(); i++)
    {
        tempEnemy = e.get(i);
        xpos = tempEnemy.getX();
        width = tempEnemy.getXsize();
        ypos = tempEnemy.getY();
        height = tempEnemy.getYsize();
        tempEnemy.render(g);
    }
}
public void update()
{
    for(int i = 0; i < e.size(); i++)
    {
        tempEnemy2 = e.get(i);
        tempEnemy2.move();
    }
}
public void addEnemy(Enemy enemy)
{
    e.add(enemy);
    System.out.println(e.size());
    //spawn();
}
public void removeEnemy()
{
    e.remove(tempEnemy);
}
public int getX()
{
    return xpos;
}
public int getY()
{
    return ypos;
}
public int getXsize()
{
    return width;
}
public int getYsize()
{
    return height;
}
public Enemy getEnemy()
{
    return tempEnemy;
}
}
import java.awt.*;

public class Enemy
{
Image ship; //image of enemy ship
int x, y;   //ship position
int speed;

public Enemy(Main main, int speed)  //constructing enemy
{
    this.speed = speed;
    ship = main.getImage(main.getDocumentBase(), "enemyShip"+(int)(Math.random()*6+1)+".png");  //picture for enemy ship
    x = (int)(Math.random()*900+1); //enemy has a starting position at a random x point
    y = -100;   //start ship slightly off screen so it doesn't suddenly appear
}
public void move()
{
    y += speed;
    if(y > 600)
    {
        y = -100;
        x = (int)(Math.random()*900);
    }
}
public void render(Graphics g)
{
    g.drawImage(ship, x, y, null);
}
public int getX()
{
    return x;
}
public int getY()
{
    return y;
}
public int getXsize()
{
    return ship.getWidth(null);
}
public int getYsize()
{
    return ship.getHeight(null);
}
}
import java.awt.*;

public class Laser
{
Image img;  //image of laser
int laserSpeed = 10;    //speed of laser
int x, y;   //position of laser
int xSize, ySize;   //size of laser
Controller cont;
GUI gui;
public Laser(Image img, int x, int y, Controller cont, GUI gui) //constructing laser
{
    this.cont = cont;
    this.img = img; //setting laser image
    this.gui = gui;
    xSize = x;  //size of laser
    ySize = y;  //size of laser
}
public void shoot(int x, int y, int shipSize)
{
    this.x = x + (shipSize/2) - (xSize/2);
    this.y = y;
}
public void move()
{
    y -= laserSpeed;
    if(x <= cont.getX() + cont.getXsize() && x + xSize >= cont.getX() - cont.getXsize())
    {
        if(y <= cont.getY() + cont.getYsize() && y > 0)
        {
            remove();
            cont.removeEnemy();
            gui.scoreUp(5);
        }
    }
}
public int getX()
{
    return x;
}
public int getY()
{
    return y;
}
public int getXSize()
{
    return xSize;
}
public int getYSize()
{
    return ySize;
}
public Image getImage()
{
    return img;
}
public void remove()
{
    y = -ySize;
    x = -100;
}
}

據我所知, tempEnemyrender方法分配給LinkedList的最后一個元素。 這意味着,當您調用removeEnemy它將刪除最后一個渲染的對象(可能是您添加的最后一個對象)。

您應該做的就是告訴Controller它應該使用哪個Enemy ,當您調用它時,它絕對不知道您的意圖是什么...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM