我目前正在尝试制作一款简单的RPG-ish游戏。我希望怪物在地图上随机生成。我已将其设置为当我想要生成它时,它会被添加到名为ArrayList
的{{1}}中。我完成时会有许多不同类型的monsters
,每个人都有自己的类(例如Zombie,Ghost ......),每个类都有一个绘制怪物的方法,称为绘制。我想知道如何做到这一点。
monsters
是Monsters
所以它可以包含不同的类,但它不会让我做ArrayList<Object>
;这实际上是可能的,还是我是愚蠢的。
答案 0 :(得分:3)
您未能将对象ArrayList<Object>
强制转换回Monster
// Monster.get(i) == Object
// (Monster) Monsters.get(i) == Monster
// cast the list item i from Object to Monster
((Monster) Monsters.get(i)).draw();
更好的解决方案:
interface Monster {
void draw();
}
// implement draw on each
class Zombie implements Monster {}
class Ghost implements Monster {}
ArrayList<Monster> monsters = new ArrayList<>();
// legal
monsters.add(new Zombie());
monsters.add(new Ghost());
// legal
monsters.get(i).draw();
你可以上课 - &gt;扩展解决方案或此接口 - &gt;实现。无论哪种方式,这都是实现怪物的更好方法的一个非常简单的例子。
答案 1 :(得分:3)
是的,首先您需要创建一个界面,例如包含IMonster
方法的draw
。然后,让每个怪物类型实现这个界面。
您的ArrayList
将如下所示:
List<IMonster> monsters = new ArrayList<IMonster>();
monsters.add(new Ghost());
monsters.add(new Goblin());
所以这是一个例子:
import java.util.ArrayList;
import java.util.List;
public class Monsters {
private static List<IMonster> monsters = new ArrayList<IMonster>();
public static void main(String[] args) {
monsters.add(new Ghost());
monsters.add(new Goblin());
monsters.add(new Devil());
for (IMonster monster : monsters) {
monster.draw();
}
}
}
interface IMonster {
public void draw();
}
abstract class AbstractMonster implements IMonster {
@Override
public void draw() {
System.out.println("Shared drawing code for all monsters");
}
}
class Ghost extends AbstractMonster {
@Override
public void draw() {
super.draw();
System.out.println("Ghost drawing code");
}
}
class Goblin extends AbstractMonster {
@Override
public void draw() {
super.draw();
System.out.println("Goblin drawing code");
}
}
class Devil extends AbstractMonster {
@Override
public void draw() {
super.draw();
System.out.println("Devil drawing code");
}
}
答案 2 :(得分:1)
你必须像这样 -
从ArrayList中转换你的项目Object item = Monsters.get(i);
Monster monster = (Monster) item;
monster.draw();
或者你可以使用一些界面。您可以使用界面(例如Drawable
)。您的Monster
和其他可绘制类将实现它。然后使用ArrayList
的{{1}}。
Drawable