我正在进行塔防游戏,而且我遇到了一些问题。我创建了一个抽象类Enemy,除了使用这些字段的几个方法外,还有这些字段。
public abstract class Enemy
{
public int currentX, currentY;
//currentX(and Y)PF are used for the pathfinder, they are currentX(and Y) - 1
public int currentXPF, currentYPF;
public int health;
public int velocity;
public int defense;
public String orientation;
这是Enemy类中的一个函数。
public boolean isDead(){
if(health == 0){
return true;
}
return false;
}
我想要做的是在子类中定义这些字段(这样我就可以为每种类型的敌人设置一个子类,而没有它们具有相同的值)但是我在实际使它工作时遇到了问题。 / p>
public class BasicEnemy extends Enemy
{
public int currentX, currentY;
public int velocity;
public int health;
public int defense;
public String orientation;
private static int bounty = 50;
public BasicEnemy(int currentX,int currentY, Board board) {
this.health = 3;
this.defense = 0;
this.velocity = 1;
this.currentX = currentX;
this.currentY = currentY;
this.currentXPF = currentX - 1;
this.currentXPF = currentY - 1;
this.orientation = "right";
//moveSelf is defined in superclass
this.moveSelf(board);
}
在另一个课程中,我有一个敌人列表和一个将敌人添加到列表中的功能
private List<Enemy> enemyList;
public void addEnemy(String type){
switch(type){
//probably not the best solution to use strings for this but whatever
case "basic":
enemyList.add(new BasicEnemy(startingX,startingY, this));
break;
}
}
当我尝试遍历我的敌人列表以查看是否有任何敌人死亡时,我的问题出现了
private void checkForDeadEnemies(){
List<Enemy> deadEnemies = new ArrayList<>();
for (Enemy enemy : enemyList){
if(enemy.isDead()){
deadEnemies.add(enemy);
}
}
for(Enemy enemy : deadEnemies){
enemyList.remove(enemy);
register.increaseBalance(enemy.getBounty());
notifyAllListeners();
}
}
目前我的问题是isDead()函数总是返回true,即使我的所有敌人都是BasicEnemy并且应该有3个生命值(因为他们还没有办法造成伤害)。
我假设isDead()函数使用Enemy类中的健康字段,该字段尚未设置为任何内容,而不是使用子类中的健康字段。
我不想使用抽象函数,因为如果我要制作几种类型的敌人会导致大量重复代码。 我基本上希望我的超类中的函数使用子类中的字段,或者将超类中的字段设置为子类中的值。
答案 0 :(得分:3)
您已在health
中定义了字段Enemy
,为什么还要在BasicEnemy
中定义该字段?从health
的任何子类中删除Enemy
字段,它将起作用。
答案 1 :(得分:1)
问题是因为你在声明子类和超类中的字段,所以子类最终会得到这些字段的2个副本,例如Enemy.currentX
和BasicEnemy.currentX
。 Enemy中的方法是检查Enemy
中声明的字段,但BasicEnemy
子类正在修改它自己的字段。删除BasicEnemy
中的重复声明,它应该可以正常工作。