Создание игр » Featured, Уроки » Создание игры. Игрок.
Создание игры. Игрок.
На самом деле не в каждой игре нужен сам персонаж игрока. Например, в таких играх, как физические головоломки или игры на наблюдательность, часто нет игрового персонажа. Но в создаваемой нами игре игровым персонажем будет являться космический корабль, которым управляет игрок. Что же должен уметь наш корабль, что мы должны учесть при создании игры, а точнее класса игрока? По меньшей мере, нам бы хотелось, что бы в процессе игры этот корабль мог летать. Под управлением игрока, естественно.
Создадим класс корабля игрока:
class CPlayerShip : public CLiveObject { //! Это текстура со спрайтом корабля CTexturePtr m_pTex; public: CPlayerShip(void); ~CPlayerShip(void); //! функция отрисовки void Draw(); //! Функция движения (управления) корабля void Scroll(float dx, float dy); }; |
Поскольку мы уже решили, что управление будет осуществляться с клавиатуры, задача перед нами стоит совсем не сложная и разработать систему ввода для нашей игры будет достаточно просто:
void ProcessUserInput(float fDeltaTime) { int dx=0; if (GetAsyncKeyState(VK_LEFT)&32768) dx--; // движемся влево if (GetAsyncKeyState(VK_RIGHT)&32768) dx++; // движемся вправо // двигаем сам корабль #define SHIP_SPEED 100 g_Player.Scroll(dx*SHIP_SPEED*fDeltaTime, 0); if (GetAsyncKeyState(VK_SPACE)&32768) ; // а тут потом будем стрелять } |
Ждали большего? Пока это всё ) У нас есть корабль игрока, он может двигаться по экрану влево/вправо, он управляется с клавиатуры, он имеет жизни и мы можем менять их количество через внешние интерфейсы. Полдела сделано )))
В следующем уроке о создании игр мы займёмся созданием звёздного фона для игры.
А проект с исходниками, текстурами и шейдерами к этой статье качайте здесь.
Раздел: Featured, Уроки · Теги: Создание игр
Небольшая придирка: лучше все-таки “const int ship_speed = 100″ вместо “#define”. Я бы даже предложил:
class CPlayerShip
{
public:
static int& get_base_speed() { return base_speed_; }
private:
static const int base_speed_;
};
Вернее, static const int& get_base_speed() const { return base_speed_; }
А зачем возвращать ссылку-то, вместо самого значения?
Вообще, этот метод, фактически C++-style замена дефайна. Оно, конечно, логично и правильно, по идее-то, но мне не нравится такой подход – видимо, сила привычки просто )
Ну, мы же на С++ пишем )
Ссылку не нужно, это я на автомате глупость сделал, тип же встроенный. А #define груб как инструмент, не хранит информацию о типе и, самое важное, не подчиняется правилам пространства имен. Это с такой переменной все просто, а с более общими названиями могут возникнуть конфликты.
Принадлежность к классу делает код более понятным – легко сказать, где в проекте эта константа определена, для работы с каким контекстом она предназначена.
Функция для возвращения дает место для подвешивания проверок в будущем и не замедляет работу (особенно если определена как inline).
Это собственный опыт плюс знания, взятые из книг Саттера и Мейерса.
Пускай мелочь, но мне она кажется важной, особенно в уроках.
Спасибо за блог еще раз. Это не критика, а желание скромными силами помочь сделать лучше.
Спасибо и Вам ) Думаю, если все читатели будут посильно помогать блогу – от этого он станет только лучше и полезнее
Вячеслав, хорошие уроки, правда, для меня не все понятно, думаю, и не только для меня. В общем, мне кажется, было бы не плохо, если бы Вы расписывали ЕЩЁ более подробно. Например, какой создаем файл, с каким названием, куда ложим,ну и что-то в этом роде. Как создавали Вы *exe файл, и т.д. и т.п. Надеюсь, Вы меня поняли. Это позволило бы совсем новичкам разобраться в этом. Если все это будет, то Ваши статьи станут бесценны!
Я пишу уроки для тех, кто хотя бы в общих чертах умеет программировать, на Си++ прежде всего. Писать уроки о том, как работать с Visual Studio или другими IDE, компиляторами и т.д. – думаю, смысла мало. Во-первых, они и так очень хорошо документированы, во-вторых, информация есть и на русском, и на английском, в-третьих, если погружаться в такие мелочи – до важных вещей можно ещё много лет не добраться )))
Поддерживаю! А то будем двигаться медленно. Кому не понятно как сделать ехе-файл Build/Build Solution . А вообще настолько стартовые вопросы НУ О-Ч-Е-Н-Ь подробно описаны во введении книги Фрэнк Д. Луна ВВЕДЕНИЕ В ПРОГРАММИРОВАНИЕ ТРЕХМЕРНЫХ ИГР С DirectX 9.0. (прочтение займёт не более 1 часа в прихлёбку с чашечкой кофе). и далее всё пойдёт как по маслу…
А Автору урока БОЛЬШОЕ спасибо! Кое что начинает проясняться
Товарищ автор, а можете ли вы выкладывать сюда полное описание и cpp файлов классов?
Что вы подразумеваете под “полным описанием” ? Если исходники – они полностью доступны в виде архивов – качайте и пользуйтесь.
я думаю надо компилировать примеры 32битым компилятором а то у меня на старом компе exe’ники не запускались, а 2008 экспресс студия отказывалась компилировать исходники и выдавала кучу ошибок(не предупреждения, а именно ошибок) по приведению типов, после исправления ничего не работает
Вроди всё понятно но вот в уроках я не видел описания “singleton.h”. Если можно можите в двух словах описать зачем он нужен?
Заранее спасибо.
Если в 2 словах, то singleton – “одиночка” – обеспечивает глобальный доступ и гарантирует единственный экземпляр. В более сложных реализациях – ещё управление временем жизни объекта и т.д.
http://ru.wikipedia.org/wiki/Singleton
http://www.rsdn.ru/article/patterns/singleton.xml
подробнее здесь:
если интересно, то всякие тонкости на киберфоруме.
Подскажите пожалуйста ответ на такой вопрос. Как сделать скроллинг изображения текстуры по поверхности спрайта. В DirektSprite есть простая возможность из большой текстуры брать нужные куски изображения.
При использовании в качестве спрайта плоскости созданной из полигонов так легко не получается. Как более правильно решить этот вопрос.
»crosslinked«