C ++ / SDL - Отображение прямоугольных координат - PullRequest
0 голосов
/ 06 февраля 2019

Я работаю над 2D-игрой с использованием SDL.Недавно я реализовал различные функции, которые приводят объекты (и их прямоугольники) в движение, но столкнулись с проблемами производительности, которые, скорее всего, вызваны неэффективным отображением координат прямоугольника.Пожалуйста, смотрите ниже:

2D координаты прямоугольника сохраняются в целочисленном массиве всякий раз, когда вызывается move ().Например, координата [0] является первой точкой на оси x, а координата [1] является последней точкой на оси x.Координаты [2] и [3] работают для точек на оси y.

Функция map () берет координаты прямоугольника и сохраняет их в статическом std :: map (класс Status).Каждая пара x и y имеет значение 0 или 1, в зависимости от того, присутствует прямоугольник или нет.Координаты игрока не отображаются.

Когда игрок движется, функция bool collide () проверяет, смежен ли прямоугольник игрока с другим повтором в определенном направлении.Если прямоугольник не блокирует путь, игроку разрешено двигаться.

Все работает хорошо, но кажется, что все эти циклы for в функции map () сильно нагружают процессор.Когда на экране перемещаются прямоугольники, программа ужасно отстает.Как я могу отобразить координаты прямоугольника более эффективно?

void move(int x, int y) {
    dstRect.x = x;
    dstRect.y = y;

    coordinate[0] = dstRect.x;
    coordinate[1] = dstRect.x + dstRect.w;
    coordinate[2] = dstRect.y;
    coordinate[3] = dstRect.y + dstRect.h;
}

void map() {
    for (int x = coordinate[0]; x != coordinate[1]; x++) {
        for (int y = coordinate[2]; y != coordinate[3]; y++) {
            Status::map().insert(std::pair<std::vector<int>, int>({ x, y }, 1));
        }
    }
}

bool collide(DIRECTION direction) {
    if (direction == UP || direction == DOWN) {
        for (int x = texture.coordinate[0]; x != texture.coordinate[1]; x++) {
            if (direction == UP) {
                if (Status::map().find({ x, texture.coordinate[2] - 1 })->second == 1) { return true; }
            }
            if (direction == DOWN) {
                if (Status::map().find({ x, texture.coordinate[3] + 1 })->second == 1) { return true; }
            }
        }
    }
    if (direction == RIGHT || direction == LEFT) {
        for (int y = texture.coordinate[2]; y != texture.coordinate[3]; y++) {
            if (direction == RIGHT) {
                if (Status::map().find({ texture.coordinate[1] + 1, y })->second == 1) { return true; }
            }
            if (direction == LEFT) {
                if (Status::map().find({ texture.coordinate[0] - 1, y })->second == 1) { return true; }
            }
        }
    }
    return false;
}

void moveRight() {
    for (int i = 0; i < speed; i ++) {
        if (!collide(RIGHT)) {
            int x = texture.dstRect.x + 1;
            int y = texture.dstRect.y;
            texture.move(x, y);
        }
    }
}

1 Ответ

0 голосов
/ 07 февраля 2019

Следовал совету @ FrançoisAndrieux и создал многомерный вектор для хранения координат.

...