diff --git a/include/app.h b/include/app.h index 06cbea5..7ece17a 100644 --- a/include/app.h +++ b/include/app.h @@ -247,6 +247,10 @@ Projectiles CreateProjectiles(void); void UpdateProjectiles(Projectiles *projectiles); void RenderProjectiles(Projectiles *projectiles); +void CheckPlayerEnemyCollisions(Player *player, Enemies *enemies); +void CheckEnemyEnemyCollisions(Enemies *enemies); +void CheckProjectileEnemyCollisions(Projectiles *projectiles, Enemies *enemies); + void InitGame(App *app); void UpdateGame(App *app); void RenderComponents(App *app); diff --git a/src/appGame.c b/src/appGame.c index 15ba635..e6f8b9e 100644 --- a/src/appGame.c +++ b/src/appGame.c @@ -69,6 +69,9 @@ void UpdateGame(App *app) { UpdateEnemies(&g->enemies); UpdateIslands(&g->islands); UpdateProjectiles(&g->projectiles); + CheckPlayerEnemyCollisions(GetPlayer(), &app->game.enemies); + CheckEnemyEnemyCollisions(&app->game.enemies); + CheckProjectileEnemyCollisions(&app->game.projectiles, &app->game.enemies); } void RenderComponents(App *app) { diff --git a/src/appGameCollisions.c b/src/appGameCollisions.c new file mode 100644 index 0000000..e109769 --- /dev/null +++ b/src/appGameCollisions.c @@ -0,0 +1,75 @@ +#include "app.h" +#include + +void CheckPlayerEnemyCollisions(Player *player, Enemies *enemies) { + for (int i = 0; i < enemies->count; i++) { + + Vector2 playerPos = player->physics.position; + Vector2 enemiesPos = enemies->physics[i].position; + + float playerRadius = 8.0f; + float enemiesRadius = 8.0f; + float minDist = playerRadius + enemiesRadius; + + if (CheckCollisionCircles(playerPos, playerRadius, enemiesPos, + enemiesRadius)) { + float dist = GetDistanceBetweenTwoVectors(playerPos, enemiesPos); + float overlap = minDist - dist; + + if (dist > 0.0f) { + Vector2 collisionVector = GetDirectionBetweenTwoVectors( + enemies->physics[i].position, player->physics.position); + player->physics.position.x += collisionVector.x * overlap; + player->physics.position.y += collisionVector.y * overlap; + Vector2 forward = RotationToVector2(player->rotation - 90.0f); + float side = Cross2D(forward, collisionVector); + player->rotation += side * 120.0f * GetFrameTime(); + } + } + } +} +void CheckEnemyEnemyCollisions(Enemies *enemies) { + for (int a = 0; a < enemies->count; a++) { + for (int b = a + 1; b < enemies->count; b++) { + + Vector2 posA = enemies->physics[a].position; + Vector2 posB = enemies->physics[b].position; + + float enemiesRadius = 8.0f; + float minDist = enemiesRadius * 2; + + if (CheckCollisionCircles(posA, enemiesRadius, posB, enemiesRadius)) { + + Vector2 collisionVectorA = GetDirectionBetweenTwoVectors(posB, posA); + Vector2 collisionVectorB = GetDirectionBetweenTwoVectors(posA, posB); + float dist = GetDistanceBetweenTwoVectors(posA, posB); + float overlap = minDist - dist; + + if (dist > 0.0f) { + enemies->physics[a].position.x += collisionVectorA.x * overlap * 0.5f; + enemies->physics[a].position.y += collisionVectorA.y * overlap * 0.5f; + + enemies->physics[b].position.x += collisionVectorB.x * overlap * 0.5f; + enemies->physics[b].position.y += collisionVectorB.y * overlap * 0.5f; + + Vector2 forwardA = + RotationToVector2(enemies->sprite[a].rotation - 90.0f); + Vector2 forwardB = + RotationToVector2(enemies->sprite[b].rotation - 90.0f); + float sideA = Cross2D(forwardA, collisionVectorA); + float sideB = Cross2D(forwardB, collisionVectorB); + enemies->sprite[a].rotation += sideA * 120.0f * GetFrameTime(); + enemies->sprite[b].rotation += sideB * 120.0f * GetFrameTime(); + } + } + } + } +} + +void CheckProjectileEnemyCollisions(Projectiles *projectiles, + Enemies *enemies) { + for (int i = 0; i < projectiles->count; i++) { + for (int j = 0; j < enemies->count; j++) { + } + } +} diff --git a/src/appGameEnemies.c b/src/appGameEnemies.c index 91c436b..9519cb0 100644 --- a/src/appGameEnemies.c +++ b/src/appGameEnemies.c @@ -1,81 +1,89 @@ #include "app.h" const TextureAsset enemiesTextureAssets[ENEMIES_TEX_COUNT] = { - {"assets/ship_start.png", 16.0f, 16.0f, 90.0f}}; + {"assets/ship_start.png", 16.0f, 16.0f, 90.0f} +}; -Enemies CreateEnemies(void) { - Enemies enemies = {.count = MAX_ENEMIES}; - TextureAsset textureAsset = enemiesTextureAssets[BOAT]; - Texture2D texture = LoadTexture(textureAsset.path); - float frameWidth = textureAsset.frameWidth; - float rotation = textureAsset.rotation; +Enemies CreateEnemies(void){ + Enemies enemies = {.count = MAX_ENEMIES}; + TextureAsset textureAsset = enemiesTextureAssets[BOAT]; + Texture2D texture = LoadTexture(textureAsset.path); + float frameWidth = textureAsset.frameWidth; + float rotation = textureAsset.rotation; - for (int i = 0; i < enemies.count; i++) { - enemies.sprite[i] = (Sprite){ - .texture = texture, - .frameSize = {frameWidth, frameWidth}, - .sourceRec = {0.0f, 0.0f, frameWidth, frameWidth}, - .destRec = {GetScreenWidth() / 2, 0.0f, frameWidth, frameWidth}, - .origin = {frameWidth / 2, frameWidth / 2}, - .rotation = rotation, - .color = WHITE}; + for (int i = 0; i < enemies.count; i++) + { + enemies.sprite[i] = (Sprite){ + .texture = texture, + .frameSize = {frameWidth, frameWidth}, + .sourceRec = {0.0f, 0.0f, frameWidth, frameWidth}, + .destRec = {GetScreenWidth()/2, 0.0f, frameWidth, frameWidth}, + .origin = {frameWidth / 2, frameWidth / 2}, + .rotation = rotation, + .color = WHITE + }; - enemies.animation[i] = (Animation){.state = 1, - .currentFrame = 0, - .maxFrame = 2, - .framesCounter = 0, - .framesSpeed = 2.0f, - .animTimer = 0.0f}; + enemies.animation[i] = (Animation){ + .state = 1, + .currentFrame = 0, + .maxFrame = 2, + .framesCounter = 0, + .framesSpeed = 2.0f, + .animTimer = 0.0f + }; - Rectangle cameraRec = GetCameraRectangle(); + Rectangle cameraRec = GetCameraRectangle(); - enemies.physics[i] = - (Physics){.position = GetPositionOutsideRectangle(cameraRec, 100, 1000), - .direction = (Vector2){0.0f, 0.0f}, - .speed = 5.0f}; + enemies.physics[i] = (Physics){ + .position = GetPositionOutsideRectangle(cameraRec, 100, 1000), + .direction = (Vector2){0.0f, 0.0f}, + .speed = 5.0f, + .weight = 5.0f + }; - enemies.arrived[i] = true; - enemies.destPos[i] = (Vector2){0.0f, 0.0f}; - } + enemies.arrived[i] = true; + enemies.destPos[i] = (Vector2){0.0f, 0.0f}; - return enemies; + } + + return enemies; } -void UpdateEnemies(Enemies *enemies) { - Camera2D *camera = GetCamera(); - Rectangle cameraRec = GetCameraRectangle(); +void UpdateEnemies(Enemies *enemies){ + Camera2D *camera = GetCamera(); + Rectangle cameraRec = GetCameraRectangle(); - for (int i = 0; i < enemies->count; i++) { - if (enemies->arrived[i]) { - enemies->destPos[i] = GetPositionOutsideRectangle(cameraRec, 100, 1000); - enemies->arrived[i] = false; - } - if (CheckCollisionPointCircle(enemies->physics[i].position, - enemies->destPos[i], 10.0F)) { - enemies->arrived[i] = true; - } - if (GetDistanceBetweenTwoVectors(enemies->physics[i].position, - camera->target) > 1000) { - enemies->physics[i].position = - GetPositionOutsideRectangle(cameraRec, 100, 1000); - } - Vector2 dir = GetDirectionBetweenTwoVectors(enemies->physics[i].position, - enemies->destPos[i]); - UpdatePhysics(&enemies->physics[i], dir); - UpdateSpriteDestRec(&enemies->sprite[i], &enemies->physics[i].position); - float rotation = Vector2ToRotation(dir); - UpdateSpriteRotation(&enemies->sprite[i], rotation + 90.0f); - UpdateAnimation(&enemies->animation[i], GetFrameTime()); - UpdateSpriteSourceRec(&enemies->sprite[i], - &(Vector2){enemies->sprite[i].frameSize.x * - enemies->animation[i].currentFrame, - enemies->sprite[i].frameSize.y}); - } + for (int i = 0; i < enemies->count; i++) + { + if(enemies->arrived[i]) + { + enemies->destPos[i] = GetPositionOutsideRectangle(cameraRec, 100, 1000); + enemies->arrived[i] = false; + } + if(CheckCollisionPointCircle(enemies->physics[i].position, enemies->destPos[i], 10.0F)) + { + enemies->arrived[i] = true; + } + if(GetDistanceBetweenTwoVectors(enemies->physics[i].position, camera->target) > 1000){ + enemies->physics[i].position = GetPositionOutsideRectangle(cameraRec, 100, 1000); + } + Vector2 dir = GetDirectionBetweenTwoVectors(enemies->physics[i].position, enemies->destPos[i]); + UpdatePhysics(&enemies->physics[i], dir); + UpdateSpriteDestRec(&enemies->sprite[i], &enemies->physics[i].position); + float rotation = Vector2ToRotation(dir); + UpdateSpriteRotation(&enemies->sprite[i], rotation + 90.0f); + UpdateAnimation(&enemies->animation[i], GetFrameTime()); + UpdateSpriteSourceRec(&enemies->sprite[i], &(Vector2){enemies->sprite[i].frameSize.x * enemies->animation[i].currentFrame, enemies->sprite[i].frameSize.y}); + } } -void RenderEnemies(Enemies *enemies) { +void RenderEnemies(Enemies *enemies){ + + for (int i = 0; i < enemies->count; i++) + { + RenderSprite(&enemies->sprite[i]); + } - for (int i = 0; i < enemies->count; i++) { - RenderSprite(&enemies->sprite[i]); - } } + + diff --git a/src/appGamePlayer.c b/src/appGamePlayer.c index 93608cb..cadccf5 100644 --- a/src/appGamePlayer.c +++ b/src/appGamePlayer.c @@ -57,7 +57,8 @@ void CreatePlayer(void) Physics playerPhysics = { .position = (Vector2){0.0f,0.0f}, .direction = (Vector2){0.0f, 0.0f}, - .speed = playerSpeeds[ANCHOR] + .speed = playerSpeeds[ANCHOR], + .weight = 10.0f }; Player* player = GetPlayer();