Я пытаюсь проверить, сталкивается ли мой персонаж, управляемый джойстиком, с пикселем стены, хранящимся в массиве. У символа есть координата, относящаяся к верхнему левому углу его положения, и двумерный массив, представляющий «растровое изображение», которое его рисует. Однако я либо не получаю столкновения, либо персонаж не может двигаться, потому что код считает, что он сталкивается.
Я сделал несколько вариантов вызова теста столкновения - пробовал его как в функции столкновения, так и при вызове вфункция перемещения. Недавно я переключился на 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 для своего кода