2015-07-12 80 views
2

我目前正在尝试做一个简单的RPG游戏。我想让怪物在地图上随机产卵。我已经设置好了,所以当我想要一个产卵时,它会被添加到名为monstersArrayList。到我完成时我会有许多不同类型的monsters,并且每个人都有自己的班级(如僵尸,幽灵......),每个班级都会有一种方法来绘制名为绘制的怪物。我想知道我该如何做到这一点。多类型定制arraylist

MonstersArrayList<Object>所以这将是能够有它不同的类,但它不会让我做Monsters.get(i).draw();这实际上是可能的,还是我是愚蠢的。

+3

使用_every_怪兽类型应该具有的每种方法创建一个名为'Monster'的接口,然后将列表声明为'List monsters'。 – Tom

+0

它是一个类型化ArrayList吗?怪物类是否使用绘制方法共享一个基础怪物类? –

+0

如果您发布了一些实际的代码,即使它无法正常工作,它也会非常有帮助。 – sstan

回答

3

您未能投的对象ArrayList<Object>回怪物

// 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(); 

你可以用类去 - >扩展的解决方案或该接口 - >工具。无论哪种方式,这是一个更好的方式来实现你的怪物一个非常裸露的例子。

+0

更好地使用不需要类型转换的接口 – Constantin

+0

*“您未能取消装箱对象”*是“unbox”这里的正确单词吗?是不是“铸造”更正确,因为“unbox”更可能是unie /拳击primitve类型的包装类型? – Tom

+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

不要忘记你的声明中实际上有一个变量名。 :) – sstan

+1

并尝试总是使用接口的变量类型,所以'列表'而不是'ArrayList '。 – Tom

+0

谢谢,这帮了很多! – Rufr

1

你要投你的项目从这样的ArrayList中获取 -

Object item = Monsters.get(i); 
Monster monster = (Monster) item; 
monster.draw(); 

或者更好的你可以使用一些接口。您可以使用一个接口(例如Drawable)。你的Monster和其他可绘制类将实现它。然后使用DrawableArrayList

interface Drawable{ 
    public void draw(); 
} 

public class Monster implements Drawable { 

    public void draw(){ 
     //implementation of monster's draw 
    } 
} 
... 
... 

ArrayList<Drawable> monsters = new ArrayList<Drawable>(); 
... 
... 
monsters.get(i).draw();