From 6f0e3444928e349df326742b1a8cc3b35fa96b99 Mon Sep 17 00:00:00 2001 From: huaqo-games Date: Sat, 1 Feb 2025 23:41:10 +0100 Subject: [PATCH] Bee movement, infinite tiles, flowers with random position --- Makefile | 6 +- assets/flower.aseprite | Bin 0 -> 795 bytes assets/flower.png | Bin 0 -> 654 bytes grass.aseprite => assets/grass.aseprite | Bin bin/game | Bin 35288 -> 108456 bytes bin/game.dSYM/Contents/Info.plist | 20 + bin/game.dSYM/Contents/Resources/DWARF/game | Bin 0 -> 34920 bytes .../Resources/Relocations/aarch64/game.yml | 5 + scripts/main.c | 361 ++++++++++++++++++ scripts/main.cpp | 136 ------- scripts/main_crossplattform.cpp | 26 ++ scripts/object.c | 0 12 files changed, 415 insertions(+), 139 deletions(-) create mode 100644 assets/flower.aseprite create mode 100644 assets/flower.png rename grass.aseprite => assets/grass.aseprite (100%) create mode 100644 bin/game.dSYM/Contents/Info.plist create mode 100644 bin/game.dSYM/Contents/Resources/DWARF/game create mode 100644 bin/game.dSYM/Contents/Resources/Relocations/aarch64/game.yml create mode 100644 scripts/main.c delete mode 100644 scripts/main.cpp create mode 100644 scripts/main_crossplattform.cpp create mode 100644 scripts/object.c diff --git a/Makefile b/Makefile index b5795df..0d1490c 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ -CXX = clang++ +CXX = clang EMCC = emcc -FLAGS = -Wall -std=c++17 $(shell pkg-config --libs --cflags raylib) -SRC = scripts/main.cpp +FLAGS = -std=c99 -g -Wall -Werror -Wpedantic -Wconversion -Wshadow -Wstrict-prototypes -fsanitize=address,undefined -O0 $(shell pkg-config --libs --cflags raylib) +SRC = scripts/main.c # ARM Build ARM_TARGET = bin/game diff --git a/assets/flower.aseprite b/assets/flower.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..fc137e95db322b925e42692f042b802db292502a GIT binary patch literal 795 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 literal 35288 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 + + + + CFBundleDevelopmentRegion + English + CFBundleIdentifier + com.apple.xcode.dsym.game + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + dSYM + CFBundleSignature + ???? + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/bin/game.dSYM/Contents/Resources/DWARF/game b/bin/game.dSYM/Contents/Resources/DWARF/game new file mode 100644 index 0000000000000000000000000000000000000000..7a7edf6d4becd9b0f303c3e29d6dfd6ec8959544 GIT binary patch literal 34920 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 G@%ul%y=x!< literal 0 HcmV?d00001 diff --git a/bin/game.dSYM/Contents/Resources/Relocations/aarch64/game.yml b/bin/game.dSYM/Contents/Resources/Relocations/aarch64/game.yml new file mode 100644 index 0000000..0e63948 --- /dev/null +++ b/bin/game.dSYM/Contents/Resources/Relocations/aarch64/game.yml @@ -0,0 +1,5 @@ +--- +triple: 'arm64-apple-darwin' +binary-path: 'bin/game' +relocations: [] +... diff --git a/scripts/main.c b/scripts/main.c new file mode 100644 index 0000000..0b0f8e1 --- /dev/null +++ b/scripts/main.c @@ -0,0 +1,361 @@ +#include +// WHITE, Color, +// KEY_RIGHT, KEY_LEFT, KEY_DOWN, KEY_UP, IsKeyDown(), +// InitWindow(), SetTargetFPS(), WindowShouldClose(), GetFrameTime(), CloseWindow() +// Music, InitAudioDevice(), LoadMusicStream(), PlayMusicStream(), UpdateMusicStream(), UnloadMusicStream(), CloseAudioDevice(), +// Texture2D, Rectangle, Vector2, LoadTexture(), DrawTexturePro(), UnloadTexture(), +// BeginDrawing(), EndDrawing(), ClearBackground(), +// Camera2D, BeginMode2D(), EndMode2D() +#include // Vector2Length(), Vector2Normalize(), Vector2Add(), Vector2Scale(), Lerp() +#include // rand(), srand() +#include // time() +#include // memcpy() +#include + +// Structs + +typedef struct { + Vector2 *data; + size_t count; +} Vector2Array; + +typedef struct { + Texture2D texture; // Texture for the sprite + Rectangle sourceRec; // Source rectangle for the texture + Rectangle destRec; // Destination rectangle for the texture + Vector2 frameSize; // Size of the frame in the texture + Vector2 origin; // Origin point for rotation and positioning + float rotation; // Rotation angle + Color color; +} Sprite; + +typedef struct { + Sprite sprite; + Rectangle bounds; +} TileSprite; + +typedef struct { + Sprite sprite; // Base sprite for rendering + int currentFrame; // Current animation frame + int maxFrame; // Total number of frames + int framesCounter; // Counter to control frame speed + int framesSpeed; // Speed of the animation (frames per second) + float animTimer; + bool isVertical; // Whether the animation frames are arranged vertically +} AnimSprite; + +typedef struct { + Sprite sprite; + Vector2 position; +} Object; + +typedef struct { + Object *data; + const Object *prototype; + size_t count; +} ObjectArray; + +typedef struct { + AnimSprite animSprite; + Vector2 position; + Vector2 direction; + float velocity; +} Entity; + +// Pure functions + +float GetRandomFloat(const float min, const float max){ + return min + (float)rand() / (float)(RAND_MAX / (max - min)); +} + +Vector2 GetRandomVector(const Rectangle bounds){ + return (Vector2){ + GetRandomFloat(bounds.x, bounds.x + bounds.width), + GetRandomFloat(bounds.y, bounds.y + bounds.height) + }; +} + +ObjectArray CreateObjectArray(const Object *prototype, const size_t count) { + ObjectArray objects = {0}; + + if (count <= 0) { + printf("Objects size must be greater than 0.\n"); + return objects; + } + + objects.count = count; + objects.data = malloc(count * sizeof(Object)); + + if (!objects.data) { + printf("Memory allocation of objects failed.\n"); + return objects; + } + + objects.prototype = prototype; + + for (int i = 0; i < count; i++) { + objects.data[i].position = prototype->position; + objects.data[i].sprite = prototype->sprite; + } + return objects; +} + +// Mutator Functions + +void GetDirectionFromInput(Vector2 *direction){ + *direction = (Vector2){0.0f, 0.0f}; + if (IsKeyDown(KEY_RIGHT) || IsKeyDown(KEY_D)){ direction->x += 1.0f; } + if (IsKeyDown(KEY_LEFT) || IsKeyDown(KEY_A)){ direction->x -= 1.0f; } + if (IsKeyDown(KEY_DOWN) || IsKeyDown(KEY_S)){ direction->y += 1.0f; } + if (IsKeyDown(KEY_UP) || IsKeyDown(KEY_W)){ direction->y -= 1.0f; } + if (Vector2Length(*direction) > 0.0f) { *direction = Vector2Normalize(*direction); } +} + +void SetPositionOnDirectionAndVelocity(const Vector2 *direction, const float *velocity, Vector2 *position) { + *position = Vector2Add(*position, Vector2Scale(*direction, *velocity * GetFrameTime())); +} + +void SetDestRecOnPosition(const Vector2 *position, Sprite *sprite){ + Rectangle newDestRec = { + position->x, + position->y, + sprite->frameSize.x, + sprite->frameSize.y + }; + sprite->destRec = newDestRec; +} + +void SetAnimSpriteOnFrameTime(AnimSprite *animSprite) { + animSprite->animTimer += GetFrameTime(); + float frameTime = 1.0f / animSprite->framesSpeed; + + if (animSprite->animTimer < frameTime) { + return; + } + + animSprite->animTimer -= frameTime; + animSprite->currentFrame++; + + if (animSprite->currentFrame >= animSprite->maxFrame) { + animSprite->currentFrame = 0; + } + + if (animSprite->isVertical) { + animSprite->sprite.sourceRec.y = animSprite->currentFrame * animSprite->sprite.frameSize.y; + } else { + animSprite->sprite.sourceRec.x = animSprite->currentFrame * animSprite->sprite.frameSize.x; + } +} + +void SetRotationOnDirection(const Vector2 *direction, float *rotationDegree){ + if(Vector2Length(*direction) <= 0.0f){ + return; + } + float targetRotationDegree = (float)atan2(direction->y, direction->x) * (180.0f / PI) + 90.0f; + *rotationDegree = Lerp(*rotationDegree, targetRotationDegree, 0.1f); +} + +void SetPositionForObjectArray(ObjectArray *objects, const Vector2Array *positions) { + if (positions->count != objects->count) { + printf("Warning: Position array size (%zu) does not match ObjectArray size (%zu)\n", positions->count, objects->count); + return; + } + + for (size_t i = 0; i < objects->count; i++) { + objects->data[i].position = positions->data[i]; + objects->data[i].sprite.destRec.x = positions->data[i].x; + objects->data[i].sprite.destRec.y = positions->data[i].y; + } +} + +void SetRandomPositionForObjectArray(ObjectArray *objects, const Rectangle bounds){ + srand((unsigned int)time(NULL)); + for (int i = 0; i < objects->count; i++) { + Vector2 position = GetRandomVector(bounds); + objects->data[i].position = position; + objects->data[i].sprite.destRec.x = position.x; + objects->data[i].sprite.destRec.y = position.y; + } +} + +void UpdateEntity(Entity *entity) { + GetDirectionFromInput(&entity->direction); + SetRotationOnDirection(&entity->direction, &entity->animSprite.sprite.rotation); + SetPositionOnDirectionAndVelocity(&entity->direction, &entity->velocity, &entity->position); + SetDestRecOnPosition(&entity->position, &entity->animSprite.sprite); + SetAnimSpriteOnFrameTime(&entity->animSprite); +} + +void UpdateTileSprite(TileSprite *tileSprite, const Camera2D *camera){ + tileSprite->bounds.x = (int)((camera->target.x - (GetScreenWidth() / 2.0f / camera->zoom)) / tileSprite->sprite.frameSize.x) - 1; + tileSprite->bounds.width = (int)((camera->target.x + (GetScreenWidth() / 2.0f / camera->zoom)) / tileSprite->sprite.frameSize.x) + 1; + tileSprite->bounds.y = (int)((camera->target.y - (GetScreenHeight() / 2.0f / camera->zoom)) / tileSprite->sprite.frameSize.y) - 1; + tileSprite->bounds.height = (int)((camera->target.y + (GetScreenHeight() / 2.0f / camera->zoom)) / tileSprite->sprite.frameSize.y) + 1; +} + +void UpdateCamera2D(Camera2D *camera, const Entity *player, const float smoothness){ + camera->target = Vector2Lerp(camera->target, player->position, smoothness * GetFrameTime()); +} + +void SwapAndPopObjectsArrayOnCollision(ObjectArray *objects, const Rectangle rec){ + for (int i = 0; i < objects->count; i++){ + + if (CheckCollisionRecs(rec, objects->data[i].sprite.destRec)){ + if (objects->count == 1) { + objects->count = 0; + break; + } + objects->data[i] = objects->data[objects->count - 1]; + objects->count--; + i--; + } + } +} + +void RenderSprite(const Sprite *sprite){ + DrawTexturePro( + sprite->texture, + sprite->sourceRec, + sprite->destRec, + sprite->origin, + sprite->rotation, + sprite->color + ); +} + +void RenderTileSprite(TileSprite *tileSprite){ + for (float y = tileSprite->bounds.y; y <= tileSprite->bounds.height; y++) + { + for (float x = tileSprite->bounds.x; x <= tileSprite->bounds.width; x++) + { + Vector2 tilePosition = {x * tileSprite->sprite.frameSize.x, y * tileSprite->sprite.frameSize.y}; + SetDestRecOnPosition(&tilePosition, &tileSprite->sprite); + RenderSprite(&tileSprite->sprite); + } + } +} + +void RenderObjectArray(const ObjectArray *objects){ + for (int i = 0; i < objects->count; i++){ + RenderSprite(&objects->data[i].sprite); + } +} + +// Main + +int main(void) +{ + // Load + // SetConfigFlags(FLAG_VSYNC_HINT); + InitWindow(1280, 720, "Lazy Bee"); + InitAudioDevice(); + Music music = LoadMusicStream("assets/beez.mp3"); + PlayMusicStream(music); + TileSprite floor = { + .sprite = { + .texture = LoadTexture("assets/grass.png"), + .frameSize = {16.0f,16.0f}, + .sourceRec = { 0.0f, 0.0f, 16.0f, 16.0f}, + .destRec = {0.0f, 0.0f, 16.0f, 16.0f}, + .origin = {8.0f, 8.0f}, + .rotation = 0.0f, + .color = WHITE + }, + .bounds = {0.0f,0.0f,0.0f,0.0f} + }; + Object hive = { + .sprite = { + .texture = LoadTexture("assets/hive.png"), + .frameSize = {32.0f,32.0f}, + .sourceRec = {0.0f, 0.0f, 32.0f, 32.0f}, + .destRec = {0.0f, 0.0f, 32.0f, 32.0f}, + .origin = {16.0f, 16.0f}, + .rotation = 0.0f, + .color = WHITE + }, + .position = (Vector2){0.0f,0.0f} + }; + Texture2D flower = LoadTexture("assets/flower.png"); + ObjectArray flowers = CreateObjectArray(&(Object){ + .sprite = { + .texture = flower, + .frameSize = {16.0f, 16.0f}, + .sourceRec = {0.0f, 0.0f, 16.0f, 16.0f}, + .destRec = {0.0f, 0.0f, 16.0f, 16.0f}, + .origin = {8.0f, 8.0f}, + .rotation = 45.0f, + .color = WHITE + }, + .position = {0.0f, 0.0f} + }, 10); + if (!flowers.data) { + printf("Memory allocation failed.\n"); + exit(1); + } + Rectangle flowerField = {-50.0f, -50.0f, 100.0f, 100.0f}; + SetRandomPositionForObjectArray(&flowers, flowerField); + Entity player = { + .animSprite = { + .sprite = { + .texture = LoadTexture("assets/character_bee.png"), + .frameSize = {16.0f, 16.0f}, + .sourceRec = {0.0f, 0.0f, 16.0f, 16.0f}, + .destRec = {0.0f, 0.0f, 16.0f, 16.0f}, + .origin = {8.0f, 8.0f}, + .rotation = 0.0f, + .color = WHITE + }, + .currentFrame = 0, + .maxFrame = 4, + .framesCounter = 0, + .framesSpeed = 10, + .isVertical = true, + .animTimer = 0.0f + }, + .position = hive.position, + .direction = (Vector2){0.0f,0.0f}, + .velocity = 50.0f + }; + Camera2D camera = { + .offset = (Vector2){GetScreenWidth() / 2.0f, GetScreenHeight() / 2.0f}, + .target = player.position, + .rotation = 0.0f, + .zoom = 10.0f + }; + float followSmoothness = 5.0f; + Vector2 mousePoint = { 0.0f, 0.0f}; + + // Update & Render + while (!WindowShouldClose()) + { + // Update + mousePoint = GetMousePosition(); + UpdateMusicStream(music); + UpdateTileSprite(&floor, &camera); + UpdateEntity(&player); + UpdateCamera2D(&camera, &player, followSmoothness); + SwapAndPopObjectsArrayOnCollision(&flowers, player.animSprite.sprite.destRec); + // Render + BeginDrawing(); + ClearBackground(BLACK); + BeginMode2D(camera); + RenderTileSprite(&floor); + RenderSprite(&hive.sprite); + RenderObjectArray(&flowers); + RenderSprite(&player.animSprite.sprite); + EndMode2D(); + DrawFPS(10,10); + EndDrawing(); + } + // Unload + UnloadTexture(floor.sprite.texture); + UnloadTexture(hive.sprite.texture); + UnloadTexture(flower); + UnloadTexture(player.animSprite.sprite.texture); + UnloadMusicStream(music); + free(flowers.data); + // Close + CloseAudioDevice(); + CloseWindow(); + return 0; +} diff --git a/scripts/main.cpp b/scripts/main.cpp deleted file mode 100644 index 3a84c63..0000000 --- a/scripts/main.cpp +++ /dev/null @@ -1,136 +0,0 @@ -#include -#include - -Vector2 getDirection(){ - Vector2 direction = {0.0f, 0.0f}; - if (IsKeyDown(KEY_RIGHT) || IsKeyDown(KEY_D)){ direction = Vector2Add(direction, {1.0f , 0.0f}); } - if (IsKeyDown(KEY_LEFT) || IsKeyDown(KEY_A)){ direction = Vector2Add(direction, {-1.0f, 0.0f}); } - if (IsKeyDown(KEY_DOWN) || IsKeyDown(KEY_S)){ direction = Vector2Add(direction, {0.0f, 1.0f}); } - if (IsKeyDown(KEY_UP) || IsKeyDown(KEY_W)){ direction = Vector2Add(direction, {0.0f, -1.0f}); } - if (Vector2Length(direction) > 0.0f) { direction = Vector2Normalize(direction); } - return direction; -} - -int main() -{ - int screenWidth = 1280; - int screenHeight = 720; - InitWindow(screenWidth, screenHeight, "Lazy Bee"); - SetTargetFPS(60); - - // Init Audio - InitAudioDevice(); - Music music = LoadMusicStream("assets/beez.mp3"); - PlayMusicStream(music); - - // Init Tiles - Texture2D tileTexture = LoadTexture("assets/grass.png"); - Vector2 tileFrameSize = {16.0f, 16.0f}; - Rectangle tileSourceRec = { tileFrameSize.x, tileFrameSize.y, tileFrameSize.x, tileFrameSize.y}; - - // Init Character - Texture2D characterTexture = LoadTexture("assets/character_bee.png"); - Vector2 charFrameSize = {16.0f, 16.0f}; - Rectangle charSourceRec = {0.0f, 0.0f, charFrameSize.x, charFrameSize.y}; - Vector2 charPosition = {0.0f, 0.0f}; - Vector2 charOrigin = {charFrameSize.x / 2.0f, charFrameSize.y / 2.0f}; - float charRotation = 0.0f; - - // Init Character Animation - int currentFrame = 0; - int framesCounter = 0; - int framesSpeed = 10; - - // Init Camera - Camera2D camera = { 0 }; - camera.target = charPosition; - camera.offset = (Vector2){screenWidth / 2.0f, screenHeight / 2.0f}; - camera.rotation = 0.0f; - camera.zoom = 10.0f; - - // Init hive - Texture2D hiveTexture = LoadTexture("assets/hive.png"); - Vector2 hiveFrameSize = {32.0f,32.0f}; - Rectangle hiveSourceRec = {0.0f, 0.0f, hiveFrameSize.x, hiveFrameSize.y}; - Vector2 hivePosition = {0.0f,0.0f}; - Rectangle hiveDestRec = {hivePosition.x, hivePosition.y, hiveFrameSize.x, hiveFrameSize.y}; - Vector2 hiveOrigin = {hiveFrameSize.x / 2.0f, hiveFrameSize.y / 2.0f}; - - while (!WindowShouldClose()) - { - UpdateMusicStream(music); - - - // Update Char Movement - Vector2 direction = getDirection(); - Vector2 targetPosition = Vector2Add(charPosition, Vector2Scale(direction, 100.0f * GetFrameTime())); - charPosition = {Lerp(charPosition.x, targetPosition.x, 0.3f),Lerp(charPosition.y, targetPosition.y, 0.3f)}; - - // Update Char Rotation - if (Vector2Length(direction) > 0.0f) { - float targetRotation = atan2(direction.y, direction.x) * (180.0f / PI) + 90.0f; - charRotation = Lerp(charRotation, targetRotation, 0.1f); - } - - // Update Char Animation - framesCounter++; - - if (framesCounter >= (60 / framesSpeed)) - { - framesCounter = 0; - currentFrame++; - if (currentFrame >= 4) - currentFrame = 0; - charSourceRec.y = currentFrame * charFrameSize.y; - } - - // Update Char Camera - camera.target = charPosition; - - // Render - BeginDrawing(); - ClearBackground(BLACK); - BeginMode2D(camera); - - // Render Tiles - float left = camera.target.x - (screenWidth / 2.0f / camera.zoom); - float right = camera.target.x + (screenWidth / 2.0f / camera.zoom); - float top = camera.target.y - (screenHeight / 2.0f / camera.zoom); - float bottom = camera.target.y + (screenHeight / 2.0f / camera.zoom); - - int startX = (int)(left / tileFrameSize.x) - 1; - int endX = (int)(right / tileFrameSize.x) + 1; - int startY = (int)(top / tileFrameSize.y) - 1; - int endY = (int)(bottom / tileFrameSize.y) + 1; - - for (int y = startY; y <= endY; y++) - { - for (int x = startX; x <= endX; x++) - { - Vector2 tilePosition = {x * tileFrameSize.x, y * tileFrameSize.y}; - Rectangle tileDestRec = {tilePosition.x, tilePosition.y, tileFrameSize.x, tileFrameSize.y}; - DrawTexturePro(tileTexture, tileSourceRec, tileDestRec, (Vector2){0.0f, 0.0f}, 0.0f, WHITE); - } - } - - // Render Hive - DrawTexturePro(hiveTexture, hiveSourceRec, hiveDestRec, hiveOrigin, 0.0f, WHITE); - - // Render Character - Rectangle charDestRec = {charPosition.x, charPosition.y, charFrameSize.x, charFrameSize.y}; - DrawTexturePro(characterTexture, charSourceRec, charDestRec, charOrigin, charRotation, WHITE); - - EndMode2D(); - EndDrawing(); - } - - // Unload Character - UnloadTexture(characterTexture); - UnloadTexture(tileTexture); - UnloadMusicStream(music); - - CloseAudioDevice(); - CloseWindow(); - - return 0; -} \ No newline at end of file diff --git a/scripts/main_crossplattform.cpp b/scripts/main_crossplattform.cpp new file mode 100644 index 0000000..20d73ac --- /dev/null +++ b/scripts/main_crossplattform.cpp @@ -0,0 +1,26 @@ +#include "raylib.h" +#include "Game.h" + +#ifdef PLATFORM_WEB + #include +#endif + +Game game; + +void UpdateDrawFrame() { + game.update(); + game.render(); +} + +int main() { + InitWindow(1280, 720, "Lazy Bee"); + SetTargetFPS(60); + game.init(); +#ifdef PLATFORM_WEB + emscripten_set_main_loop(UpdateDrawFrame, 0, 1); +#else + while (!WindowShouldClose()) { game.update(); game.render(); } +#endif + game.close(); + return 0; +} diff --git a/scripts/object.c b/scripts/object.c new file mode 100644 index 0000000..e69de29