Проверка столкновения пикселей в подростковой игре - PullRequest
3 голосов
/ 21 октября 2019

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

Я сделал несколько вариантов вызова теста столкновения - пробовал его как в функции столкновения, так и при вызове вфункция перемещения. Недавно я переключился на 2 для циклов, потому что 1 сравнивает только пиксели в одной и той же позиции в их соответствующих массивах, а не со всеми из них. Я сделал некоторые изменения, как рекомендовано в комментариях ниже, и теперь я сузил свою проблему до функции столкновения, всегда возвращающей 0. Я нашел это, столкнувшись с вражеским персонажем, и когда у меня было, если temp == 0, игрок умер бездвижется, но когда он установлен в if (temp == 1), игрок не умрет, даже если он коснется вражеского персонажа.

int wall_collide(int x1, int y1, int i_count, int j_count, int array1[i_count][2], int array2[j_count][2]) {
    for (int i = 0; i < i_count; ++i)
    {
        for (int j = 0; j < j_count; ++j)
        {
            if ((x1 + array1[i][0] == array2[j][0]) && (y1 + array1[i][1] == array2[j][1]))
            {
                 return 1;
            }
        }
    }
    return 0;
}

void p_move() {
    int temp = 0;
    if (LBpressed == 1 && !(c_x == 0))
    {
        temp = wall_collide(c_x, c_y, 22, 64, c_xy, pixelbank);
        if (temp == 0) c_x -= 1;
    }
    if (RBpressed == 1 && !(c_x == (LCD_X - 5)))
    {
        temp = wall_collide(c_x, c_y, 22, 64, c_xy, pixelbank);
        if (temp == 0) c_x -= 1;
    }
    if (UBpressed == 1 && !(c_y == 8))
    {
        temp = wall_collide(c_x, c_y, 22, 64, c_xy, pixelbank);
        if (temp == 0) c_y -= 1;
    }
    if (DBpressed == 1 && !(c_y == (LCD_Y - 7))) 
    {
        temp = wall_collide(c_x, c_y, 22, 64, c_xy, pixelbank);
        if (temp == 0) c_y += 1;
    }
}

int walls[4][4] = { {18,15, 13,25}, {25,35, 25,45}, {45,10, 60,10}, {58,25, 72,30} };
This is how I'm storing the pixels for the walls when I draw them
void pixelbank(int x1, int y1, int x2, int y2) {
    if ( x1 == x2 ) {
        // Draw vertical line
        for ( int i = y1; (y2 > y1) ? i <= y2 : i >= y2; (y2 > y1) ? i++ : i-- ) {
            inputoarray(x1, i);
        }
    }
    else if ( y1 == y2 ) {
        // Draw horizontal line
        for ( int i = x1; (x2 > x1) ? i <= x2 : i >= x2; (x2 > x1) ? i++ : i-- ) {
            inputoarray(i, y1);
        }
    }
    else {
        //  Always draw from left to right, regardless of the order the endpoints are 
        //  presented.
        if ( x1 > x2 ) {
            int t = x1;
            x1 = x2;
            x2 = t;
            t = y1;
            y1 = y2;
            y2 = t;
        }

        // Get Bresenhaming...
        float dx = x2 - x1;
        float dy = y2 - y1;
        float err = 0.0;
        float derr = ABS(dy / dx);

        for ( int x = x1, y = y1; (dx > 0) ? x <= x2 : x >= x2; (dx > 0) ? x++ : x-- ) {
            inputoarray(x, y);
            err += derr;
            while ( err >= 0.5 && ((dy > 0) ? y <= y2 : y >= y2) ) {
                inputoarray(x, y);
                y += (dy > 0) - (dy < 0);
                err -= 1.0;
            }
        }
    }
}

pixelbank - это место, где хранятся пиксели стен (int pixelbank[64] [2]) c_x и c_y являются отправной точкой для рисования символа, а c_xy содержит смещения, например, c_xy [0] [0] = 1 & c_xy [0] [1] = 0, поскольку пиксель рисуется вc_x + 1, c_y + 0.

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

Также, если это помогает, я использую ЖК-экран 48x84 для своего кода

...