Робота з файлами - Все про XNA - Статті

Практично всі ігри використовують якісь зовнішні дані. Зокрема, переважна більшість ігор містить можливості збереження ігрового процесу у його поточному стані та його завантаження, ігри зберігають у зовнішніх файлах статистичні дані, завантажують із файлів додаткові рівні. XNA містить інструментарій для роботи з файлами. У цій лабораторній роботі ми розглянемо файлові операції, доступні в XNA, а також – серіалізацію об'єктів – потужний засіб, який можна використовувати для збереження та завантаження ігрових даних.

  • Навчитися працювати з файлами

Завдання роботи

  • Опанувати файлові операції в XNA
  • Освоїти серіалізацію об'єктів
  • Організувати завантаження та збереження гри

Файлові операції в XNA

Створимо новий проект P10_1. Реалізуємо в ньому демонстрацію наступних операцій із файлами:

  1. Створення нового файлу.
  2. Відкриття файлу та читання інформації з нього.
  3. Копіювання файлу.
  4. Перейменування файлу.
  5. Перегляд директорії.
  6. Видалення файлу.

Для роботи з файлами в XNA необхідно виконати такі кроки:

  • По-перше – отримати об'єкт типу IAsyncResult – як результат запиту про вибір пристрою зберігання інформації.
  • По-друге, змінна типу IAsyncResult використовується для створення змінної типу StorageDevice, яка представляє пристрій для зберігання даних.
  • По-третє, змінна типу StorageDevice використовується для створення об'єкта StorageContainer, який використовується для доступу до місця зберігання файлів. У випадку з Windows-іграми це папка SavedGames, розташована в папці Мої документи поточного користувача.

На рис.10.1. Ви можете бачити цю папку для проекту P10_1.

класу
Мал. 10.1. Папка для збереження гри

У лістингу 10.1. Ви можете знайти код класу Game1.

Лістинг 10.1. Код класу Game1

У звичайних файлах можна зберігати різні дані, зокрема – інформацію про рівні, інформацію для збереження гри тощо. Однак за такого підходу вся робота з відновлення необхідних даних лягає на програміста. Зручніше було б зберігати та відновлювати не окремі змінні чи поля об'єктів, а цілі об'єкти, які зберігають безліч полів, що використовуються у грі. Зробити це дозволяє серіалізація об'єктів.

Серіалізація об'єктів: збереження та завантаження гри Серіалізація об'єктів - це, іншими словами - збереження об'єкта у вигляді файлу. Серіалізований об'єкт можна відновити під час операції десеріалізації. У випадку комп'ютерних ігор серіалізацію зручно використовувати для збереження ігрової інформації. Щоб ефективно використовувати інструменти серіалізації в іграх, потрібно заздалегідь усвідомити, які саме об'єкти будуть серіалізовані. Бажано виділити для серіалізації особливі об'єкти, які міститимуть лише ту інформацію, збереження якої необхідно для успішного продовження ігрового процесу при десеріалізації відповідного об'єкта, тобто завантаження гри.

Гра, що передбачає можливість збереження ігрового стану, повинна передбачати щонайменше два режими роботи. Перший – коли гра починається спочатку – у разі поля класу, призначеного для серіалізації, заповнюються деякими заздалегідь заданими значеннями. У ході гри поля класу змінюються, відображаючи зміни, що відбулися під час ігрового процесу. Далі, після того, як об'єкт серіалізований, гра може абопочинатися спочатку або відновлювати свій стан на момент серіалізації. Розглянемо приклад збереження та відновлення стану гри на прикладі проекту P10_2.

Ігровий процес проекту, що наводиться тут, полягає в тому, що користувач повинен кликати мишею по плитках, які зникають після клацання по них. Завдання – створити механізм, який дозволить зберігати стан ігрового екрану у файлі та відновлювати цей стан. Ми не наводитимемо тут розробку ігрової логіки, меню та інших підсистем гри. Зосередимося на збереженні та завантаженні гри.

На рис. 10.2. Ви можете побачити вікно Project Explorer для проекту P10_2.

статті

Мал. 10.2. Вікно Project Explorer для проекту P10_2

  • Клас Game1 – це стандартний ігровий клас.
  • GameData – клас, що містить ігрові дані та призначений для серіалізації.
  • gBaseClass, Wall – класи для візуалізації ігрових об'єктів.

У лістингу 10.2. Ви можете бачити код класу GameData.

Лістинг 10.2. Код класу GameData

Зверніть увагу на атрибут Serializable – він вказує на те, що клас може бути серіалізованим. Від набору полів цього класу та від даних, що зберігаються в них, залежить розмір файлу, в якому зберігатиметься ігрова інформація. У нашому випадку клас містить масив типу Byte, який буде станом ігрового вікна на момент збереження гри.

Розглянемо класи gBaseClass і Wall (листинг 10.3., 10.4.) Ці класи ми використовували у проекті P5_1. Клас gBaseClass містить механізми для малювання компонента та розташування його на екрані, а клас Wall – нащадок класу gBaseClass – використовується для управління поведінкою об'єкта.

Лістинг 10.3. Код класуgBaseClass
Лістинг 10.4. Код класу Wall

Механізми серіалізації та ігрова логіка реалізовані у коді класу Game1. Його ви можете бачити у лістингу 10.5.

Лістинг 10.5. Код класу Game1

На рис. 10.3. Ви можете бачити ігровий екран проекту P10_2.

робота
Мал. 10.3. Ігровий екран проекту P10_2

Питання

1) У якій папці на ПК за замовчуванням зберігаються файли, які створюються в процесі роботи ігрового проекту?

2) Який тип має змінна, яка задає контейнер для зберігання ігрових файлів?

  • a. File
  • b. StorageContainer
  • c. FileStream
  • d. StorageDevice

3) Який тип має змінна, яка задає пристрій, що використовується для збереження файлів

  • a. File
  • b. StorageContainer
  • c. FileStream
  • d. StorageDevice

4) Що таке серіалізація об'єкта?

  • a. Знищення об'єкту
  • b. Збереження об'єкта у вигляді файлу
  • c. Відновлення стану об'єкта з файлу
  • d. Створення нового об'єкту

5) Що таке десеріалізація об'єкта?

  • a. Знищення об'єкту
  • b. Збереження об'єкта у вигляді файлу
  • c. Відновлення стану об'єкта з файлу
  • d. Створення нового об'єкту

6) Який атрибут повинен мати клас, що підлягає серіалізації?

  • a. [Serializable]
  • b. [AttributeUsage]
  • c. [Author]
  • d. [Deserializable]

7) Під час проектування класу, що підлягає серіалізації, рекомендується

  • a. Включати в клас якнайбільше властивостей, які зберігають всю інформацію про гру
  • b. Включати до класу лише ту інформацію, яка необхіднадля реалізації функцій збереження та завантаження гри

8) Який клас містить статичні методи, які зручно використовувати під час роботи з іменами файлів