Я работал над небольшой игрой, связанной со словами для 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()
для их загрузки, но я чувствую,как это плохо по двум причинам:
- Загрузка точно в момент использования может привести к задержке ??
- Может закончиться загрузкой более одного раза.
Я действительно хочу, чтобы 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.