More progress on audio and rendering

This commit is contained in:
2025-06-02 18:04:15 +02:00
parent 84805b92cb
commit 0c3e2aa730
14 changed files with 569 additions and 264 deletions

84
main.c
View File

@@ -14,7 +14,8 @@ typedef struct GameState {
Player player;
Tile tileMap[MAP_HEIGHT][MAP_WIDTH];
BackgroundTile backgroundTileMap[MAP_HEIGHT][MAP_WIDTH];
SynthVoice voices[NUM_SYNTH_VOICES];
AudioData audioData;
TileArray neededUpdates;
} GameState;
GameState gameState;
@@ -34,7 +35,10 @@ int loadGameState(char *filename, Player *plr) {
memcpy(plr, &gameState.player, sizeof(gameState.player));
memcpy(tileMap, gameState.tileMap, sizeof(tileMap));
memcpy(backgroundMap, gameState.backgroundTileMap, sizeof(backgroundMap));
memcpy(audioData.synthVoices, gameState.voices, sizeof(gameState.voices));
SDL_Rect *tmp = audioData.playerRect;
memcpy(&audioData, &gameState.audioData, sizeof(gameState.audioData));
audioData.playerRect = tmp;
memcpy(&neededUpdates, &gameState.neededUpdates, sizeof(gameState.neededUpdates));
plr->cursor.targetTile = NULL;
plr->cursor.prevTargetTile = NULL;
return 0;
@@ -46,7 +50,8 @@ void saveGameState(char *filename, Player *plr) {
memcpy(&gameState.player, plr, sizeof(gameState.player));
memcpy(gameState.tileMap, tileMap, sizeof(gameState.tileMap));
memcpy(gameState.backgroundTileMap, backgroundMap, sizeof(gameState.backgroundTileMap));
memcpy(gameState.voices, audioData.synthVoices, sizeof(gameState.voices));
memcpy(&gameState.audioData, &audioData, sizeof(gameState.audioData));
memcpy(&gameState.neededUpdates, &neededUpdates, sizeof(neededUpdates));
FILE *gameSave = fopen(filename, "wb");
if (!gameSave) {
@@ -98,9 +103,11 @@ int init() {
srand(time(NULL));
memset(tileMap, 0, sizeof(tileMap));
memset(&neededUpdates, 0, sizeof(neededUpdates));
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, NULL);
SDL_SetHint(SDL_HINT_VIDEO_HIGHDPI_DISABLED, "1");
SDL_SetHint(SDL_HINT_RENDER_BATCHING, "1");
SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl");
SDL_SetHint(SDL_HINT_MOUSE_RELATIVE_CURSOR_VISIBLE, "1");
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) {
@@ -161,13 +168,16 @@ int init() {
spec.callback = audio_callback;
spec.userdata = &audioData;
// SDL_AudioDeviceID dev = SDL_OpenAudioDevice(NULL, 0, &spec, NULL, 0);
// if (dev == 0) {
// printf("Failed to open audio: %s\n", SDL_GetError());
// SDL_Quit();
// }
//
// SDL_PauseAudioDevice(dev, 1);
SDL_AudioDeviceID dev = SDL_OpenAudioDevice(NULL, 0, &spec, NULL, 0);
if (dev == 0) {
printf("Failed to open audio: %s\n", SDL_GetError());
SDL_Quit();
}
load_midi_file("assets/audio/testaid.mid");
SDL_PauseAudioDevice(dev, 0);
SDL_SetRenderDrawColor(mainRenderer, 0, 0, 0, 255);
SDL_RenderClear(mainRenderer);
@@ -203,19 +213,23 @@ int render() {
SDL_Rect rect2;
rect2.x = 0;
rect2.y = 0;
rect2.w = 0;
rect2.h = 0;
rect2.w = ATLAS_SIZE;
rect2.h = ATLAS_SIZE;
renderAllTiles(mainRenderer, player.rect);
renderPlayer(&player);
// SDL_RenderCopy(mainRenderer, backgroundTexture, &screenRect, &screenRect);
// SDL_RenderCopy(mainRenderer, tilesTexture, &screenRect, &screenRect);
// SDL_RenderCopy(mainRenderer, itemsTexture, &screenRect, &screenRect);
// SDL_RenderCopy(mainRenderer, entityTexture, &screenRect, &screenRect);
// SDL_RenderCopy(mainRenderer, hudTexture, &screenRect, &screenRect);
SDL_QueryTexture(atlasTexture, NULL, NULL, &rect2.w, &rect2.h);
SDL_RenderCopy(mainRenderer, atlasTexture, &rect2, &rect2);
if (!renderAtlas) {
SDL_RenderCopy(mainRenderer, backgroundTexture, &screenRect, &screenRect);
SDL_RenderCopy(mainRenderer, tilesTexture, &screenRect, &screenRect);
SDL_RenderCopy(mainRenderer, itemsTexture, &screenRect, &screenRect);
SDL_RenderCopy(mainRenderer, entityTexture, &screenRect, &screenRect);
SDL_RenderCopy(mainRenderer, hudTexture, &screenRect, &screenRect);
} else {
SDL_RenderCopy(mainRenderer, atlasTexture, &rect2, &rect2);
}
SDL_RenderPresent(mainRenderer);
@@ -246,11 +260,12 @@ int processEvent(SDL_Event e) {
speed = speed == 0 ? 0.004f : 0;
break;
case SDLK_r:
if (player.cursor.canReach && player.cursor.targetTile->type != TYPE_AIR) {
if (player.inventory.activeSlotIndex == 0 && player.cursor.canReach &&
player.cursor.targetTile->type != TYPE_AIR) {
player.cursor.direction = player.cursor.targetTile->direction;
}
player.cursor.direction = (player.cursor.direction + 2) % ORIENT_DIRECTION_COUNT;
if (player.cursor.canReach) {
if (player.inventory.activeSlotIndex == 0 && player.cursor.canReach) {
player.cursor.targetTile->direction = player.cursor.direction;
}
break;
@@ -260,6 +275,9 @@ int processEvent(SDL_Event e) {
case SDLK_F3:
debugMode = !debugMode;
break;
case SDLK_F10:
renderAtlas = !renderAtlas;
break;
case SDLK_F4:
Tile *tile = &tileMap[playerTileY][playerTileX];
break;
@@ -306,6 +324,12 @@ void processMousePosition() {
if (player.inventory.slotCounts[player.inventory.activeSlotIndex] > 0) {
player.inventory.slotCounts[player.inventory.activeSlotIndex]--;
player.cursor.targetTile->type = player.inventory.activeSlotIndex;
player.cursor.targetTile->rect.x = player.cursor.tileX;
player.cursor.targetTile->rect.y = player.cursor.tileY;
if (TileRegistry[player.inventory.activeSlotIndex].needsTicks) {
player.cursor.targetTile->neededUpdateIndex = add_tile(&neededUpdates,
player.cursor.targetTile->rect);
}
player.cursor.targetTile->direction = player.cursor.direction;
}
} else if (player.cursor.targetTile->type == player.inventory.activeSlotIndex) {
@@ -329,6 +353,12 @@ void processMousePosition() {
player.cursor.targetTile->items[lane].type = 0;
}
}
int neededIndex = player.cursor.targetTile->neededUpdateIndex;
if (TileRegistry[player.cursor.targetTile->type].needsTicks &&
neededUpdates.tiles[neededIndex].x == player.cursor.targetTile->rect.x &&
neededUpdates.tiles[neededIndex].y == player.cursor.targetTile->rect.y) {
remove_tile(&neededUpdates, neededIndex);
}
player.cursor.targetTile->type = TYPE_AIR;
player.cursor.breakingProgress = 0;
} else {
@@ -461,8 +491,10 @@ void processKeyboardHeld() {
}
if (keyboardState[SDL_SCANCODE_Q]) {
if (player.cursor.targetTile->type > 0) {
if (player.cursor.targetTile->type > 0 && player.inventory.activeSlotIndex == 0) {
setActivePlayerSlot(&player, player.cursor.targetTile->type);
} else {
setActivePlayerSlot(&player, 0);
}
}
if (keyboardState[SDL_SCANCODE_Y]) {
@@ -519,6 +551,14 @@ int main(__attribute__((unused)) int argc, __attribute__((unused)) char *args[])
genInitMap();
}
// audioData.synthVoices[0].frequency = 1000;
// audioData.synthVoices[0].phase = 0;
// audioData.synthVoices[0].sourceRect.w = TILE_SIZE;
// audioData.synthVoices[0].sourceRect.h = TILE_SIZE;
// audioData.synthVoices[0].sourceRect.x = 100 * TILE_SIZE;
// audioData.synthVoices[0].sourceRect.y = 100 * TILE_SIZE;
// audioData.synthVoices[0].volume = 255;
// audioData.synthVoices[0].waveform = WAVE_SINE;
//Hack to get window to stay up
SDL_Event e;