Как отделить и управлять динамическими ресурсами в XNA? (Дизайн) - PullRequest
0 голосов
/ 17 января 2012

Я работал над небольшой игрой, связанной со словами для Windows, используя XNA 4.0 и C #.Слова можно редактировать с помощью отдельного редактора форм Windows (НЕ XNA).

Класс Word (который можно сериализировать) содержит следующие объекты:

    String WordName
    HashSet<String> PictureFilenames_Set; // this is a list of png file names for what the picture looks like
    HashSet<String> AudioFilenames_Set; // this is a list of wav file names for pronounciation

Однако в игрекартинки загружаются в Texture2D, а звук загружается в объекты SoundEffect.

Я пытаюсь создать хороший модульный код, убедившись, что класс Word не содержит ничего, что по сути не привязано к XNA или какграфика отображается.При этом я задаюсь вопросом, как поступить с созданием определенной части XNA.

Как вы думаете, было бы неплохо что-то подобное?

base class SpriteEntity
-- Position x, y
-- Scale
-- Display(gametime)
-- Logic(gametime)

base class SpriteEntity_2D : SpriteEntity
-- Int32 ActiveFrame
-- List<Texture2D> Textures;
-- override Display(gametime) { show the Texture2D }
-- override Logic(gametime) { ... }

ПРИМЕЧАНИЕ: Как вы думаете,это странно, имея SpriteEntity и SpriteEntity_2D?Я сделал это только для того, чтобы у меня также был SpriteEntity_3D для 3d-моделей.

class WordSprite : SpriteEntity_2D
-- ctor WordSprite (Word word)

So, for example, if there was an instance of a Word called `AppleWord` in which:
Word.WordName = "apple"
WordSprite apple = new WordSprite( AppleWord )

Then I can just set position and display it.
apple.X = ..., apple.Y = ...

В конструкторе WordSprite он может проверять Word.PictureFilenames_Set и использовать Texture2D.FromStream() для их загрузки, но я чувствую,как это плохо по двум причинам:

  1. Загрузка точно в момент использования может привести к задержке ??
  2. Может закончиться загрузкой более одного раза.

Я действительно хочу, чтобы WordSprite проверил пользовательский ResourceManager, который содержит Dictionary класс имен файлов ресурсов, это было бы лучше?

Но в идеале все возможные ресурсы должныбыть загруженным в начале.

Может быть, у меня должен быть метод с именем LoadResourcesFromWordList( List<Word> wordlist ), который просматривает список слов, доступных в игре, и в это время он должен запускать файлы и вызывать:

ResourceManager.LoadTexture2DResource( filename )
ResourceManager.LoadWaveFileResource( filename )

, который загружает все в Dictionary<object> Resources.

Чем я могу перегрузить оператор индекса [], чтобы пользователь мог просто вызвать:

ResourceManager[ name_of_resource ]

Затем, когда вы создаете новый WordSprite, он просто делает что-тоНапример, в ctor:

    foreach( string pictfile in Word.PictureFilenames_Set ) 
    { 
        WordTextureList.add( ResourceManager[pictfile] ) 
    }

Извините за ОГРОМНУЮ ДЛИНУ этого поста, это был своего рода ход мыслей.Я очень плохо умею создавать хороший модульный код, и я всегда догадываюсь сам.Это кажется нормальным с точки зрения ОО-дизайна или я слишком усложняю вещи?

Большое спасибо за вашу помощь !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

- zoombini

PS Может кто-нибудь порекомендовать хорошую книгу, в которой рассматриваются такие вещи, как модульность, дизайн, OOс точки зрения гейм-дизайнера?Это не обязательно должно быть связано с C # или XNA.

1 Ответ

0 голосов
/ 18 января 2012

Я бы не беспокоился о том, чтобы SpriteEntity_2D и SpriteEntity_3d были отдельными классами. Я думаю, что ваш общий дизайн довольно хорош, но трудно сказать, не зная всей масштабности проекта. Если вы еще этого не сделали, вам следует прочитать о компонентных системах для игр. Здесь есть кое-что хорошее: https://stackoverflow.com/questions/1901251/component-based-game-engine-design

Кроме того, хорошая книга по дизайну (конкретно не связанная с играми) - http://www.amazon.com/First-Design-Patterns-Elisabeth-Freeman/dp/0596007124/ref=sr_1_sc_1?s=books&ie=UTF8&qid=1326855704&sr=1-1-spell

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...