#include "include/raylib.h" #include typedef struct Block { Vector2 position; int form, onGround; float speed; struct Block *next; } Block; void createBlock(Block **head) { Block *block = MemAlloc(sizeof(Block)); block->position = (Vector2){ 400, -40 }; block->form = 1; block->onGround = 0; block->speed = 2; block->next = NULL; // Falls die Liste leer ist if (*head == NULL) { *head = block; return; } // Durch alle Blöcke iterieren und den neuesten am Schluss hinzufügen Block *currentBlock = *head; while (currentBlock->next != NULL) { currentBlock = currentBlock->next; } currentBlock->next = block; } int main(void) { // INIT const int screenWidth = 800; const int screenHeight = 450; InitWindow(screenWidth, screenHeight, "Raylib Manuell"); Block *block = { 0 }; createBlock(&block); int blockMoving = 1; SetTargetFPS(60); while (!WindowShouldClose()) { // UPDATE GAME LOGIC Block *currentBlock = block; // Alle Blöcke fallen lassen while (currentBlock != NULL) { // Wenn Block noch nicht auf Boden, dann fallen if (currentBlock->onGround == 0) { Block *collisionBlock = block; while (collisionBlock != NULL) { struct Rectangle rect1 = {currentBlock->position.x, currentBlock->position.y, 20, 20}; struct Rectangle rect2 = {collisionBlock->position.x, collisionBlock->position.y, 20, 20}; if (CheckCollisionRecs(rect1, rect2)) { currentBlock->onGround = 1; break; } if (currentBlock->position.y < screenHeight - 20) { currentBlock->position.y += currentBlock->speed; } else { blockMoving = 0; currentBlock->onGround = 1; } collisionBlock = collisionBlock->next; } } currentBlock = currentBlock->next; } // Wenn sich kein Block mehr bewegt, einen neuen erstellen if (blockMoving == 0) { createBlock(&block); blockMoving = 1; } // ZEICHNEN BeginDrawing(); ClearBackground(RAYWHITE); DrawFPS(20, 20); currentBlock = block; while (currentBlock != NULL) { DrawRectangleV(currentBlock->position, (Vector2){20, 20}, BLUE); currentBlock = currentBlock->next; } EndDrawing(); } CloseWindow(); return 0; }