Как написать игру на 1с

Обновлено: 04.07.2024

С этого урока начинается серия статей о том, как написать игру на Qt. В предыдущей статье было рассказано о системе позиционирования графических элементов QGraphicsItem в графической сцене QGraphicsScene. Был нарисован треугольник и помещён в центр графической сцены, размеры которой были 500 на 500 пикселей. А теперь настало время этот треугольник оживить, а вернее начать им управлять.

Составим техническое задание урока:

  • В окне располагается графическая сцена с размерами 500 на 500 пикселей (это уже сделано в предыдущем уроке);
  • В центре графической сцены находится красный треугольник (что также уже сделано в прошлом уроке);
  • Треугольник должен перемещаться при нажатии клавиш со стрелками Up, Down, Left, Right;
  • Треугольник не должен выходит за пределы графической сцены, то есть должен быть ограничен размерами графической сцены.

Примечание. В данном проекте используется WinAPI, поэтому проект применим для использования в операционной системе Windows, а для Linux и MacOS применим лишь алгоритм, который используется в данном уроке. Поэтому если Вы желаете написать игру под эти ОС, то необходимо будет использовать библиотеки этих ОС для асинхронной обработки нажатия клавиш.

Структура проекта

  • Triangle.pro - профайл проекта, создается по умолчанию и в данном проекте не требует корректироваки;
  • main.cpp - файл, с которого стартует приложение, в данном файле вызывается widget, в котором будет располагаться графическая сцена с треугольником, которым мы будем управлять;
  • widget.h - заголовочный файл, вызываемого виджета с графической сценой;
  • widget.cpp - файл исходных кодов виджета;
  • triangle.h - заголовочный файл класса Треугольника , который наследован от QGraphicsItem;
  • triangle.cpp - файл исходных кодов класса Треугольник.

mainwindow.ui

В дизайнере интерфейсов просто закидываем QGraphicsView в виджет. Больше ничего не требуется.

widget.h

В данном файле всего лишь объявляем графическую сцену, объект треугольника, которым будем управлять, а также таймер, по отсчетам которого будет производиться проверка состояния клавиш клавиатуры, которыми мы будем управлять треугольником на графической сцене.

widget.cpp

В данном файле производится инициализация графической сцены и её размеров, также в графической сцене отрисовываются границы поля, где будет перемещаться треугольник. Но ключевым моментом является инициализация таймера, по обработке сигнала от которого будет производится изменения состояния графической сцены, а также будут изменяться координаты расположения треугольника, при отслеживании состояния клавиш клавиатуры.

triangle.h

А вот теперь приступаем к программному коду, который отвечает за графический объект, которым мы будем управлять. Класс наследуется от QObject для работы с сигналами и слотами , а также от QGraphicsItem.

Именно в этом файле подключается заголовочный файл windows.h для работы с функционалом

triangle.cpp

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

Поворот объекта задается в градусах переменной angle и устанавливается функцией setRotation() , которая была унаследована от QGraphicsItem . Также для отслеживания состояния кнопок клавиатуры используется функция из WinAPI, а именно GetAsyncKeyState(), которая по коду кнопки определяет состояние этой самой кнопки. При каждом сигнале от объекта класса QTimer происходит проверка нажатых клавиш и в зависимости от их состояния изменяется положение треугольника.

Примечание

Для того, чтобы проект скомпилировался с комплектом сборки MSVC, добавьте в pro файл проекта следующие строки:

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

В видеоуроке даны дополнительные комментарии и объяснения к проекту, а также продемонстрирована работа приложения.

Полный список статей данного цикла:

Видеоурок

Каталог игр с приставок из моего детства Промо

Каталог игр Dendy, Sega, Nintendo из нашего детства.

1 стартмани

06.02.2018 18653 74 user621724_Dimav1979 37

Игра "Тетрис"

Классическая игра в тетрис.

1 стартмани

12.08.2021 1504 1 van010190 0

Игра "Жизнь". Вариации на тему

Игра "Жизнь" Джона Конуэя (Conway's Game of Life). Очередная реализация с нестандартными "фишечками".

1 стартмани

11.08.2021 1101 0 tired_coder 2

Майнкрафт и 1С

Создай свой мир через 1С.

4 стартмани

16.07.2021 1686 0 SerVer1C 0

Сетевая игра "СловоБой" на управляемых формах Промо

СловоБой - это новый взгляд на ставшие уже классическими игры, где нужно составлять слова из букв, наподобие Балды и Эрудита. Играйте онлайн с друзьями! В игре СловоБой побеждает не тот, кто может придумать самое длинное слово, а тот, кто знаком с тактикой не понаслышке и способен использовать оптимальную стратегию.

1 стартмани

10.11.2016 21346 8 woldemarr 0

"Уголки" на 1С

Игра "Уголки" на 1С - ностальгия детства .

1 стартмани

09.06.2021 3262 6 royaljon 5

Игра "Змейка" на управляемых формах (клиент)

Пишем игру с динамическим обновлением игрового поля и управлением с клавиатуры на управляемых формах, отправляем на github.

1 стартмани

07.06.2021 1880 0 alexey_kurdyukov 0

Игра "The Game"

Движок RPG игры на языке 1С.

04.06.2021 11428 235 user1051565 22

Игра "Самоцветы" (Bejeweled теперь и в 1С) + звук Промо

Bejeweled -Самоцветы - красивая логическая игра, смысл которой заключается собрать три и более одинаковых самоцвета (в вертикальной или горизонтальной строке). Первый клик выбираете самоцвет, второй клик выбираете место куда его переместить, перемещать можно только из соседних строк и столбцов. Развивает внимательность и память. Найденные и выбранные группы самоцветов исчезают, а на их место опускаются новые.

20.10.2010 32569 276 Tatitutu 68

Игра "King's Bounty"

Легендарная игра "King's Bounty" теперь и на 1С!

3 стартмани

26.05.2021 4946 24 Caliban 25

Мышонок в лабиринте бегает за сыром (игрушка)

Краткая игра про мышонка на языке 1С.

1 стартмани

24.05.2021 1673 1 user1479164 8

Puzzle (пятнашки) JAVA

Старые добрые пятнашки. Нужно собрать исходное изображение. Нажимаем на пустое поле и выбираем картинку, которую хотим поставить на её место.

1 стартмани

26.04.2021 1935 0 FIERYLIONS 0

Игра: Лабиринт для 1С (теперь и для 8.0-8.2) Промо

Игра "Лабиринт в 1С для 8 ки" неограниченное количество уникальных полей лабиринтов произвольных размеров формируется динамически (очень красивое зрелище - завораживает) Смысл игры - выбраться из Лабиринта.

1 стартмани

24.09.2010 30724 453 Tatitutu 24

Поймай меня. JAVA

Мини игра, написанная на JAVA.

1 стартмани

26.04.2021 1800 0 FIERYLIONS 0

Самые красивые шахматы для 1С на управляемых формах

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

На хабре не очень много уроков по созданию игр, почему бы не поддержать отечественных девелоперов?
Представляю вам свои уроки, которые учат создавать игры на C++ с использованием SDL!

Что нужно знать

  • Хотя бы начальные знания C++ (использовать будем Visual Studio)
  • Терпение

О чем эта часть?

  • Мы создадим каркас для всех игр, в качестве отрисовщика будем использовать SDL. Это библиотека для графики.

В следующих постах будет больше экшена, это лишь подготовка :)

Почему SDL?

Я выбрал эту библиотеку как наиболее легкую и быструю в освоении. Действительно, от первой прочитанной статьи по OpenGL или DirectX до стотысячного переиздания змейки пройдет немало времени.

Теперь можно стартовать.

1.1. Начало начал

Скачиваем SDL с официального сайта.
Создаем проект Win32 в Visual Studio, подключаем lib'ы и includ'ы SDL (если вы не умеете этого делать, то гугл вам в помощь!)

Также необходимо использовать многобайтную кодировку символов. Для этого идем в Проект->Свойства->Свойства конфигурации->Набор символов->Использовать многобайтную кодировку.

Создаем файл main.cpp

Пока что он ничего не делает.

Царь и бог каркаса — класс Game
Game.h


Создаем файл Project.h, он нам очень пригодится в будущем


Уже чуточку получше, но все равно как-то не густо.

1.2. Графика

Создаем аж 2 класса — Graphics для отрисовки графики и Image для отрисовки картинок


SDL_Surface — класс из SDL для хранения информации об картинке
Рассмотрим Graphics
NewImage — есть 2 варианта загрузки картинки. Первый вариант просто грузит картинку, а второй после этого еще и дает прозрачность картинке. Если у нас красный фон в картинке, то вводим r=255,g=0,b=0
DrawImage — тоже 2 варианта отрисовки картинки. Первый рисует всю картинку целиком, второй только часть картинки. startX, startY — координаты начала части картинки. endX, endY — конечные координаты части картинки. Этот метод рисования применяется, если используются атласы картинок. Вот пример атласа:


(изображение взято из веб-ресурса interesnoe.info)

Рассмотрим Image
Он просто держит свой сурфейс и дает право доступа к своим закрытым членам классу Graphics, а он изменяет сурфейс.
По сути, это обертка над SDL_Surface. Также он дает размер картинки

В конструкторе инициализируется SDL и создается экран.
Функция Flip должна вызываться каждый раз после отрисовки картинок, она представляет получившееся на экран и чистит экран в черный цвет для дальнешней отрисовки.
Остальные функции малоинтересны, рекомендую разобраться в них самому

Нет, вы все правильно делаете, этот файл и должен быть таким :)

Надо изменить Game.h, Game.cpp и main.cpp
Game.h

Тут мы добавляем указатель на Graphics и в Execute добавляем размер экрана


Ничего особенного, разве что не пропустите функцию SDL_Quit для очистки SDL

Тут мы создаем экран размером 500 на 350.

1.3. Ввод

Надо поработать со вводом с клавиатуры

SDL_Event — класс какого-нибудь события, его мы держим в Input'е для того, чтобы не создавать объект этого класса каждый цикл
Ниже расположены методы, не представляющие особого интереса. Примечание: методы с окончанием Down вызываются, когда клавиша была нажата, а с окончанием Up — когда опущена.

Здесь мы обрабатываем наш объект событий в функции Update, а остальные функции просто проверяют тип события и его значения.

Изменяем теперь Game.h и Game.cpp

Как видно, мы добавили указатель на Input и создали методы-возвращатели Graphics и Input

1.4. Итоги

Это был первый урок. Если вы дошли до этого места, я вас поздравляю! У вас есть воля, присущая программисту :) Смотрите ссылки в начале статьи на последующие уроки для того, чтобы узнать еще много нового!

Привет Хабр! Меня зовут Евгений «Nage», и я начал заниматься программированием около года назад, в свободное от работы время. Просмотрев множество различных туториалов по программированию задаешься вопросом «а что же делать дальше?», ведь в основном все рассказывают про самые основы и дальше как правило не заходят. Вот после продолжительного времени за просмотром разных роликов про одно и тоже я решил что стоит двигаться дальше, и браться за первый проект. И так, сейчас мы разберем как можно написать игру «Змейка» в консоли со своими начальными знаниями.

Глава 1. Итак, с чего начнем?

Создадим файл для быстрой компиляции нашего кода, сохранил файл с расширением .bat со следующим содержимым:


"@echo off" отключает отображение команд в консоли. С помощью команды goto получаем бесконечный цикл. Задаем переменную name, а с модификатором /p в переменную записывается значение введенное пользователем в консоль. «echo.» просто оставляет пустую строчку в консоли. Далее вызываем компилятор и передаем ему файл нашего кода, который он скомпилирует.

Таким способом мы можем скомпилировать только один файл, поэтому мы будем писать все классы в одном документе (я не разобрался еще как компилировать несколько файлов в один .exe через консоль, да и это не тема нашей статьи, может кто нибудь расскажет в комментариях).

Для тех кто сразу хочет увидеть весь код.

Глава 2. Первые шаги

Подготовим поле нашей игры, начиная с точки входа в нашу программу. Задаем переменные X и Y, размер и буфер окна консоли, и скроем отображение курсора.


Для вывода на экран нашей «графики» создадим свой тип данных — точка. Он будет содержать координаты и символ, который будет выводится на экран. Также сделаем методы для вывода на экран точки и ее «стирания».

Это интересно!
Оператор => называется лямбда-оператор, он используется в качестве определения анонимных лямбда выражений, и в качестве тела, состоящего из одного выражения, синтаксический сахар, заменяющий оператор return. Приведенный выше метод переопределения оператора (про его назначение чуть ниже) можно переписать так:

Создадим класс стен, границы игрового поля. Напишем 2 метода на создание вертикальных и горизонтальных линий, и в конструкторе вызываем отрисовку всех 4х сторон заданным символом. Список всех точек в стенке нам пригодится позже.

Как вы могли заметить для инициализации типа данных Point используется форма Point p = (x, y, ch); как и у встроенных типов, это становится возможным при переопределении оператора implicit, в котором описывается как задаются переменные.

Вернемся к классу Game и объявим поле walls, а в методе Main инициализируем ее.


Все! Можно скомпилировать код и посмотреть, что наше поле построилось, и самая легкая часть позади.

Глава 3. А что сегодня на завтрак?

Добавим генерацию еды на нашем поле, для этого создадим класс FoodFactory, который и будет заниматься созданием еды внутри границ.


Добавляем инициализацию фабрики и создадим еду на поле

Глава 4. Время главного героя

Перейдем к созданию самой змеи, и для начала определим перечисление направления движения змейки.


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


В методе поворота, что бы избежать возможности повернуть сразу на 180 градусов, просто указываем, что в каждом направлении мы можем повернуть только в 2 стороны. А проблему поворота на 180 градусов двумя нажатиями — поставив «переключатель», отключаем возможность поворачивать после первого нажатия, и включаем после очередного хода.

Осталось вывести ее на экран.


Готово! теперь у нас есть все что нужно, поле огороженное стенами, рандомно появляющаяся еда, и змейка. Пришла пора заставить все это взаимодействовать друг с другом.

Глава 5. Л-логика

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


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


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

И похожий метод проверяющий не совпадает ли точка с хвостом.


И методом проверки съела ли еду наша змейка, и сразу делаем ее длиннее.


теперь можно написать метод движения, со всеми нужными проверками.


Вот и все! Наша змейка в консоли закончена и можно поиграть.

Заключение

Мы посмотрели как можно реализовать первую простенькую игру с небольшим использованием ООП, научились перегружать операторы, посмотрели на кортежи и лямбда оператор, надеюсь это было полезно!

Это была пилотная статья, и если вам понравилось, я напишу про реализацию змейки на Unity.
Всем удачи!

Читайте также: