Спонсор: Microsoft
Опубликован: 10.04.2009 | Доступ: свободный | Студентов: 3247 / 243 | Оценка: 4.49 / 4.39 | Длительность: 17:21:00
Специальности: Программист
Самостоятельная работа 2:

2D-графика в XNA Game Studio 2.0.

Разработка класса для хранения графической информации

Создадим новый стандартный проект с именем P2_2. Добавим в проект изображение, которое мы создали выше (6.1).

Теперь подумаем, каким должен быть класс для представления игрового объекта. Сейчас нам нужен класс, объект которого сможет хранить текстуру спрайта и информацию о его позиции на экране. При необходимости этот список можно расширить – причем – как свойствами – так и методами. Но над подобным проектом мы будем работать на одном из следующих занятий. Ограничимся пока двумя вышеназванными свойствами.

Щелкнем по значку проекта P2_2 в панели Solution Explorer и выберем в появившемся меню пункт Add \Rightarrow Class. Появится окно добавления нового элемента, в котором будет выделен шаблон пустого класса (рис. 6.6.).

Добавляем в проект новый класс

увеличить изображение
Рис. 6.6. Добавляем в проект новый класс

Зададим имя новому классу – пусть это будет spriteClass, и нажмем кнопку Add. В проект будет добавлен новый пустой класс. Вот как выглядит наш проект после всех перечисленных действий (рис. 6.7.).

Внешний вид окна проекта после добавления нового класса

увеличить изображение
Рис. 6.7. Внешний вид окна проекта после добавления нового класса

Модифицируем код класса spriteClass следующим образом.

Во-первых, в раздел подключения пространств имен добавим директивы using, содержащие те пространства имен, которые содержат объявления типов данных, необходимых для хранения текстуры и ее позиции.

Во-вторых – создадим необходимые свойства класса.

В-третьих – построим конструктор класса, который будет инициализировать эти свойства.

Вот как выглядит код класса после всех модификаций (листинг 6.4.):

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework;

namespace P2_2
{
    class spriteClass
    {
        public Texture2D spTexture;
        public Vector2 spPosition;

        public spriteClass(Texture2D newSpTexture, Vector2 newSpPosition)
        {
            spTexture = newSpTexture;
            spPosition = newSpPosition;
        }
    }
}
Листинг 6.4. Код класса spriteClass

Здесь мы подключили к нашему классу пространство имен Microsoft.Xna.Framework.Graphics – оно нужно нам, так как содержит объявление типа данных Texture2D. Пространство имен Microsoft.Xna.Framework содержит объявление типа данных Vector2.

В раздел объявления свойств класса мы добавили две переменные. Переменная spTexture типа Texture2D используется для хранения текстуры, переменная spPosition типа Vector2 – для хранения данных о положении объекта на экране. В конструкторе класса мы инициализируем эти переменные значениями соответствующих типов, переданными при создании объекта типа spriteClass в основном тексте программы.

ПРИМЕЧАНИЕ. Свойства класса объявлены с модификаторами доступности public. Это значит, что мы сможем модифицировать эти свойства извне. В данном случае такой подход оправдан. Однако надо отметить, что при конструировании классов рекомендуется защищать свойства от прямой модификации или чтения. Для организации доступа к таким свойствам можно создавать дополнительные свойства-методы, пользуясь директивами get/set.

Теперь внесем изменения в основной текст игры, который расположен в файле Game1.cs. В листинге 6.5. приведены эти изменения с комментариями, указывающими на их местонахождение.

/// Объект mySpriteObj для хранения данных об изображении для вывода на экран
spriteClass mySpriteObj;
/// Добавляем в метод LoadContent команду создания нового объекта типа spriteClass. 
Передаем в качестве текстуры изображения текстуру, загруженную с помощью команды Content.Load, 
  в качестве позиции – новый объект типа Vector2
mySpriteObj = new spriteClass(Content.Load<Texture2D>("P2_1"), new Vector2(100f, 150f));
/// В метод Draw добавляем соответствующие вызовы методов объекта spriteBatch. 
Обратите внимание на то, что при вызове метода Draw мы пользуемся свойствами объекта mySpriteObj.
spriteBatch.Begin();
spriteBatch.Draw(mySpriteObj.spTexture, mySpriteObj.spPosition, Color.White);
spriteBatch.End();
/// В метод UnloadContent добавляем команды для освобождения системных ресурсов.
mySpriteObj.spTexture.Dispose();
spriteBatch.Dispose();
Листинг 6.5. Изменения, внесенные в код файла Game1.cs

Как видите, если сравнить предыдущий подход с хранением всех данных о выводимом изображении в классе Game1 и подход с хранением этих же данных в специально разработанном классе, можно заметить, что выделение отдельного класса для спрайта позволяет удобно организовывать все необходимые свойства и методы для работы с объектом.

Однако, и этот подход не является единственно возможным. Еще более интересный способ вывода изображений и создания игровых объектов – это создание игровых объектов на базе игровых компонентов.

Alina Lasskaja
Alina Lasskaja

Быть может кто-то из Вас знает игру Sims, к какому жанру она относиться? Жизненная симуляция, ролевая игра, там можно и дома строить.....