Коллизия объектов
Пишу игру bomberman. Проблема вот в чем. У меня есть игрок, он ходит, устанавливает бомбы, но нужно создать механизм обработки этих взрывов, что бы объекты, которые попадают под данный радиус взрыва уничтожались. Как обнаружить коллизию при создании взрыва, происходит ошибка если проверять коллизию в конструкторе класса? Когда это лучше всего сделать проверку на коллизию. У меня есть класс взрыв и класс стена, стена должна уничтожится, если она попадает под взрыв.
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!
Пікірлер
OI
- Ora Iro
- Жел. 24, 2024, 3:38 Т.Ж.
C++ - Тест 001. Первая программа и типы данных
- Нәтиже:40ұпай,
- Бағалау ұпайлары-8
AD
- Akiv Doros
- Қар. 11, 2024, 11:58 Т.Ж.
C++ - Тест 004. Указатели, Массивы и Циклы
- Нәтиже:50ұпай,
- Бағалау ұпайлары-4
m
- molni99
- Қаз. 25, 2024, 10:37 Т.Қ.
C++ - Тест 004. Указатели, Массивы и Циклы
- Нәтиже:80ұпай,
- Бағалау ұпайлары4
Соңғы пікірлер
ИМ
Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Игорь МаксимовҚар. 22, 2024, 8:51 Т.Ж.
Evgenii LegotckoiҚаз. 31, 2024, 11:37 Т.Ж.
Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
Игорь МаксимовҚаз. 5, 2024, 4:51 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Енді форумда талқылаңыз
Evgenii LegotckoiМаусым 24, 2024, 12:11 Т.Қ.
t
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
tonypeachey1Қар. 15, 2024, 3:04 Т.Ж.
NSProjectМаусым 4, 2022, 12:49 Т.Ж.
IscanderCheҚаз. 31, 2024, 12:43 Т.Қ.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
Поправлю вопрос. Как проверить на коллизию, сразу при добавлении объекта на сцену.
Добрый день.
Я накидал пример по коллизиям с перемещением игрока и бомбочкой. Не совсем бомбермэн, но идея будет похожая. Игрок может проходит сквозь бомбочки, но не может проходить сквозь стены. Взрыв реализовывать я не стал, поскольку это будет лишь анимация в данном примере. Все стены вокруг бомбы будут уничтожаться в определённом радиусе. Тогда как другие бомбочки и игрок будут оставаться на месте.
Итак, перейдём к коду.
В MainWindow будет только кастомизированная игровая сцена, это понадобится, чтобы обрабатывать клики по игровой сцене и создавать стены и бомбочки.
Посмотрим игровую сцену. В ней объявлен игрок и реализована логика по передаче положения, к которому должен прийти игрок, с логикой добавления бомбочек по клику правой кнопкой мыши на графической сцене
Все игровые объекты должны быть наследованы от одного абстрактного класса, в котором будут объявлены все возможные типы графических объектов. Это упростит определение типа объекта на графической сцене при обработке взрывов и перемещении игрока. Это возможно благодаря тому, что базовый класс абстрактного игрового объекта является QGraphicsItem , а он в свою очередь имеет метод type(), при перегрузке которого мы и будем получать тип объекта
Реализация подобного подхода возможна благодаря парадигме полиморфизма в C++ .
Я не стал добавлять объект взрыва, но логика его срабатывания будет похожа на логику работы бомбочки. Разве что он просто должен произойти, но не влиять никак на другие объекты. Поскольку именно бомбочка будет уничтожать другие объекты в области поражения. А вот уничтожать объекты она будет в деструкторе класса. Это довольно удобно. Бомбочка уничтожилась и прихватила за собой другие объекты.
Стена - это будет просто зелёный квадрат. Она уничтожается бомбочкой в её деструкторе и не позволяет игроку пройти сквозь себя (это уже обрабатывается в коде передвижения игрока)
Наиболее сложный код у игрока, там происходит обработка движения в сторону клика , обработка коллизий со стеной и прохождение сквозь бомбочку. Программный код примера во вложении.Что касается проверки коллизий сразу при добавлении на графическую сцену, то тут несколько не хватает условий. Для каких именно других графических объектов нужно делать проверку.
Например, игрок и так будет проходить в данном варианте кода сквозь бомбочки, так что делать проверку не нужно, точно также и со стенами, достаточно добавить дополнительный тип стен, через которые игрок сможет ходить и проверять их внутри слота передвижения игрока.
Так что вопрос спорный, а нужно ли это выполнять сразу при добавлении?
Проверка при добавлении нужна была для взрыва.
И сам метод проверки: Так же добавил скрин интерфейса. И как срабатывает взрывСпасибо за подробное объяснение.
Я решил проблему несколько другим способом, скорее костылем. Но так оказалось даже лучше, создал метод в классе взрыва и просто вызывал его после добавление на сцену.
Вот например.
К этой же теме, игрок движется с разной скоростью при разных размерах виджета. Я создал новую тему по этому вопросу
Да нормальное решение.
Я уничтожаю объекты при уничтожении бомбочки, а вы при создании взрыва
Мне в вашем коде другое не понравилось, вы используете много кастов объектов, всё-таки, если кастов много, значит в коде что-то не так. Лучше перейдите на типы через метод type() , который я предложил. Это будет правильнее и более красиво.
И ещё, используйте for вместо foreach . Дело в том, что foreach был сделан для того, чтобы проходить по контейнерам, поскольку в for не было поддержки контейнеров, но в современном стандарте C++ эта поддержка уже внедрена. Лично я сейчас уже отошёл от использования foreach в своих проектах.
А как вы добавляли скрины? Я что-то не вижу их в сообщении. Возможно логика обработки сообщений на форуме выпилила скрины. (возможно нужно подкорректировать код на сайте, поэтому опишите подробнее этот момент со скринами)
Понял, учту. Можно пример условий для for . Именно для контейнеров.
Добавил в Прикрепления Но видимо скрипт на сайте не захотел принять это изображение. Сейчас попробую ещё раз
Конечно, вот пример для for :
То есть тоже самое, что и вы делали с foreach , только будет for и синтаксис немного другой.В Qt foreach был разработан, когда у обычного for не было синтаксиса для перебора всяких vector или QList. А сейчас это уже поддерживается самим C++.