From 888b0c368c6652199e7398d542cdc1f219d2ac16 Mon Sep 17 00:00:00 2001 From: Vincent Yang Date: Wed, 31 Dec 2025 18:50:45 +0800 Subject: [PATCH] Added space background --- .gitignore | 11 ++ CMakeLists.txt | 16 --- Makefile | 29 +++++ res/background.bmp | Bin 0 -> 1440054 bytes res/spaceship.png | Bin 4197 -> 0 bytes src/bullet.c | 14 ++- src/bullet.h | 13 +- src/main.c | 288 +++++++++++++++++++++++++++++---------------- src/player.c | 87 +++++++------- src/player.h | 20 ++-- 10 files changed, 301 insertions(+), 177 deletions(-) delete mode 100644 CMakeLists.txt create mode 100644 Makefile create mode 100644 res/background.bmp delete mode 100644 res/spaceship.png diff --git a/.gitignore b/.gitignore index 567609b..34b43b3 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,12 @@ build/ +.vscode/ +*.o +*.exe +*.out +*.log +.DS_Store + +star-invaders +*.kra +*.xcf +*.png \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100644 index 4001b84..0000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -cmake_minimum_required(VERSION 3.10) -project(SDL2_Example LANGUAGES C) - -# Set the C standard to C99 -set(CMAKE_C_STANDARD 99) -set(CMAKE_C_STANDARD_REQUIRED ON) - -# Find SDL2 -find_package(SDL2 REQUIRED) - -# Add your executable target -file(GLOB SOURCES "src/*.c") -add_executable(star-invaders ${SOURCES}) - -# Link the SDL2 libraries to your executable -target_link_libraries(star-invaders PRIVATE SDL2::SDL2) \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..8118678 --- /dev/null +++ b/Makefile @@ -0,0 +1,29 @@ +# Simple Makefile using sdl-config for SDL flags +CC := gcc +SDL_CFLAGS := $(shell sdl2-config --cflags) +SDL_LIBS := $(shell sdl2-config --libs) +CFLAGS := -Wall -Wextra -std=c99 $(SDL_CFLAGS) +SRCDIR := src +SOURCES := $(wildcard $(SRCDIR)/*.c) +BUILD_DIR := build +OBJECTS := $(patsubst $(SRCDIR)/%.c,$(BUILD_DIR)/%.o,$(SOURCES)) +TARGET := star-invaders + +.PHONY: all clean + +all: $(TARGET) + +$(TARGET): $(OBJECTS) + @echo " Linking $@" + @$(CC) $(OBJECTS) -o $@ $(SDL_LIBS) + +$(BUILD_DIR)/%.o: $(SRCDIR)/%.c | $(BUILD_DIR) + @echo " Compiling $<" + @$(CC) $(CFLAGS) -c $< -o $@ + +$(BUILD_DIR): + @mkdir -p $(BUILD_DIR) + +clean: + @echo "Cleaning up" + @rm -rf $(BUILD_DIR) $(TARGET) diff --git a/res/background.bmp b/res/background.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c947ade291b45fd4c8155adbf108f434b3a1c9a1 GIT binary patch literal 1440054 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�`}scF>*7VffJI5h$y^K0ka& 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 + rect->w / 2 - 2; bullets[*bulletCount].rect.y = rect->y - 10; @@ -30,3 +30,13 @@ void fireBullet(Bullet* bullets, int* bulletCount, SDL_Rect* rect) { (*bulletCount)++; } } + +void cleanupUnrenderedBullets(Bullet* bullets, int* bulletCount) { + for (int i = 0; i < *bulletCount; i++){ + if(bullets[i].active == 0){ + memmove(&bullets[i], &bullets[i + 1], sizeof(Bullet) * (*bulletCount - i - 1)); + (*bulletCount)--; + i--; + } + } +} \ No newline at end of file diff --git a/src/bullet.h b/src/bullet.h index 4af7a1f..ea287b7 100644 --- a/src/bullet.h +++ b/src/bullet.h @@ -1,16 +1,17 @@ #ifndef BULLET_H #define BULLET_H -#include +#include -#define MAX_BULLETS 100 +#define MAX_BULLETS 5 typedef struct { - SDL_Rect rect; - int active; + SDL_Rect rect; + int active; } Bullet; -void updateBullets(Bullet* bullets, int* bulletCount, SDL_Renderer* renderer); -void fireBullet(Bullet* bullets, int* bulletCount, SDL_Rect* rect); +void updateBullets(Bullet *bullets, int *bulletCount, SDL_Renderer *renderer); +void fireBullet(Bullet *bullets, int *bulletCount, SDL_Rect *rect); +void cleanupUnrenderedBullets(Bullet* bullets, int* bulletCount); #endif diff --git a/src/main.c b/src/main.c index d8bdaa9..09f9c8f 100644 --- a/src/main.c +++ b/src/main.c @@ -1,121 +1,205 @@ -#include -#include -#include #include "bullet.h" #include "player.h" +#include +#include +#include +#include #define FPS 60 -#define FRAME_DELAY (1000 / FPS) // Milliseconds per frame +#define FRAME_DELAY (1000 / FPS) // Milliseconds per frame #define SCREEN_WIDTH 800 #define SCREEN_HEIGHT 600 -void handlePlayer(SDL_Renderer* renderer, Player* player, int speed) { - // Get current keyboard state - const Uint8* keys = SDL_GetKeyboardState(NULL); +void handlePlayer(SDL_Renderer *renderer, Player *player, int speed, const Uint8 *keys) { + if (keys[SDL_SCANCODE_LEFT] || keys[SDL_SCANCODE_A]) { + movePlayerLeft(player, speed); + } + if (keys[SDL_SCANCODE_RIGHT] || keys[SDL_SCANCODE_D]) { + movePlayerRight(player, speed, SCREEN_WIDTH); + } - if (keys[SDL_SCANCODE_LEFT] || keys[SDL_SCANCODE_A]) { - movePlayerLeft(player, speed); - } - if (keys[SDL_SCANCODE_RIGHT] || keys[SDL_SCANCODE_D]) { - movePlayerRight(player, speed, SCREEN_WIDTH); - } - - // Render player flipped vertically - renderPlayerFlipped(renderer, player, SDL_FLIP_VERTICAL); + // Render player flipped vertically + renderPlayerFlipped(renderer, player, SDL_FLIP_VERTICAL); } -int main(int argc, char* argv[]) { - if (SDL_Init(SDL_INIT_VIDEO) != 0) { - fprintf(stderr, "Could not initialize SDL: %s\n", SDL_GetError()); - return EXIT_FAILURE; +int main(int argc, char *argv[]) { + if (SDL_Init(SDL_INIT_VIDEO) != 0) { + fprintf(stderr, "Could not initialize SDL: %s\n", SDL_GetError()); + return EXIT_FAILURE; + } + + char *resLocation = "./res/"; + + for (int args = 1; args < argc; args++) { + if (strcmp(argv[args], "--help") == 0 || + strcmp(argv[args], "-h") == 0) { + printf("Star Invaders Help:\n"); + printf("Use arrow keys or A/D to move the spaceship left and right.\n"); + printf("Press SPACE to fire bullets.\n"); + printf("Press ESC or close the window to exit the game.\n"); + printf("Use --res-location or -rl to specify the resource location.\n"); + SDL_Quit(); + return EXIT_SUCCESS; + } else if (strcmp(argv[args], "--version") == 0 || + strcmp(argv[args], "-v") == 0) { + printf("Star Invaders Version 1.0.0\n"); + SDL_Quit(); + return EXIT_SUCCESS; + } else if (strcmp(argv[args], "--res-location") == 0 || + strcmp(argv[args], "-rl") == 0) { + resLocation = argv[args + 1]; + args++; + } else { + printf("Unknown argument: %s\n", argv[args]); + printf("Use --help or -h for usage information.\n"); + SDL_Quit(); + return EXIT_FAILURE; } + } + printf("Using resource location: %s\n", resLocation); - SDL_Window* window = SDL_CreateWindow("Star Invaders", - SDL_WINDOWPOS_CENTERED, - SDL_WINDOWPOS_CENTERED, - SCREEN_WIDTH, SCREEN_HEIGHT, - SDL_WINDOW_SHOWN); - if (!window) { - fprintf(stderr, "Could not create window: %s\n", SDL_GetError()); - SDL_Quit(); - return EXIT_FAILURE; - } + // Build full paths for assets + size_t pathLen; + char *spaceshipPath; + char *backgroundPath; + const char *shipFile = "spaceship.bmp"; + const char *bgFile = "background.bmp"; - SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); - if (!renderer) { - fprintf(stderr, "Could not create renderer: %s\n", SDL_GetError()); - SDL_DestroyWindow(window); - SDL_Quit(); - return EXIT_FAILURE; - } + pathLen = strlen(resLocation) + strlen(shipFile) + 2; + spaceshipPath = (char *)malloc(pathLen); + if (!spaceshipPath) { + fprintf(stderr, "Out of memory\n"); + SDL_Quit(); + return EXIT_FAILURE; + } + if (resLocation[strlen(resLocation) - 1] == '/') { + snprintf(spaceshipPath, pathLen, "%s%s", resLocation, shipFile); + } else { + snprintf(spaceshipPath, pathLen, "%s/%s", resLocation, shipFile); + } - // Rectangle position and size - SDL_Rect rect = {400, 500, 50, 50}; - int speed = 5; + pathLen = strlen(resLocation) + strlen(bgFile) + 2; + backgroundPath = (char *)malloc(pathLen); + if (!backgroundPath) { + free(spaceshipPath); + fprintf(stderr, "Out of memory\n"); + SDL_Quit(); + return EXIT_FAILURE; + } + if (resLocation[strlen(resLocation) - 1] == '/') { + snprintf(backgroundPath, pathLen, "%s%s", resLocation, bgFile); + } else { + snprintf(backgroundPath, pathLen, "%s/%s", resLocation, bgFile); + } - // Bullets array - Bullet bullets[MAX_BULLETS]; - int bulletCount = 0; - for (int i = 0; i < MAX_BULLETS; i++) { - bullets[i].active = 0; - } + SDL_Window *window = SDL_CreateWindow("Star Invaders", SDL_WINDOWPOS_CENTERED, + SDL_WINDOWPOS_CENTERED, SCREEN_WIDTH, + SCREEN_HEIGHT, SDL_WINDOW_SHOWN); + if (!window) { + fprintf(stderr, "Could not create window: %s\n", SDL_GetError()); + SDL_Quit(); + return EXIT_FAILURE; + } - // Create player - Player* player = createPlayer(renderer, "../res/spaceship.bmp", 400, 500); - if (!player) { - SDL_DestroyRenderer(renderer); - SDL_DestroyWindow(window); - SDL_Quit(); - return EXIT_FAILURE; - } - - // Main loop flag - int running = 1; - SDL_Event event; - Uint32 frameStart; - int frameTime; - int spacePressedLastFrame = 0; - - // Main loop - while (running) { - frameStart = SDL_GetTicks(); - - while (SDL_PollEvent(&event)) { - if (event.type == SDL_QUIT) { - running = 0; - } - } - - // Get current keyboard state for space key - const Uint8* keys = SDL_GetKeyboardState(NULL); - if (keys[SDL_SCANCODE_SPACE] && !spacePressedLastFrame) { - fireBullet(bullets, &bulletCount, &player->rect); - } - spacePressedLastFrame = keys[SDL_SCANCODE_SPACE]; - - // Clear screen with black - SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); - SDL_RenderClear(renderer); - - // Update and draw bullets - updateBullets(bullets, &bulletCount, renderer); - - // Handle player movement and rendering - handlePlayer(renderer, player, speed); - - // Present the rendered frame - SDL_RenderPresent(renderer); - - // Cap framerate at 60 FPS - frameTime = SDL_GetTicks() - frameStart; - if (frameTime < FRAME_DELAY) { - SDL_Delay(FRAME_DELAY - frameTime); - } - } - - destroyPlayer(player); - SDL_DestroyRenderer(renderer); + SDL_Renderer *renderer = + SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); + if (!renderer) { + fprintf(stderr, "Could not create renderer: %s\n", SDL_GetError()); SDL_DestroyWindow(window); SDL_Quit(); - return EXIT_SUCCESS; + return EXIT_FAILURE; + } + + int speed = 5; + + // Bullets array + Bullet bullets[MAX_BULLETS]; + int bulletCount = 0; + for (int i = 0; i < MAX_BULLETS; i++) { + bullets[i].active = 0; + } + + // Create player + Player *player = createPlayer(renderer, spaceshipPath, 400, 500); + if (!player) { + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + free(spaceshipPath); + free(backgroundPath); + SDL_Quit(); + return EXIT_FAILURE; + } + + // Load background + SDL_Texture *background = NULL; + SDL_Surface *bgSurface = SDL_LoadBMP(backgroundPath); + if (!bgSurface) { + fprintf(stderr, "Could not load background %s: %s\n", backgroundPath, SDL_GetError()); + } else { + background = SDL_CreateTextureFromSurface(renderer, bgSurface); + SDL_FreeSurface(bgSurface); + if (!background) { + fprintf(stderr, "Could not create background texture: %s\n", SDL_GetError()); + } + } + + // Main loop flag + int running = 1; + SDL_Event event; + Uint32 frameStart; + int frameTime; + int spacePressedLastFrame = 0; + + // Main loop + while (running) { + frameStart = SDL_GetTicks(); + + while (SDL_PollEvent(&event)) { + if (event.type == SDL_QUIT) { + running = 0; + } + } + + // Get current keyboard state for space key + const Uint8 *keys = SDL_GetKeyboardState(NULL); + if (keys[SDL_SCANCODE_SPACE] && !spacePressedLastFrame) { + fireBullet(bullets, &bulletCount, &player->rect); + } + spacePressedLastFrame = keys[SDL_SCANCODE_SPACE]; + + // Clear screen with black + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); + SDL_RenderClear(renderer); + // Draw background if available + if (background) { + SDL_RenderCopy(renderer, background, NULL, NULL); + } + + // Update and draw bullets + updateBullets(bullets, &bulletCount, renderer); + cleanupUnrenderedBullets(bullets, &bulletCount); + + // Handle player movement and rendering + handlePlayer(renderer, player, speed, keys); + + // Present the rendered frame + SDL_RenderPresent(renderer); + + // Cap framerate at 60 FPS + frameTime = SDL_GetTicks() - frameStart; + if (frameTime < FRAME_DELAY) { + SDL_Delay(FRAME_DELAY - frameTime); + } + } + + destroyPlayer(player); + if (background) { + SDL_DestroyTexture(background); + } + free(spaceshipPath); + free(backgroundPath); + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + SDL_Quit(); + return EXIT_SUCCESS; } \ No newline at end of file diff --git a/src/player.c b/src/player.c index 2383669..4b3cb5a 100644 --- a/src/player.c +++ b/src/player.c @@ -2,56 +2,59 @@ #include #include -Player* createPlayer(SDL_Renderer* renderer, const char* imagePath, int x, int y) { - Player* player = (Player*)malloc(sizeof(Player)); - - SDL_Surface* surface = SDL_LoadBMP(imagePath); - if (!surface) { - fprintf(stderr, "Could not load image %s: %s\n", imagePath, SDL_GetError()); - free(player); - return NULL; - } - - player->texture = SDL_CreateTextureFromSurface(renderer, surface); - SDL_FreeSurface(surface); - - if (!player->texture) { - fprintf(stderr, "Could not create texture: %s\n", SDL_GetError()); - free(player); - return NULL; - } - - player->rect.x = x; - player->rect.y = y; - player->rect.w = 50; - player->rect.h = 50; - - return player; +Player *createPlayer(SDL_Renderer *renderer, const char *imagePath, int x, + int y) { + Player *player = (Player *)malloc(sizeof(Player)); + + SDL_Surface *surface = SDL_LoadBMP(imagePath); + if (!surface) { + fprintf(stderr, "Could not load image %s: %s\n", imagePath, SDL_GetError()); + free(player); + return NULL; + } + + player->texture = SDL_CreateTextureFromSurface(renderer, surface); + SDL_FreeSurface(surface); + + if (!player->texture) { + fprintf(stderr, "Could not create texture: %s\n", SDL_GetError()); + free(player); + return NULL; + } + + player->rect.x = x; + player->rect.y = y; + player->rect.w = 50; + player->rect.h = 50; + + return player; } -void renderPlayer(SDL_Renderer* renderer, Player* player) { - SDL_RenderCopy(renderer, player->texture, NULL, &player->rect); +void renderPlayer(SDL_Renderer *renderer, Player *player) { + SDL_RenderCopy(renderer, player->texture, NULL, &player->rect); } -void renderPlayerFlipped(SDL_Renderer* renderer, Player* player, SDL_RendererFlip flip) { - SDL_RenderCopyEx(renderer, player->texture, NULL, &player->rect, 0, NULL, flip); +void renderPlayerFlipped(SDL_Renderer *renderer, Player *player, + SDL_RendererFlip flip) { + SDL_RenderCopyEx(renderer, player->texture, NULL, &player->rect, 0, NULL, + flip); } -void movePlayerLeft(Player* player, int speed) { - if (player->rect.x - speed >= 0) { - player->rect.x -= speed; - } +void movePlayerLeft(Player *player, int speed) { + if (player->rect.x - speed >= 0) { + player->rect.x -= speed; + } } -void movePlayerRight(Player* player, int speed, int screenWidth) { - if (player->rect.x + player->rect.w + speed <= screenWidth) { - player->rect.x += speed; - } +void movePlayerRight(Player *player, int speed, int screenWidth) { + if (player->rect.x + player->rect.w + speed <= screenWidth) { + player->rect.x += speed; + } } -void destroyPlayer(Player* player) { - if (player) { - SDL_DestroyTexture(player->texture); - free(player); - } +void destroyPlayer(Player *player) { + if (player) { + SDL_DestroyTexture(player->texture); + free(player); + } } diff --git a/src/player.h b/src/player.h index e3c05b2..c55a0fe 100644 --- a/src/player.h +++ b/src/player.h @@ -1,18 +1,20 @@ #ifndef PLAYER_H #define PLAYER_H -#include +#include typedef struct { - SDL_Texture* texture; - SDL_Rect rect; + SDL_Texture *texture; + SDL_Rect rect; } Player; -Player* createPlayer(SDL_Renderer* renderer, const char* imagePath, int x, int y); -void renderPlayer(SDL_Renderer* renderer, Player* player); -void renderPlayerFlipped(SDL_Renderer* renderer, Player* player, SDL_RendererFlip flip); -void movePlayerLeft(Player* player, int speed); -void movePlayerRight(Player* player, int speed, int screenWidth); -void destroyPlayer(Player* player); +Player *createPlayer(SDL_Renderer *renderer, const char *imagePath, int x, + int y); +void renderPlayer(SDL_Renderer *renderer, Player *player); +void renderPlayerFlipped(SDL_Renderer *renderer, Player *player, + SDL_RendererFlip flip); +void movePlayerLeft(Player *player, int speed); +void movePlayerRight(Player *player, int speed, int screenWidth); +void destroyPlayer(Player *player); #endif