Проблемы с коллизиями с использованием tilemap raylib C++C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Проблемы с коллизиями с использованием tilemap raylib C++

Сообщение Anonymous »

Да, всем привет. У меня проблемы с коллизиями в моей демо-версии, которую я делаю. Иногда игрок сталкивается с объектами, а иногда они проходят насквозь, а также застревают сбоку от объектов или меняют направление движения. Я надеюсь, что кто-нибудь сможет добавить код в ide и сказать мне, что происходит. Я новичок и перепробовал все, что знал. Я не знаю, связано ли это с тем, что я использую разные размеры тайловой карты и игроков, или с тем, что происходит. Я хочу, чтобы игрок не двигался, когда он входит в серый ящик, любая помощь приветствуется. Спасибо.
игрок

Код: Выделить всё

#include
#include

struct AnimData
{
Rectangle rec;
Vector2 pos;
int frame;
float updateTime;
float runningTime;
};
const int sWidth = 10;
const int sHeigth = 7;

int main()
{
InitWindow(800, 400, "My first game");
Rectangle rec[sWidth][sHeigth];
int type[sWidth][sHeigth]
{

{1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,1,0,0,1,0},
{1,0,0,0,0,0,0,0,0,0},
{1,0,0,0,0,0,0,0,0,0},
{1,0,0,0,0,0,0,0,0,0},
{1,0,0,0,0,0,0,0,0,0},
{1,0,0,0,0,0,0,0,0,0}
};

for (int i = 0; i < sHeigth; i++)
{
for (int j = 0; j < sWidth; j++)
{
Rectangle floor{ i * 32, j * 32, 32, 32 };
rec[i][j] = floor;
}
}

int playervec = 128;

bool UP = false, DOWN = false, LEFT = false, RIGHT = false, ISMOVINGu = false, ISMOVINGd = false,
ISMOVINGl = false, ISMOVINGr = false;

Image nebula = LoadImage("Cat 01-1.png");
Texture2D tex = LoadTextureFromImage(nebula);
AnimData nebData{
{200.0, 125.0, nebula.width / 3, nebula.height / 4}, // Rectangle rec
{200, 125}, // Vector2 pos
0, // int frame
1.0f / 9.0f, // float updateTime
0 // float runningTime
};
bool isShoot = false;
Rectangle rec2{ nebData.pos.x ,nebData.pos.y,4.f,4.f };
Vector2 pos{ nebData.pos.x + 0.0f, nebData.pos.y + 0.0f };
Vector2 off{ 800 / 2.0f, 400 / 2.0f };
Camera2D camera = { 0 };
camera.target = pos;
camera.offset = off;
camera.rotation = 0.0f;
camera.zoom = 1.0f;

SetTargetFPS(60);
while (!WindowShouldClose())
{
const float dt = GetFrameTime();
BeginDrawing();

if (IsKeyDown(KEY_W))
{
UP = true;
ISMOVINGu = true;

}
if (IsKeyUp(KEY_W))
ISMOVINGu = false;

if (IsKeyDown(KEY_S))
{
DOWN = true;
ISMOVINGd = true;

}
if (IsKeyUp(KEY_S))
{
ISMOVINGd = false;

}
if (IsKeyDown(KEY_A))
{
LEFT = true;
ISMOVINGl = true;
}
if (IsKeyUp(KEY_A))
{
ISMOVINGl = false;

}
if (IsKeyDown(KEY_D))
{
RIGHT = true;
ISMOVINGr = true;
}
if (IsKeyUp(KEY_D))
ISMOVINGr = false;

if (!ISMOVINGd && !ISMOVINGu && !ISMOVINGl && !ISMOVINGr)
nebData.rec.x = 32;

if (UP)
{

nebData.pos.y -= playervec * dt;
nebData.rec.y = 96;
Rectangle rec1{ nebData.pos.x, nebData.pos.y,nebula.width/3,nebula.height/4};
bool coll = false;
for (int i = 0; i < sWidth; i++)
{
for (int j = 0; j < sHeigth; j++)
if (CheckCollisionRecs(rec1, rec[i][j]))
{

if (type[i][j] == 1)
{
coll = true;
break;
}
}
}
if(coll)
nebData.pos.y += playervec * dt;
UP = false;
camera.target = { nebData.pos.x+20, nebData.pos.y+20 };
}

if (DOWN)
{
nebData.pos.y += playervec * dt;
nebData.rec.y = 0;
Rectangle rec1{ nebData.pos.x , nebData.pos.y,nebula.width / 3,nebula.height / 4};
bool coll = false;
for (int i = 0; i < sWidth; i++)
for (int j = 0; j < sHeigth;  j++)
if (CheckCollisionRecs(rec1, rec[i][j]))
{
if (type[i][j] == 1)
{
coll = true;
break;
}

}
if(coll)
nebData.pos.y -= playervec * dt;
DOWN = false;
camera.target = { nebData.pos.x + 20.0f, nebData.pos.y + 20.0f };
}

if (LEFT)
{

nebData.rec.y = 32;
Rectangle rec1{ nebData.pos.x, nebData.pos.y,nebula.width / 3,nebula.height / 4 };
nebData.pos.x -= playervec * dt;
bool coll = false;
for (int i = 0; i < sWidth; i++)
for (int j = 0; j < sHeigth; j++)
if (CheckCollisionRecs(rec1, rec[i][j]))
{
if (type[i][j] == 1)
{
coll = true;

break;
}

}
if(coll)
nebData.pos.x += playervec * dt;

LEFT = false;
camera.target = { nebData.pos.x + 20.0f, nebData.pos.y + 20.0f };
}

if (RIGHT)
{
nebData.pos.x += playervec * dt;
nebData.rec.y = 64;
Rectangle rec1{ nebData.pos.x, nebData.pos.y,nebula.width / 3,nebula.height / 4 };
bool is = false;
for (int i = 0; i < sWidth; i++) {
for (int j = 0; j < sHeigth; j++)

if (CheckCollisionRecs(rec1, rec[i][j]))
{
if (type[i][j] == 1)
{
is = true;
break;
}

}
}
if(is)
nebData.pos.x -= playervec * dt;
RIGHT = false;
camera.target = { nebData.pos.x + 20.0f, nebData.pos.y + 20.0f };

}

if (IsKeyPressed(KEY_SPACE))
{
isShoot = true;

}
if (IsKeyReleased(KEY_SPACE))
{
//isShoot = false;
}

if (isShoot && rec2.x < 800)
rec2.x += 2.f;
else
{
isShoot = false;
}

nebData.runningTime += dt;
if (nebData.runningTime >= nebData.updateTime && (ISMOVINGu || ISMOVINGd || ISMOVINGl || ISMOVINGr))
{
nebData.runningTime = 0.0;

nebData.rec.x = nebData.frame * nebData.rec.width;
nebData.frame++;
if (nebData.frame > 4)
{
nebData.frame = 0;
}
}

BeginMode2D(camera);

ClearBackground(BLACK);

for (int i = 0; i< sWidth; i++)
for (int j = 0; j < sHeigth; j++)
{
if (type[i][j] == 1)
DrawRectangle((int)rec[i][j].x, (int)rec[i][j].y, (int)rec[i][j].width, (int)rec[i][j].height, GRAY);
else DrawRectangle((int)rec[i][j].x, (int)rec[i][j].y, (int)rec[i][j].width, (int)rec[i][j].height, DARKGREEN);

}
DrawTextureRec(tex, nebData.rec, nebData.pos, WHITE);
DrawRectangleLines(nebData.pos.x, nebData.pos.y,  nebula.width / 3, nebula.height / 4, RED);
//DrawRectangle();
DrawText(TextFormat("x %f , y %f", nebData.pos.x, nebData.pos.y), nebData.pos.x -40, nebData.pos.y -40, 32,WHITE);
if (isShoot)
DrawRectangle(rec2.x, rec2.y, 4.f, 4.f, BLUE);
EndDrawing();
EndMode2D();
}
CloseWindow();
//std::cout

Подробнее здесь: [url]https://stackoverflow.com/questions/78694469/problems-with-collsions-wit-tilemap-raylib-c[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»