Создание игр » Featured, Уроки » Создание игры. Живые объекты.
Создание игры. Живые объекты.
В нашей первой игре будет как минимум два типа живых объектов: игровые враги и сам игрок. У этих типов игровых объектов будет немало общего: у обоих будет вестись подсчёт жизней, оба типа объектов будут находиться где-то в игровом мире (иметь координаты), оба смогут двигаться по экрану. Но будут и отличия, например, объект “игрок” будет управляться с калвиатуры (или мыши), а враги будут управляться их собственным АИ.
Ввиду того, что часть свойств (точнее функционала) объектов будет одинаковой, я решил сделать отдельный класс, который назвал “живой объект”. Этот класс будет обеспечивать нас базовым функционалом и для игрока, и для игровых противников, а именно:
- Будет вести подсчёт жизней
- Будет иметь функцию для уменьшения этих жизней
- Позволит проверять, жив ли ещё объект (жизней больше нуля)
- Будет хранить текущую позицию объекта
- И позволит её менять (своим наследникам)
Выглядеть этот базовый класс живых игровых объектов будет примерно вот так:
//! Класс живого объекта class CLiveObject { private: // приватные данные int m_iHealth; // количество жизней D3DXVECTOR2 m_vPos; // позиция на экране protected: // защищённые методы, доступ только наследникам void Move(float dx, float dy); // сдвинуть на dx, dy void Move(const D3DXVECTOR2 delta); // сдвинуть на delta void MoveTo(const D3DXVECTOR2 pos); // задать новую позицию public: // публичные методы класса CLiveObject(D3DXVECTOR2 pos, int iHealth=100); virtual ~CLiveObject(void); // вирт. деструктор void DoDamage(const int iDamage); // наносим повреждения bool IsAlive() const; // ещё жив (жизней больше 0) ? D3DXVECTOR2 Pos() const; // текущая позиция }; |
Наследуя от него другие классы (игрока и врагов), мы, тем самым, избавимся от лишней писанины и дублирования кода как минимум в двух местах. Это вообще хорошая практика – выносить общие части кода в отдельные классы, шаблоны, функции. Используйте такие возможности почаще – обычно такой код проще и разрабатывать и поддерживать (т.е. развивать дальше, находить ошибки).
А вот и cpp-файл:
#include "StdAfx.h" #include "LiveObject.h" CLiveObject::CLiveObject(D3DXVECTOR2 pos, int iHealth) : m_vPos(pos), m_iHealth(iHealth) CLiveObject::~CLiveObject(void) { } void CLiveObject::DoDamage( const int iDamage ) { m_iHealth -= iDamage; // уменьшаем жизни } bool CLiveObject::IsAlive() const { return ( m_iHealth > 0 ); // жизней больше нуля? } void CLiveObject::Move( float dx, float dy ) { Move(D3DXVECTOR2(dx, dy)); } void CLiveObject::Move( const D3DXVECTOR2 delta ) { m_vPos += delta; } void CLiveObject::MoveTo( const D3DXVECTOR2 pos ) { m_vPos = pos; } D3DXVECTOR2 CLiveObject::Pos() const { return m_vPos; } |
Сорцов к этому уроку не будет – всё необходимое есть выше по тексту.
Раздел: Featured, Уроки · Теги: Планирование, Создание игр