Как создать ХитБокс для 2D игры?

176
04 апреля 2018, 11:25

Я не очень хорошо смыслю в программировании и в целом математике поскольку недавно начал изучать эту отрасль. Мне нужна помощь с разработкой собственной игры. Сама игра является 2D. Мне неизвестно как сделать границы нужных объектов. Так скажем Hitbox. Сама проблема: описать эти границы объектов в последствии, что бы они могли соприкасаться друг с другом и выполнять определённую часть кода. К примеру нанести урон или остановить движение этих объектов. Прошу объяснить как именно это сделать и как происходит создание Хитбокса и как извлекать нужные данные для сравнения "Прикоснулся ли этот объект с другим объектом или нет?". Заранее благодарю за советы и помощь.

Answer 1

Это называется коллизией, например можно просто создать класс CollisionRect объекты которого будут принимать x и y и в этом классе будет метод (ColidesWith например) проверяющий столкновение двух объектов по x и y, ширине и высоте объектов. Сложно звучит, но на самом деле очень просто. Я как раз делаю 2D игру на java на libgdx, вот пример кода этого класса CollisionRect:

package com.imaginegames.mmgame.tools;
public class CollisionRect {
    float x, y, width, height;
    public CollisionRect(float x, float y, float width, float height) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }
    public void move (float x, float y) {
        this.x = x;
        this.y = y;
    }
    public boolean CollidesWith (CollisionRect rect) {
        return x < rect.x + rect.width && y < rect.y + rect.height && x + width > rect.x && y + height > rect.y;
    }
}

А вот уже в процессе игре проверяется на столкновение fireball'a и ракеты которая уничтожает этот фаербол, ракета - bullet:

for (Bullet bullet : bullets) {
        for (Fireball fireball : fireballs) {
            if (bullet.getCollisionRect().CollidesWith(fireball.getCollisionRect())) {
                fireballs_to_remove.add(fireball);
                bullets_to_remove.add(bullet);
                explosions.add(new Explosion(bullet.x, fireball.x, Bullet.WIDTH, Fireball.WIDTH, bullet.y, fireball.y, Bullet.HEIGHT, Fireball.HEIGHT, 0.5f));
            }
        }
    }

Вот на ютубе ролик, по libgdx правда, но как видишь в CollisionRect не используются библиотеки libgdx.

Надеюсь помог, если что-то не понимаешь - paint в помощь, просто попробуй нарисовать квадрат первого тела и второго и поймешь что цикл в ColidesWith работает в любом случае, встретились тела 1 и 2 или 2 и 1, и неважно с какой стороны.

И если кратко: границы объекта - это X объекта и X + Width и Y и Y + Height Урон - просто если при проверке на соприкосновении двух объектов возвращается true, то параметр например health уменьшается на 20 В общем, посмотри урок, надеюсь ты знаешь английский.

READ ALSO
error: unknown element &lt;receiver&gt; found при сборке проекта в Android Studio

error: unknown element <receiver> found при сборке проекта в Android Studio

Эта старая проблема: https://stackoverflowcom/questions/46560449/error72-unknown-element-receiver-found

210
8 чекбосов или 256 вариантов?

8 чекбосов или 256 вариантов?

На клиенте (indexjsp) имею 8 чекбоксов - комплектации авто:

278
Java игра. Угадай число

Java игра. Угадай число

Коллеги, доброго дняНе могу понять, как сделать правильно: Необходимо сделать игру, в которой нужно угадать число компьютера

204
Проблема с контроллерами в Spring-MVC

Проблема с контроллерами в Spring-MVC

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

254