Actually compiled

This commit is contained in:
2026-02-04 17:44:53 -06:00
parent 708c4d0ec3
commit dd910a31aa
20 changed files with 80 additions and 430 deletions

View File

@@ -1,10 +1,11 @@
#!/bin/bash
docker build -t myapp:latest -f .ci/dolphin/Dockerfile .
docker run -it -v ./:/workdir myapp:latest /bin/bash -c ' \
export PATH="$DEVKITPPC/bin:$PATH" && \
cd /workdir && \
rm -rf build2 && \
mkdir -p build2 && \
cmake -S. -Bbuild2 -DDUSK_TARGET_SYSTEM=gamecube -DCMAKE_TOOLCHAIN_FILE="$DEVKITPRO/cmake/GameCube.cmake"
cmake -S. -Bbuild2 -DDUSK_TARGET_SYSTEM=gamecube -DCMAKE_TOOLCHAIN_FILE="$DEVKITPRO/cmake/GameCube.cmake" && \
cd build2 && \
make VERBOSE=1 \
'

View File

@@ -4,7 +4,8 @@
# https://opensource.org/licenses/MIT
# Setup
cmake_minimum_required(VERSION 3.13)
cmake_minimum_required(VERSION 3.18)
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules)
@@ -17,7 +18,7 @@ set(DUSK_CACHE_TARGET "dusk-target")
# Build variables
set(DUSK_ROOT_DIR "${CMAKE_SOURCE_DIR}")
set(DUSK_BUILD_DIR "${CMAKE_BINARY_DIR}")
set(DUSK_SOURCES_DIR "${DUSK_ROOT_DIR}/src2")
set(DUSK_SOURCES_DIR "${DUSK_ROOT_DIR}/src")
set(DUSK_TEST_DIR "${DUSK_ROOT_DIR}/test")
set(DUSK_TEMP_DIR "${DUSK_BUILD_DIR}/temp")
set(DUSK_TOOLS_DIR "${DUSK_ROOT_DIR}/tools")
@@ -118,27 +119,11 @@ elseif(DUSK_TARGET_SYSTEM STREQUAL "psp")
elseif(DUSK_TARGET_SYSTEM STREQUAL "gamecube" OR DUSK_TARGET_SYSTEM STREQUAL "wii")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -fno-exceptions")
configure_file(opengl.pc.in opengl.pc @ONLY)
find_package(PkgConfig REQUIRED)
pkg_check_modules(SDL2 IMPORTED_TARGET sdl2)
pkg_check_modules(SDL2_ttf IMPORTED_TARGET SDL2_ttf)
pkg_check_modules(SDL2_image IMPORTED_TARGET SDL2_image)
pkg_check_modules(SDL2_mixer IMPORTED_TARGET SDL2_mixer)
pkg_check_modules(OPENGL IMPORTED_TARGET opengl)
pkg_check_modules(zip IMPORTED_TARGET libzip)
pkg_check_modules(GLU IMPORTED_TARGET glu)
pkg_check_modules(freetype2 IMPORTED_TARGET freetype2)
target_link_libraries(${DUSK_LIBRARY_TARGET_NAME} PUBLIC
PkgConfig::SDL2
PkgConfig::SDL2_ttf
PkgConfig::SDL2_image
PkgConfig::SDL2_mixer
PkgConfig::zip
PkgConfig::GLU
PkgConfig::freetype2
)
target_compile_definitions(${DUSK_LIBRARY_TARGET_NAME} PUBLIC
DOLPHIN
@@ -169,14 +154,12 @@ elseif(DUSK_TARGET_SYSTEM STREQUAL "gamecube" OR DUSK_TARGET_SYSTEM STREQUAL "wi
target_compile_definitions(liblua PRIVATE LUA_USE_C89)
add_library(lua::lua ALIAS liblua)
set(Lua_FOUND TRUE CACHE BOOL "Lua found" FORCE)
target_link_libraries(${DUSK_LIBRARY_TARGET_NAME} PRIVATE
cglm
liblua
stdc++
ogc
m
PkgConfig::zip
)
endif()

View File

@@ -41,7 +41,6 @@ elseif(DUSK_TARGET_SYSTEM STREQUAL "psp")
elseif(DUSK_TARGET_SYSTEM STREQUAL "gamecube" OR DUSK_TARGET_SYSTEM STREQUAL "wii")
target_compile_definitions(${DUSK_LIBRARY_TARGET_NAME}
PUBLIC
DISPLAY_SDL2=1
DISPLAY_WINDOW_WIDTH_DEFAULT=640
DISPLAY_WINDOW_HEIGHT_DEFAULT=480
DISPLAY_WIDTH=640

View File

@@ -133,12 +133,13 @@ errorret_t displayUpdate(void) {
#if DISPLAY_SDL2
SDL_GL_SwapWindow(DISPLAY.window);
GLenum err;
while((err = glGetError()) != GL_NO_ERROR) {
debugPrint("GL Error: %d\n", err);
}
#endif
GLenum err;
while((err = glGetError()) != GL_NO_ERROR) {
debugPrint("GL Error: %d\n", err);
}
// For now, we just return an OK error.
errorOk();

View File

@@ -8,25 +8,17 @@
#pragma once
#if DISPLAY_SDL2
#if DOLPHIN
#include "dusk.h"
#include <GL/glu.h>
#include <SDL.h>
#include <SDL_opengl.h>
#define GL_COLOR_INDEX8_EXT GX_RGBA8
#include <SDL2/SDL.h>
#else
#include <SDL2/SDL.h>
#define GL_GLEXT_PROTOTYPES
#include <GL/gl.h>
#include <GL/glext.h>
#endif
#define GL_GLEXT_PROTOTYPES
#include <GL/gl.h>
#include <GL/glext.h>
#ifndef DISPLAY_SIZE_DYNAMIC
#define DISPLAY_SIZE_DYNAMIC 1
#endif
#elif DOLPHIN
// Dolphin.
#else
#error "Need to specify display backend."
#endif

View File

@@ -102,16 +102,12 @@ void frameBufferBind(const framebuffer_t *framebuffer) {
if(framebuffer == &FRAMEBUFFER_BACKBUFFER) {
#if PSP
#elif DOLPHIN
#else
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
#endif
} else {
#if PSP
assertUnreachable("Framebuffers not supported on PSP");
#elif DOLPHIN
assertUnreachable("Framebuffers not supported on DOLPHIN");
#else
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer->id);
#endif
@@ -144,11 +140,7 @@ void frameBufferClear(uint8_t flags, color_t color) {
glFlags |= GL_DEPTH_BUFFER_BIT;
}
#if DOLPHIN
assertUnreachable("Framebuffers not supported on DOLPHIN");
#else
glClear(glFlags);
#endif
glClear(glFlags);
#endif
}

View File

@@ -16,6 +16,9 @@ typedef struct {
// OpenGL Framebuffer Object ID
GLuint id;
texture_t texture;
#elif DOLPHIN
// --- IGNORE ---
uint8_t id;
#else
#error "Framebuffers not implemented on this platform."
#endif

View File

@@ -12,6 +12,10 @@ typedef enum {
MESH_PRIMITIVE_TRIANGLES = GL_TRIANGLES,
MESH_PRIMITIVE_LINES = GL_LINES,
MESH_PRIMITIVE_POINTS = GL_POINTS,
#elif DOLPHIN
MESH_PRIMITIVE_TRIANGLES = GX_TRIANGLES,
MESH_PRIMITIVE_LINES = GX_LINES,
MESH_PRIMITIVE_POINTS = GX_POINTS,
#endif
} meshprimitivetype_t;
@@ -19,11 +23,9 @@ typedef enum {
#define MESH_VERTEX_POS_SIZE 3
typedef struct {
#if DISPLAY_SDL2
color4b_t color;
GLfloat uv[MESH_VERTEX_UV_SIZE];
GLfloat pos[MESH_VERTEX_POS_SIZE];
#endif
color4b_t color;
float uv[MESH_VERTEX_UV_SIZE];
float pos[MESH_VERTEX_POS_SIZE];
} meshvertex_t;
typedef struct {

View File

@@ -77,8 +77,6 @@ void textureInit(
#if PSP
havePalTex = true;
#elif DOLPHIN
havePalTex = false;
#else
GLint mask = 0;
glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &mask);
@@ -127,14 +125,10 @@ void textureInit(
GL_UNSIGNED_BYTE, (void*)data.palette.data
);
#if DOLPHIN
assertUnreachable("Paletted textures not supported on DOLPHIN");
#else
glColorTableEXT(
GL_TEXTURE_2D, GL_RGBA, pal->colorCount, GL_RGBA,
GL_UNSIGNED_BYTE, (const void*)pal->colors
);
#endif
glColorTableEXT(
GL_TEXTURE_2D, GL_RGBA, pal->colorCount, GL_RGBA,
GL_UNSIGNED_BYTE, (const void*)pal->colors
);
}
break;

View File

@@ -14,12 +14,18 @@ typedef enum {
TEXTURE_FORMAT_RGBA = GL_RGBA,
TEXTURE_FORMAT_ALPHA = GL_ALPHA,
TEXTURE_FORMAT_PALETTE = GL_COLOR_INDEX8_EXT,
#elif DOLPHIN
TEXTURE_FORMAT_RGBA = GX_TF_RGBA8,
TEXTURE_FORMAT_ALPHA = GX_TF_A8,
TEXTURE_FORMAT_PALETTE = GX_TF_CI8,
#endif
} textureformat_t;
typedef struct {
#if DISPLAY_SDL2
GLuint id;
#elif DOLPHIN
uint8_t id;
#endif
int32_t width;

View File

@@ -19,16 +19,17 @@ if(DUSK_TARGET_SYSTEM STREQUAL "linux")
INPUT_MOUSE=1
INPUT_GAMEPAD=1
)
elseif(DUSK_TARGET_SYSTEM STREQUAL "psp")
target_compile_definitions(${DUSK_LIBRARY_TARGET_NAME}
PUBLIC
INPUT_SDL2=1
INPUT_GAMEPAD=1
)
elseif(DUSK_TARGET_SYSTEM STREQUAL "gamecube" OR DUSK_TARGET_SYSTEM STREQUAL "wii")
target_compile_definitions(${DUSK_LIBRARY_TARGET_NAME}
PUBLIC
INPUT_SDL2=1
INPUT_GAMEPAD=1
)
endif()

View File

@@ -31,7 +31,6 @@ inputbuttondata_t INPUT_BUTTON_DATA[] = {
{ .name = "lstick_negative_x", { .type = INPUT_BUTTON_TYPE_GAMEPAD_AXIS, .gpAxis = { .axis = SDL_CONTROLLER_AXIS_LEFTX, .positive = false } } },
{ .name = "lstick_positive_y", { .type = INPUT_BUTTON_TYPE_GAMEPAD_AXIS, .gpAxis = { .axis = SDL_CONTROLLER_AXIS_LEFTY, .positive = true } } },
{ .name = "lstick_negative_y", { .type = INPUT_BUTTON_TYPE_GAMEPAD_AXIS, .gpAxis = { .axis = SDL_CONTROLLER_AXIS_LEFTY, .positive = false } } },
#else
#endif
#endif
@@ -172,6 +171,30 @@ inputbuttondata_t INPUT_BUTTON_DATA[] = {
{ .name = "kp_enter", { .type = INPUT_BUTTON_TYPE_KEYBOARD, .scancode = SDL_SCANCODE_KP_ENTER } },
{ .name = "kp_equals", { .type = INPUT_BUTTON_TYPE_KEYBOARD, .scancode = SDL_SCANCODE_KP_EQUALS } },
#endif
#elif DOLPHIN
#if INPUT_GAMEPAD == 1
{ .name = "a", { .type = INPUT_BUTTON_TYPE_GAMEPAD, .gpButton = PAD_BUTTON_A } },
{ .name = "b", { .type = INPUT_BUTTON_TYPE_GAMEPAD, .gpButton = PAD_BUTTON_B } },
{ .name = "x", { .type = INPUT_BUTTON_TYPE_GAMEPAD, .gpButton = PAD_BUTTON_X } },
{ .name = "y", { .type = INPUT_BUTTON_TYPE_GAMEPAD, .gpButton = PAD_BUTTON_Y } },
{ .name = "start", { .type = INPUT_BUTTON_TYPE_GAMEPAD, .gpButton = PAD_BUTTON_START } },
{ .name = "dpad_up", { .type = INPUT_BUTTON_TYPE_GAMEPAD, .gpButton = PAD_BUTTON_UP } },
{ .name = "dpad_down", { .type = INPUT_BUTTON_TYPE_GAMEPAD, .gpButton = PAD_BUTTON_DOWN } },
{ .name = "dpad_left", { .type = INPUT_BUTTON_TYPE_GAMEPAD, .gpButton = PAD_BUTTON_LEFT } },
{ .name = "dpad_right", { .type = INPUT_BUTTON_TYPE_GAMEPAD, .gpButton = PAD_BUTTON_RIGHT } },
{ .name = "l", { .type = INPUT_BUTTON_TYPE_GAMEPAD, .gpButton = PAD_TRIGGER_L } },
{ .name = "r", { .type = INPUT_BUTTON_TYPE_GAMEPAD, .gpButton = PAD_TRIGGER_R } },
{ .name = "z", { .type = INPUT_BUTTON_TYPE_GAMEPAD, .gpButton = PAD_TRIGGER_Z } },
{ .name = "lstick_positive_x", { .type = INPUT_BUTTON_TYPE_GAMEPAD_AXIS, .gpAxis = { .axis = INPUT_GAMEPAD_AXIS_LEFT_X, .positive = true } } },
{ .name = "lstick_negative_x", { .type = INPUT_BUTTON_TYPE_GAMEPAD_AXIS, .gpAxis = { .axis = INPUT_GAMEPAD_AXIS_LEFT_X, .positive = false } } },
{ .name = "lstick_positive_y", { .type = INPUT_BUTTON_TYPE_GAMEPAD_AXIS, .gpAxis = { .axis = INPUT_GAMEPAD_AXIS_LEFT_Y, .positive = true } } },
{ .name = "lstick_negative_y", { .type = INPUT_BUTTON_TYPE_GAMEPAD_AXIS, .gpAxis = { .axis = INPUT_GAMEPAD_AXIS_LEFT_Y, .positive = false } } },
{ .name = "cstick_positive_x", { .type = INPUT_BUTTON_TYPE_GAMEPAD_AXIS, .gpAxis = { .axis = INPUT_GAMEPAD_AXIS_C_X, .positive = true } } },
{ .name = "cstick_negative_x", { .type = INPUT_BUTTON_TYPE_GAMEPAD_AXIS, .gpAxis = { .axis = INPUT_GAMEPAD_AXIS_C_X, .positive = false } } },
{ .name = "cstick_positive_y", { .type = INPUT_BUTTON_TYPE_GAMEPAD_AXIS, .gpAxis = { .axis = INPUT_GAMEPAD_AXIS_C_Y, .positive = true } } },
{ .name = "cstick_negative_y", { .type = INPUT_BUTTON_TYPE_GAMEPAD_AXIS, .gpAxis = { .axis = INPUT_GAMEPAD_AXIS_C_Y, .positive = false } } },
#endif
#endif
{ .name = NULL }

View File

@@ -10,6 +10,8 @@
#if INPUT_SDL2 == 1
#include <SDL2/SDL.h>
#elif DOLPHIN
#else
#error "No input backend defined"
#endif
@@ -26,6 +28,16 @@
#if INPUT_SDL2 == 1
typedef SDL_GameControllerButton inputgamepadbutton_t;
typedef SDL_GameControllerAxis inputgamepadaxis_t;
#elif DOLPHIN == 1
typedef u16 inputgamepadbutton_t;
typedef enum {
INPUT_GAMEPAD_AXIS_LEFT_X,
INPUT_GAMEPAD_AXIS_LEFT_Y,
INPUT_GAMEPAD_AXIS_C_X,
INPUT_GAMEPAD_AXIS_C_Y,
INPUT_GAMEPAD_AXIS_TRIGGER_LEFT,
INPUT_GAMEPAD_AXIS_TRIGGER_RIGHT
} inputgamepadaxis_t;
#endif
#endif
@@ -35,6 +47,7 @@ typedef enum {
#if INPUT_KEYBOARD == 1
INPUT_BUTTON_TYPE_KEYBOARD,
#endif
#if INPUT_GAMEPAD == 1
INPUT_BUTTON_TYPE_GAMEPAD,
INPUT_BUTTON_TYPE_GAMEPAD_AXIS,

View File

@@ -1,27 +0,0 @@
# Copyright (c) 2025 Dominic Masters
#
# This software is released under the MIT License.
# https://opensource.org/licenses/MIT
# Libs
# Includes
target_include_directories(${DUSK_LIBRARY_TARGET_NAME}
PUBLIC
${CMAKE_CURRENT_LIST_DIR}
)
# Sources
# Main Binary Source
target_sources(${DUSK_BINARY_TARGET_NAME}
PRIVATE
main.c
sdl_starter.c
sdl_assets_loader.c
)
# Defs
# Subdirs

View File

@@ -1,159 +0,0 @@
#include <gccore.h>
#include "sdl_starter.h"
#include "sdl_assets_loader.h"
SDL_Window *window = NULL;
SDL_Renderer *renderer = NULL;
const int PLAYER_SPEED = 600;
SDL_Rect player = {SCREEN_WIDTH / 2 - 64, SCREEN_HEIGHT / 2 - 64, 64, 64};
SDL_Rect ball = {SCREEN_WIDTH / 2 + 50, SCREEN_HEIGHT / 2, 32, 32};
int ballVelocityX = 400;
int ballVelocityY = 400;
int colorIndex;
SDL_Color colors[] = {
{128, 128, 128, 0}, // gray
{255, 255, 255, 0}, // white
{255, 0, 0, 0}, // red
{0, 255, 0, 0}, // green
{0, 0, 255, 0}, // blue
{255, 255, 0, 0}, // brown
{0, 255, 255, 0}, // cyan
{255, 0, 255, 0}, // purple
};
void quitGame()
{
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
}
void handleEvents()
{
SDL_Event event;
while (SDL_PollEvent(&event))
{
if (event.type == SDL_QUIT)
{
quitGame();
exit(0);
}
}
}
int rand_range(int min, int max)
{
return min + rand() / (RAND_MAX / (max - min + 1) + 1);
}
void update(float deltaTime)
{
// PAD_ButtonsDown tells us which buttons were pressed in this loop
// this is a "one shot" state which will not fire again until the button has been released
const u32 padDown = PAD_ButtonsDown(0);
// PAD_ButtonsHeld tells us which buttons are keep pressing in this loop
const u32 padHeld = PAD_ButtonsHeld(0);
// We return to the launcher application via exit
if (padDown & PAD_BUTTON_START)
exit(0);
if (padHeld & PAD_BUTTON_LEFT && player.x > 0)
{
player.x -= PLAYER_SPEED * deltaTime;
}
else if (padHeld & PAD_BUTTON_RIGHT && player.x < SCREEN_WIDTH - player.w)
{
player.x += PLAYER_SPEED * deltaTime;
}
else if (padHeld & PAD_BUTTON_UP && player.y > 0)
{
player.y -= PLAYER_SPEED * deltaTime;
}
else if (padHeld & PAD_BUTTON_DOWN && player.y < SCREEN_HEIGHT - player.h)
{
player.y += PLAYER_SPEED * deltaTime;
}
if (ball.x < 0 || ball.x > SCREEN_WIDTH - ball.w)
{
ballVelocityX *= -1;
colorIndex = rand_range(0, 5);
}
else if (ball.y < 0 || ball.y > SCREEN_HEIGHT - ball.h)
{
ballVelocityY *= -1;
colorIndex = rand_range(0, 5);
}
else if (SDL_HasIntersection(&player, &ball))
{
ballVelocityX *= -1;
ballVelocityY *= -1;
colorIndex = rand_range(0, 5);
}
ball.x += ballVelocityX * deltaTime;
ball.y += ballVelocityY * deltaTime;
}
void render()
{
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
SDL_RenderClear(renderer);
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
SDL_RenderFillRect(renderer, &player);
SDL_SetRenderDrawColor(renderer, colors[colorIndex].r, colors[colorIndex].g, colors[colorIndex].b, 255);
SDL_RenderFillRect(renderer, &ball);
SDL_RenderPresent(renderer);
}
int main(int argc, char **argv)
{
window = SDL_CreateWindow("My Window", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (startSDL(window, renderer) > 0)
{
return 1;
}
Uint32 previousFrameTime = SDL_GetTicks();
Uint32 currentFrameTime = previousFrameTime;
float deltaTime = 0.0f;
PAD_Init();
while (true)
{
PAD_ScanPads();
currentFrameTime = SDL_GetTicks();
deltaTime = (currentFrameTime - previousFrameTime) / 1000.0f;
previousFrameTime = currentFrameTime;
handleEvents();
update(deltaTime);
render();
}
}

View File

@@ -1,10 +0,0 @@
/**
* Copyright (c) 2026 Dominic Masters
*
* This software is released under the MIT License.
* https://opensource.org/licenses/MIT
*/
void dusk_null_method(void) {
return;
}

View File

@@ -1,74 +0,0 @@
#include "sdl_assets_loader.h"
Sprite loadSprite(SDL_Renderer *renderer, const char *filePath, int positionX, int positionY)
{
SDL_Rect textureBounds = {positionX, positionY, 0, 0};
SDL_Texture *texture = IMG_LoadTexture(renderer, filePath);
if (texture != NULL)
{
SDL_QueryTexture(texture, NULL, NULL, &textureBounds.w, &textureBounds.h);
}
Sprite sprite = {texture, textureBounds};
return sprite;
}
Mix_Chunk *loadSound(const char *filePath)
{
Mix_Chunk *sound = NULL;
sound = Mix_LoadWAV(filePath);
if (sound == NULL)
{
printf("Failed to load scratch sound effect! SDL_mixer Error: %s\n", Mix_GetError());
}
return sound;
}
Mix_Music *loadMusic(const char *filePath)
{
Mix_Music *music = NULL;
music = Mix_LoadMUS(filePath);
if (music == NULL)
{
printf("Failed to load music! SDL_mixer Error: %s\n", Mix_GetError());
}
return music;
}
void updateTextureText(SDL_Texture **texture, const char *text, TTF_Font **fontSquare, SDL_Renderer *renderer)
{
SDL_Color fontColor = {255, 255, 255};
if (*fontSquare == NULL)
{
printf("TTF_OpenFont fontSquare: %s\n", TTF_GetError());
}
SDL_Surface *surface = TTF_RenderUTF8_Blended(*fontSquare, text, fontColor);
if (surface == NULL)
{
printf("TTF_OpenFont: %s\n", TTF_GetError());
SDL_LogError(SDL_LOG_CATEGORY_ERROR, "Unable to create text surface! SDL Error: %s\n", SDL_GetError());
exit(3);
}
SDL_DestroyTexture(*texture);
*texture = SDL_CreateTextureFromSurface(renderer, surface);
if (*texture == NULL)
{
printf("TTF_OpenFont: %s\n", TTF_GetError());
SDL_LogError(SDL_LOG_CATEGORY_ERROR, "Unable to create texture from surface! SDL Error: %s\n", SDL_GetError());
}
SDL_FreeSurface(surface);
}

View File

@@ -1,20 +0,0 @@
#pragma once
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <SDL2/SDL_mixer.h>
#include <SDL2/SDL_ttf.h>
typedef struct
{
SDL_Texture *texture;
SDL_Rect textureBounds;
} Sprite;
Sprite loadSprite(SDL_Renderer *renderer, const char *filePath, int positionX, int positionY);
Mix_Chunk *loadSound(const char *filePath);
Mix_Music *loadMusic(const char *filePath);
void updateTextureText(SDL_Texture **texture, const char *text, TTF_Font **fontSquare, SDL_Renderer *renderer);

View File

@@ -1,55 +0,0 @@
#include "sdl_starter.h"
#include <SDL2/SDL_image.h>
#include <SDL2/SDL_mixer.h>
#include <SDL2/SDL_ttf.h>
#include <stdio.h>
int startSDL(SDL_Window *window, SDL_Renderer *renderer) {
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK) < 0)
{
printf("SDL crashed. Error: %s\n", SDL_GetError());
return 1;
}
if (window == NULL)
{
fprintf(stderr, "Failed to create window: %s\n", SDL_GetError());
SDL_Quit();
return 1;
}
if (renderer == NULL)
{
fprintf(stderr, "Failed to create renderer: %s\n", SDL_GetError());
SDL_DestroyWindow(window);
SDL_Quit();
return 1;
}
if (!IMG_Init(IMG_INIT_PNG))
{
printf("SDL_image crashed. Error: %s\n", SDL_GetError());
return 1;
}
if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 2048) < 0)
{
printf("SDL_mixer could not initialize! SDL_mixer Error: %s\n", Mix_GetError());
return 1;
}
if (TTF_Init() == -1)
{
return 1;
}
return 0;
}

View File

@@ -1,15 +0,0 @@
/**
* Copyright (c) 2026 Dominic Masters
*
* This software is released under the MIT License.
* https://opensource.org/licenses/MIT
*/
#pragma once
#include <SDL2/SDL.h>
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
int startSDL(SDL_Window *window, SDL_Renderer *renderer);