2013-12-05 3 views
0

Прежде всего, я не знаю, правильно ли это имя для вопроса. Я просто не мог найти лучшего, который не слишком длинный. Я пишу игру RPG в Java, и я только начал кодировать генератор случайного уровня. Моя идея - создать некоторые перечисленные типы (назовем их DungeonStyle), которые содержат всю информацию, необходимую генератору для создания уровня. Эта информация включает, например, плотность комнат и коридоров. Другая информация, которую я хочу сохранить в этом перечисленном типе, - это то, какие существа могут быть порождены плиткой Spawner внутри такого уровня. Я также должен сказать, что способ, которым я реализовал существ, заключался в создании класса для каждого конкретного существа, которое наследуется от класса Существо. Теперь я объясню проблему (которая применима для любых нестатических объектов, а не только для существ).Управление ресурсами в игре

Единственный способ найти это разделение возможных существ DungeonStyle в коде SpawnerTile. Я бы передал DungeonStyle в качестве аргумента для конструктора SpawnerTile и сделал бы различия внутри метода spawn(). Что-то вроде этого:

if (style == Style_A) { 
    level.add(new Creature_A()); 
} 

if (style == Style_B) { 
    level.add(new Creature_B()); 
} 

Это будет работать нормально, но, очевидно, не так, как я хотел. Информация о существе не внутри DungeonStyle. Он создается за его пределами. Я просто не могу найти способ сохранить возможные классы (of Creatures) внутри DungeonStyle, чтобы сделать их экземплярами. Я думаю, что мой вопрос несколько связан с «<>», когда мы создаем ArrayList< some_object>.

+0

Вы можете использовать 'newInstance' метод' Class' pbjects, но имейте в виду: http://stackoverflow.com/questions/195321/почему-это-класса newinstance зла – Sinkingpoint

ответ

0

Вы можете использовать перечисление возможных монстров, делая что-то вроде

abstract class MonsterAbstract {//Class that all Monsters extend 
    .... 
} 
enum Monster { 
    FOO, BAR; 
    public MonsterAbstract spawn() { 
     switch(this) { 
      case FOO: return new Foo(); 
      case BAR: return new Bar(); 
      default: return null; //should never get here 
     } 
    } 
} 
void SpawnerTileSpawn(Set<Monster> allowedMonsters) {//allowedMonsters stored within DungeonStyle 
    for (Monster m : allowedMonsters) { 
     m.spawn(); 
    } 
} 
Смежные вопросы