Уроки Коммент.

Создание игр » Новости » Создание игры. Игрок.

Создание игры. Игрок.

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

Создадим класс корабля игрока:

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)
		; // а тут потом будем стрелять
}

Ждали большего? Пока это всё ) У нас есть корабль игрока, он может двигаться по экрану влево/вправо, он управляется с клавиатуры, он имеет жизни и мы можем менять их количество через внешние интерфейсы. Полдела сделано )))

В следующем уроке о создании игр мы займёмся созданием звёздного фона для игры.

А проект с исходниками, текстурами и шейдерами к этой статье качайте здесь.

Ещё по этой теме:




Раздел: Новости

14 комментариев на "Создание игры. Игрок."
  1. Just guest пишет:

    Небольшая придирка: лучше все-таки “const int ship_speed = 100″ вместо “#define”. Я бы даже предложил:
    class CPlayerShip
    {
    public:
    static int& get_base_speed() { return base_speed_; }
    private:
    static const int base_speed_;
    };

  2. Just guest пишет:

    Вернее, static const int& get_base_speed() const { return base_speed_; }

    1. Вячеслав пишет:

      А зачем возвращать ссылку-то, вместо самого значения?

      Вообще, этот метод, фактически C++-style замена дефайна. Оно, конечно, логично и правильно, по идее-то, но мне не нравится такой подход – видимо, сила привычки просто )

      1. Just guest пишет:

        Ну, мы же на С++ пишем )

        Ссылку не нужно, это я на автомате глупость сделал, тип же встроенный. А #define груб как инструмент, не хранит информацию о типе и, самое важное, не подчиняется правилам пространства имен. Это с такой переменной все просто, а с более общими названиями могут возникнуть конфликты.
        Принадлежность к классу делает код более понятным – легко сказать, где в проекте эта константа определена, для работы с каким контекстом она предназначена.
        Функция для возвращения дает место для подвешивания проверок в будущем и не замедляет работу (особенно если определена как inline).
        Это собственный опыт плюс знания, взятые из книг Саттера и Мейерса.

        Пускай мелочь, но мне она кажется важной, особенно в уроках.

        Спасибо за блог еще раз. Это не критика, а желание скромными силами помочь сделать лучше.

        1. Вячеслав пишет:

          Спасибо и Вам ) Думаю, если все читатели будут посильно помогать блогу – от этого он станет только лучше и полезнее ;-)

  3. Никита пишет:

    Вячеслав, хорошие уроки, правда, для меня не все понятно, думаю, и не только для меня. В общем, мне кажется, было бы не плохо, если бы Вы расписывали ЕЩЁ более подробно. Например, какой создаем файл, с каким названием, куда ложим,ну и что-то в этом роде. Как создавали Вы *exe файл, и т.д. и т.п. Надеюсь, Вы меня поняли. Это позволило бы совсем новичкам разобраться в этом. Если все это будет, то Ваши статьи станут бесценны!

    1. Вячеслав пишет:

      Я пишу уроки для тех, кто хотя бы в общих чертах умеет программировать, на Си++ прежде всего. Писать уроки о том, как работать с Visual Studio или другими IDE, компиляторами и т.д. – думаю, смысла мало. Во-первых, они и так очень хорошо документированы, во-вторых, информация есть и на русском, и на английском, в-третьих, если погружаться в такие мелочи – до важных вещей можно ещё много лет не добраться )))

      1. Yar пишет:

        Поддерживаю! А то будем двигаться медленно. Кому не понятно как сделать ехе-файл Build/Build Solution . А вообще настолько стартовые вопросы НУ О-Ч-Е-Н-Ь подробно описаны во введении книги Фрэнк Д. Луна ВВЕДЕНИЕ В ПРОГРАММИРОВАНИЕ ТРЕХМЕРНЫХ ИГР С DirectX 9.0. (прочтение займёт не более 1 часа в прихлёбку с чашечкой кофе). и далее всё пойдёт как по маслу…

        А Автору урока БОЛЬШОЕ спасибо! Кое что начинает проясняться :)

  4. b2soft пишет:

    Товарищ автор, а можете ли вы выкладывать сюда полное описание и cpp файлов классов?

    1. Вячеслав пишет:

      Что вы подразумеваете под “полным описанием” ? Если исходники – они полностью доступны в виде архивов – качайте и пользуйтесь.

  5. Danil пишет:

    я думаю надо компилировать примеры 32битым компилятором а то у меня на старом компе exe’ники не запускались, а 2008 экспресс студия отказывалась компилировать исходники и выдавала кучу ошибок(не предупреждения, а именно ошибок) по приведению типов, после исправления ничего не работает

  6. ShineKami пишет:

    Вроди всё понятно но вот в уроках я не видел описания “singleton.h”. Если можно можите в двух словах описать зачем он нужен?
    Заранее спасибо.

    1. Yar пишет:

      Если в 2 словах, то singleton – “одиночка” – обеспечивает глобальный доступ и гарантирует единственный экземпляр. В более сложных реализациях – ещё управление временем жизни объекта и т.д.
      подробнее здесь:
      http://ru.wikipedia.org/wiki/Singleton
      http://www.rsdn.ru/article/patterns/singleton.xml

      если интересно, то всякие тонкости на киберфоруме.

  7. Антон пишет:

    Подскажите пожалуйста ответ на такой вопрос. Как сделать скроллинг изображения текстуры по поверхности спрайта. В DirektSprite есть простая возможность из большой текстуры брать нужные куски изображения.
    При использовании в качестве спрайта плоскости созданной из полигонов так легко не получается. Как более правильно решить этот вопрос.

    »crosslinked«

Оставить комментарий

*

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>