Как научиться писать игры на С++, часть 3

Третья программа позволит управлять точкой при помощи клавиатуры. Предыдущие две: раз и два. Для того, чтобы управлять точкой, нужно координаты x и y сохранить в памяти копьютера, для этого нужно дать ячейкам памяти имена. Чтобы ячейке, которая может хранить целое число, дать имя "a" и сразу занести туда число 50 достаточно написать

int a = 50;

Именованная таким образом ячейка памяти называется переменной. Имена переменных можно указывать вместо чисел, например при указании координат точки при вызове Plot.

int a = 50; int b = 50; Plot(a, b);

Число, которое лежит в этой именованной ячейке памяти, называется значением переменной. Значение переменной можно менять, например можно записать в переменную b значение 10 вот так:

b = 10;

А можно записать в переменную b значение, вычисленное перед этим как старое значение переменной b плюс 1:

b = b + 1;

Чтобы значение переменной изменялось при нажатии кнопки со стрелкой направо клавиатуры, нам понадоятся условный оператор if и функция проверки состояния кнопок. Работает это так: если нажата кнопка со стрелкой направо, код которой передан в функцию проверки состояния кнопок, то выполнится код, написанный в фигурных скобках после условного оператора if и произойдет увеличение значения переменной a на 1:

if (IsKeyDown(5)) { a = a + 1; }

Коды кнопок со стрелками налево, направо, вверх и вниз - 4, 5, 6 и 7. У всех остальных кнопок тоже есть коды, посмотреть список кодов можно например вот тут.

До сих пор все наши программы выполнялись последовательно, в том порядке в котором написан код, при этом в конце выполнения программы изображение появлялось на экране и при нажатии на любую кнопку программа завершалась. Но мы не хотим, чтобы программа рисования завершалась при нажатии на кнопки со стрелками, программа должна показывать изображение на экране и снова проверять, нажаты ли кнопки. Для показа изображения на экране необходимо вызвать функцию ShowFrame(); А для того, чтобы программа продолжила выполняться с нужного нам места, само это место нужно пометить меткой, то есть дать название, а потом написать инструкцию перехода к метке - goto. Вся программа может выглядеть вот так:

int a = 50; int b = 50; start: if (IsKeyDown(5)) { a = a + 1; } Plot(a, b); ShowFrame(); goto start;

Теперь программа не будет сама завершаться и при нажатии кнопки со стрелкой направо будет рисоваться линия.

Чтобы можно было двигать точку не только направо, но и вниз, в программу следует добавить соответствующее условие и изменение значения переменной, хранящей координату у

int a = 50; int b = 50; start: if (IsKeyDown(5)) { a = a + 1; } if (IsKeyDown(7)) { b = b - 1; } Plot(a, b); ShowFrame(); goto start;

Таким же образом можно добавить обработку нажатий на кнопки налево и наверх.
А еще можно добавить смену цвета используемого при рисовании или проигрывание звуков.

Если написать программу, проигрывающую звуки при нажатии кнопок, то легко заметить, что пока звучит звук, выполнение Beep не заканчивается, и это мешает играть аккорды. Используйте вызов BeepAsync, его выполнение заканчивается когда звук только начинает проигрываться и дальше звук играется асинхронно, пока программа продолжает выполняться.

Для того, чтобы сделать перемещение точки без рисования, можно добавить переменную, назовем ее f. Значение 0 в переменной f будет означать, что включен режим рисования, а значение 1 - что включен режим перемещения точки. В режиме перемещения точки перед изменением координат достаточно в старое положение точки рисовать черную точку. Черный цвет имеет код 0.

Стоит ли писать продолжение?
Нет
Да, я учусь писать игры на С++ по этому гайду
Да, я учу ребенка писать игры на С++ по этому гайду
Да, я просто читаю и мне интересно
121121 показ
232232 открытия
16 комментариев

Было бы интересно почитать про более адекватные библиотеки и движки, а не arctic engine. Я вообще в первый раз слышу об этом. Это вообще кто-то использует? Ни видосов, ни статей по теме не нашел. Зачем какая-то ноунейм либа без комьюнити, если есть большие проекты с поддержкой и сообществом, которое всегда поможет

Ответить

Посмотрим на простые задачи. Как загрузить и вывести картинку на экран в arctic engine и в SDL2?

arctic engine:

Sprite hero;
hero.Load("hero.tga");
...
hero.Draw(x, y);


SDL2:

std::string imagePath = getResourcePath("Lesson1") + "hero.bmp";
SDL_Surface *bmp = SDL_LoadBMP(imagePath.c_str());
if (bmp == nullptr) {
SDL_DestroyRenderer(ren);
SDL_DestroyWindow(win);
std::cout << "SDL_LoadBMP Error: " << SDL_GetError() << std::endl;
SDL_Quit();
return 1;
}
SDL_Texture *tex = SDL_CreateTextureFromSurface(ren, bmp);
SDL_FreeSurface(bmp);
if (tex == nullptr) {
SDL_DestroyRenderer(ren);
SDL_DestroyWindow(win);
std::cout << "SDL_CreateTextureFromSurface Error: " << SDL_GetError() << std::endl;
SDL_Quit();
return 1;
}
...
int w, h;
SDL_QueryTexture(tex, NULL, NULL, &w, &h);
SDL_Rect dst(x, y, w, h);
SDL_RenderCopy(ren, tex, NULL, &dst);

Ну то есть arctic engine позволяет делать игру, а SDL2 позволяет изучать SDL2

Ответить

Arctic engine отличается тем, что с ним простые вещи делать действительно просто, и при этом принципиально не может возникнуть ситуации когда что-то сделать совершенно невозможно. Лучше всего arctic engine подходит для создания простых 2д игр и знакомства с программированием. Если твоя цель в том, чтобы сделать игру без программирования и в процессе в основном заниматься редактированием 3д моделек, настройкой готовых скриптов, расстановкой ящиков по уровням в редакторе, то arctic engine тебе плохо подходит, гораздо лучше взять Unity или Unreal Engine. Но если ты хочешь делать по дюжине разных игр в месяц в основном занимаясь именно программированием и прокачивая навык написания кода решающего поставленные задачи, то arctic engine - отличный выбор..

Можно сравнить arctic engine с парой популярных аналогов. Начнем с простоты первых шагов: arctic engine автоматически создает проекты для Visual Studio, XCode и makefile для linux (x86 или Raspberry Pi), а в SDL2 только настройка проекта в Visual Studio займет пол часа, причем уже в этом месте многим нужна помощь и поддержка сообщества.

Ответить

Комментарий недоступен

Ответить

Как это не надо? Можно понять как работает if и goto и делать игры, а можно возиться с обычными циклами, а до игр так и не добраться. Можно долго рассказывать о том что goto почему-то плохо, а можно написать их пару сотен и все понять самостоятельно. В первом случае человек научится послушанию, во втором сделает игру и поймёт самостоятельно преимущества и недостатки goto.

Ответить

IsKeyDown(5)Почему используются магические числа?

Ответить