Nimbin2git.christianimmanuel.de / Games / Entropie / render.c

Entropie git · main

git clone https://git.christianimmanuel.de/games/Entropie.gitwget https://git.christianimmanuel.de/games/Entropie/archive/Entropie.tar.gz
render.c 10.6 KB · 252 lines raw
#include <SDL3/SDL.h>
#include <SDL3_ttf/SDL_ttf.h>

#include "color.h"
#include "object.h"
#include "render.h"
#include "character.h"
#include "map.h"

extern int MAP_WIDTH;
extern int MAP_HEIGHT;
extern const int TILE_SIZE;

extern int characters_size;
extern Character* characters;
extern Character* character;


void Render_rect(SDL_Renderer* renderer, float x, float y, float w, float h, unsigned char r, unsigned char g, unsigned char b, unsigned char a) {

    SDL_SetRenderDrawColor(renderer, r, g, b, a);
    SDL_FRect rect = {x, y, w, h};
    SDL_RenderFillRect(renderer, &rect);
}

// Function to render text to the window
void Render_text(SDL_Renderer* renderer, TTF_Font* font, const char* text, int x, int y, SDL_Color color) {
    SDL_Surface* surface = TTF_RenderText_Solid(font, text, sizeof(text), color);  // Create a surface with text
    SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);  // Convert surface to texture

    // Get the dimensions of the texture
    int textWidth = surface->w;
    int textHeight = surface->h;

    // Create a rectangle to display the text at the specified position
    SDL_FRect text_rect = {x, y, textWidth, textHeight};

    // Copy the texture to the renderer
    SDL_RenderTexture(renderer, texture, NULL, &text_rect);

    // Clean up
    SDL_DestroySurface(surface);
    SDL_DestroyTexture(texture);
}


// Function to print character details to the SDL window
void Render_characterInfo(SDL_Renderer *renderer, TTF_Font* font, const Character* character) {
    // Set text color (white)
    SDL_Color textColor = {255, 255, 255, 255};

    int text_height = 22;
    int margin_left = 16;
    int margin_top  = 16;

    // Render character name
    Render_text(renderer, font, character->name, margin_left, (text_height * 0) + margin_top, textColor);

    // Render character role
    Render_text(renderer, font, character->role, margin_left, (text_height * 1) + margin_top, textColor);

    // Render character preferences
    Render_text(renderer, font, character->preferences, margin_left, (text_height * 2) + margin_top, textColor);

    // Render character stats
    char stats[100];
    snprintf(stats, sizeof(stats), "Energy: %d, Friendliness: %d, Creativity: %d",
             character->energy, character->friendliness, character->creativity);
    Render_text(renderer, font, stats, margin_left, (text_height * 3) + margin_top, textColor);
}

void Render_character(SDL_Renderer* renderer, Camera camera, Character* character) {
    // Set the drawing color for the character (e.g., blue)

    Color c = character->color;
    SDL_SetRenderDrawColor(renderer, c.r, c.g, c.b, c.a);

    // Define the rectangle
    SDL_FRect rect = {
        character->object->x - camera.center_x + (camera.view_w / 2), // Adjust for camera position
        character->object->y - camera.center_y + (camera.view_h / 2), // Adjust for camera position
        character->object->w,
        character->object->h
    };

    // Render the filled rectangle
    SDL_RenderFillRect(renderer, &rect);
}

void Render_object(SDL_Renderer* renderer, Camera camera, Object* object) {
    printf("## %f %f %p\n", object->x, object->y, object);
    if (object->parent_type == Object_Character) {
        Character* character = (Character*)object->parent;
        Color co = character->color;
        SDL_SetRenderDrawColor(renderer, co.r, co.g, co.b, co.a);
    } else if (object->parent_type == Object_Tile) {
        Tile* tile = (Tile*)object->parent;
        switch (tile->type) {
            case TILE_TREE:
                SDL_SetRenderDrawColor(renderer, 34, 139, 34, 255); // Forest Green for trees
                break;
            case TILE_GRASS:
                SDL_SetRenderDrawColor(renderer, 50, 205, 50, 255); // Lime Green for grass
                break;
            case TILE_DIRT:
                SDL_SetRenderDrawColor(renderer, 139, 69, 19, 255); // Saddle Brown for dirt
                break;
            case TILE_WATER:
                SDL_SetRenderDrawColor(renderer, 70, 130, 180, 255); // Steel Blue for water
                break;
            case TILE_WAY:
                SDL_SetRenderDrawColor(renderer, 255, 223, 186, 255); // Peach for pathways
                break;
            case TILE_ROAD:
                SDL_SetRenderDrawColor(renderer, 128, 128, 128, 255); // Gray for roads
                break;
            case TILE_TRACK:
                SDL_SetRenderDrawColor(renderer, 139, 69, 19, 255); // Saddle Brown for tracks
                break;
            case TILE_GRAVEL:
                SDL_SetRenderDrawColor(renderer, 169, 169, 169, 255); // Light Gray for gravel
                break;
            case TILE_WALL:
                SDL_SetRenderDrawColor(renderer, 105, 105, 105, 255); // Dim Gray for walls
                break;
            case TILE_EMPTY:
                SDL_SetRenderDrawColor(renderer, 240, 248, 255, 255); // Alice Blue for empty tiles
                break;
            case TILE_PLAYER_SPAWN:
                SDL_SetRenderDrawColor(renderer, 255, 223, 0, 255); // Golden Yellow for player spawn
                break;
            case TILE_CHARACTER_SPAWN:
                SDL_SetRenderDrawColor(renderer, 255, 105, 180, 255); // Hot Pink for character spawn
                break;
            case TILE_HOUSE:
                SDL_SetRenderDrawColor(renderer, 178, 34, 34, 255); // Firebrick for houses
                break;
            case TILE_COLLECTABLE:
                SDL_SetRenderDrawColor(renderer, 255, 215, 0, 255); // Gold for collectibles
                break;
            default:
                SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); // Black for unknown types
                break;
        }
    } else {
        return;
    }

    SDL_FRect tileRect = { object->x - camera.offset_x, object->y - camera.offset_y, object->w, object->h };
    SDL_RenderFillRect(renderer, &tileRect);
}

void Render_map(SDL_Renderer* renderer, Camera camera, Object* object) {
    Object* next = camera.render_object;
        printf("*_* %p %f %f\n", next, next->x, next->y);
    while (next->next && Object_is_visible(next, &camera)) {
        Render_object(renderer, camera, next);
        next = next->next;
    }
}
void Render_map_OLD(SDL_Renderer* renderer, Camera camera, Object* object) {
    // printf("MIN %d\n", camera.min_y);
    // Render only the tiles within the visible window area
    for (int y = camera.min_y; y <= camera.max_y; y++) {
        for (int x = camera.min_x; x <= camera.max_x; x++) {
            // Calculate the position of each tile relative to the camera
            float tile_x = (x * TILE_SIZE) - camera.offset_x;
            float tile_y = (y * TILE_SIZE) - camera.offset_y;
            switch (map[y][x]) {
                case TILE_TREE:
                    SDL_SetRenderDrawColor(renderer, 34, 139, 34, 255); // Forest Green for trees
                    break;
                case TILE_GRASS:
                    SDL_SetRenderDrawColor(renderer, 50, 205, 50, 255); // Lime Green for grass
                    break;
                case TILE_DIRT:
                    SDL_SetRenderDrawColor(renderer, 139, 69, 19, 255); // Saddle Brown for dirt
                    break;
                case TILE_WATER:
                    SDL_SetRenderDrawColor(renderer, 70, 130, 180, 255); // Steel Blue for water
                    break;
                case TILE_WAY:
                    SDL_SetRenderDrawColor(renderer, 255, 223, 186, 255); // Peach for pathways
                    break;
                case TILE_ROAD:
                    SDL_SetRenderDrawColor(renderer, 128, 128, 128, 255); // Gray for roads
                    break;
                case TILE_TRACK:
                    SDL_SetRenderDrawColor(renderer, 139, 69, 19, 255); // Saddle Brown for tracks
                    break;
                case TILE_GRAVEL:
                    SDL_SetRenderDrawColor(renderer, 169, 169, 169, 255); // Light Gray for gravel
                    break;
                case TILE_WALL:
                    SDL_SetRenderDrawColor(renderer, 105, 105, 105, 255); // Dim Gray for walls
                    break;
                case TILE_EMPTY:
                    SDL_SetRenderDrawColor(renderer, 240, 248, 255, 255); // Alice Blue for empty tiles
                    break;
                case TILE_PLAYER_SPAWN:
                    SDL_SetRenderDrawColor(renderer, 255, 223, 0, 255); // Golden Yellow for player spawn
                    break;
                case TILE_CHARACTER_SPAWN:
                    SDL_SetRenderDrawColor(renderer, 255, 105, 180, 255); // Hot Pink for character spawn
                    break;
                case TILE_HOUSE:
                    SDL_SetRenderDrawColor(renderer, 178, 34, 34, 255); // Firebrick for houses
                    break;
                case TILE_COLLECTABLE:
                    SDL_SetRenderDrawColor(renderer, 255, 215, 0, 255); // Gold for collectibles
                    break;
                default:
                    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); // Black for unknown types
                    break;
            }

            // Render the tile at the adjusted position
            SDL_FRect tileRect = { tile_x, tile_y, TILE_SIZE, TILE_SIZE };
            SDL_RenderFillRect(renderer, &tileRect);

            // Render Objects
            for (int i = 0; i < map_objects_count[y][x]; i++) {
                float w = 10, h = 10;
                float pos_x = tile_x, pos_y = tile_y;
                int char_id = map_objects[y][x][i] - CHARACTER_0;
                if (char_id >= 0 && char_id < CHARACTER_MAX-CHARACTER_0) {
                    w = characters[char_id].object->w;
                    h = characters[char_id].object->h;
                    pos_x = characters[char_id].object->x - camera.center_x + (camera.view_w / 2);
                    pos_y = characters[char_id].object->y - camera.center_y + (camera.view_h / 2);
                    if (char_id == 0) {
                        printf("REND_CAR %d %f %f\n", char_id, pos_x, tile_x);
                        printf("MIN %d %d %d %d\n", camera.min_y, camera.min_x, camera.max_y, camera.max_x);
                    }
                    Color co = characters[char_id].color;
                    SDL_SetRenderDrawColor(renderer, co.r, co.g, co.b, co.a);
                } else {
                    SDL_SetRenderDrawColor(renderer, 123,32,142,212);
                }
                switch (map_objects[y][x][i]) {
                    case CHARACTER_0:
                        break;
                    default:
                        break;
                }
                SDL_FRect objectRect = { pos_x, pos_y, w, h};
                SDL_RenderFillRect(renderer, &objectRect );
            }

        }
    }
}