diff --git a/main.c b/main.c index 4a50cc5..494270f 100644 --- a/main.c +++ b/main.c @@ -1,11 +1,11 @@ #include "include/raylib.h" #include - +//------------------------------------------------------------------------------------------------------------------------------------- typedef struct Block { - Vector2 position; + Vector2 position, size; int form, onGround; - float speed; + float speed, step; struct Block *next; } Block; @@ -14,9 +14,11 @@ typedef struct Block { void createBlock(Block **head) { Block *block = MemAlloc(sizeof(Block)); block->position = (Vector2){ 400, -40 }; + block->size = (Vector2){ 20, 20 }; block->form = 1; block->onGround = 0; - block->speed = 2; + block->speed = 4; + block->step = 20; block->next = NULL; // Falls die Liste leer ist @@ -50,22 +52,59 @@ int main(void) { SetTargetFPS(60); while (!WindowShouldClose()) { + //------------------------------------------------------------------------------------------------------------------------------------- // UPDATE GAME LOGIC + // INPUT Block *currentBlock = block; // Alle Blöcke fallen lassen while (currentBlock != NULL) { // Wenn Block noch nicht auf Boden, dann fallen if (currentBlock->onGround == 0) { - - if (currentBlock->position.y < screenHeight - 20) { - currentBlock->position.y += currentBlock->speed; - } else { + // MOVEMENT ------------------------------------------------- + if (IsKeyPressed(KEY_LEFT)) { + currentBlock->position.x -= currentBlock->step; + } + + if (IsKeyPressed(KEY_RIGHT)) { + currentBlock->position.x += currentBlock->step; + } + // ---------------------------------------------------------- + // Kollision gegen anderen Block checken + + float nextY = currentBlock->position.y + currentBlock->speed; + + if (nextY > screenHeight - currentBlock->size.y) { + currentBlock->position.y = screenHeight - currentBlock->size.y; blockMoving = 0; currentBlock->onGround = 1; } + else { + Rectangle nextRect = { currentBlock->position.x, nextY, currentBlock->size.x, currentBlock->size.y }; + int collided = 0; + Block *collisionCheck = block; + while (collisionCheck != NULL) { + // Nur gegen andere, bereits gelandete Blöcke prüfen (und nicht gegen sich selbst!) + if (collisionCheck != currentBlock && collisionCheck->onGround == 1) { + Rectangle otherRect = { collisionCheck->position.x, collisionCheck->position.y, collisionCheck->size.x, collisionCheck->size.y }; + + if (CheckCollisionRecs(nextRect, otherRect)) { + collided = 1; + break; + } + } + collisionCheck = collisionCheck->next; + } + if (collided) { + blockMoving = 0; + currentBlock->onGround = 1; + } + else { + currentBlock->position.y = nextY; + } + } } @@ -79,6 +118,7 @@ int main(void) { blockMoving = 1; } + //------------------------------------------------------------------------------------------------------------------------------------- // ZEICHNEN BeginDrawing(); ClearBackground(RAYWHITE); @@ -86,16 +126,26 @@ int main(void) { DrawFPS(20, 20); DrawText(TextFormat("Blocks: %i", blockCounter), 20, 40, 20, GREEN); + // BLOCK ZEICHNEN currentBlock = block; while (currentBlock != NULL) { - DrawRectangleV(currentBlock->position, (Vector2){20, 20}, BLUE); + DrawRectangleV(currentBlock->position, currentBlock->size, BLUE); currentBlock = currentBlock->next; } EndDrawing(); + //------------------------------------------------------------------------------------------------------------------------------------- } + // Alle Blöcke im Speicher freigeben + Block *currentBlock = block; + while (currentBlock != NULL) { + Block *nextBlock = currentBlock->next; + MemFree(currentBlock); + currentBlock = nextBlock; + } + CloseWindow(); return 0; } \ No newline at end of file