Add SDL_TTF

This commit is contained in:
2024-09-20 09:52:13 +02:00
parent a43c395404
commit 2cfa1c262c
6 changed files with 134 additions and 58 deletions

View File

@@ -8,10 +8,11 @@ set(CMAKE_PREFIX_PATH "C:/SDL2")
find_package(SDL2 REQUIRED)
find_package(SDL2_image REQUIRED)
find_package(SDL2_ttf REQUIRED)
include_directories(${SDL2_INCLUDE_DIRS} ${SDL2_IMAGE_INCLUDE_DIRS})
include_directories(${SDL2_INCLUDE_DIRS} ${SDL2_IMAGE_INCLUDE_DIRS} ${SDL2_TTF_INCLUDE_DIRS})
add_executable(bloubloulespoissons main.cpp fish.cpp decors.cpp)
# Lier SDL2 et SDL2_image
target_link_libraries(bloubloulespoissons ${SDL2_LIBRARIES} -lSDL2_image)
target_link_libraries(bloubloulespoissons ${SDL2_LIBRARIES} -lSDL2_image -lSDL2_ttf)

View File

@@ -4,14 +4,14 @@
#include "decors.h"
void Rock::draw(SDL_Renderer* renderer, int offsetX, int offsetY) {
void Rock::draw(SDL_Renderer* renderer) {
SDL_SetRenderDrawColor(renderer, r, g, b, 255);
for (int w = 0; w < size * 2; w++) {
for (int h = 0; h < size * 2; h++) {
int dx = size - w;
int dy = size - h;
if ((dx * dx + dy * dy) <= (size * size)) {
SDL_RenderDrawPoint(renderer, x + dx - offsetX, y + dy - offsetY);
SDL_RenderDrawPoint(renderer, x + dx, y + dy);
}
}
}
@@ -29,14 +29,14 @@ Reef::Reef(int x, int y) : x(x), y(y) {
}
}
void Reef::draw(SDL_Renderer* renderer, int offsetX, int offsetY) {
void Reef::draw(SDL_Renderer* renderer) {
for (auto& rock : rocks) {
rock.draw(renderer, offsetX, offsetY);
rock.draw(renderer);
}
}
void Kelp::draw(SDL_Renderer* renderer, int offsetX, int offsetY) {
void Kelp::draw(SDL_Renderer* renderer) {
SDL_SetRenderDrawColor(renderer, r, g, b, 255);
SDL_Rect kelpRect = { x - offsetX, y - offsetY, size / 3, size };
SDL_Rect kelpRect = { x, y, size / 3, size };
SDL_RenderFillRect(renderer, &kelpRect);
}
}

View File

@@ -6,16 +6,16 @@
#define DECORS_H
#include <SDL_render.h>
#include <ctime>
#include <stdlib.h>
#include <cstdlib>
#include <vector>
class Rock {
public:
Rock(int x, int y, int size, Uint8 r, Uint8 g, Uint8 b) : x(x), y(y), size(size), r(r), g(g), b(b) {};
void draw(SDL_Renderer* renderer, int offsetX, int offsetY);
private:
void draw(SDL_Renderer* renderer);
int x;
int y;
private:
int size;
int r;
int g;
@@ -25,11 +25,11 @@ private:
class Reef {
public:
Reef(int x, int y);
void draw(SDL_Renderer* renderer, int offsetX, int offsetY);
private:
void draw(SDL_Renderer* renderer);
int x;
int y;
private:
int size;
std::vector<Rock> rocks;
};
@@ -37,11 +37,11 @@ private:
class Kelp {
public:
Kelp(int x, int y, int height, Uint8 r, Uint8 g, Uint8 b) : x(x), y(y), size(height), r(r), g(g), b(b) {};
void draw(SDL_Renderer* renderer, int offsetX, int offsetY);
private:
void draw(SDL_Renderer* renderer);
int x;
int y;
private:
int size;
int r;
int g;

3
fish.h
View File

@@ -27,7 +27,7 @@ private:
const float BIASVALUE = 0.001;
//const float MAXBIAS = 0.01;
float x, y;
float vx, vy;
std::vector<Fish> &school;
int id;
@@ -53,6 +53,7 @@ public:
void move();
void cycle();
float x, y;
};
#endif //FISH_H

BIN
fonts/arial.ttf Normal file

Binary file not shown.

152
main.cpp
View File

@@ -1,5 +1,6 @@
#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <SDL2/SDL_ttf.h>
#include <iostream>
#include <vector>
#include <thread>
@@ -17,6 +18,7 @@ SDL_Renderer* renderer = nullptr;
SDL_Texture* schoolTexture = nullptr;
SDL_Texture* playerTexture = nullptr;
std::vector<Fish> school;
TTF_Font* font = nullptr;
int windowWidth = 800;
int windowHeight = 600;
@@ -30,11 +32,46 @@ void handleEvents(int& playerX, int& playerY, int playerSpeed);
void renderScene(int playerX, int playerY);
void cleanup();
void drawGradientBackground(SDL_Renderer* renderer, int offsetX, int offsetY) {
void drawGradientBackground(SDL_Renderer* renderer) {
for (int y = 0; y < ENV_HEIGHT; y++) {
Uint8 blue = static_cast<Uint8>(255 * (1.0 - static_cast<float>(y) / ENV_HEIGHT));
SDL_SetRenderDrawColor(renderer, 0, 0, blue, 255);
SDL_RenderDrawLine(renderer, -offsetX, y - offsetY, ENV_WIDTH - offsetX, y - offsetY);
SDL_RenderDrawLine(renderer, 0, y, ENV_WIDTH, y);
}
}
void drawGridBackground(SDL_Renderer* renderer) {
// Dessiner le fond bleu
SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255);
SDL_RenderClear(renderer);
// Couleur des lignes de la grille
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
// Dessiner les lignes horizontales et les coordonnées y
for (int y = 0; y < ENV_HEIGHT; y += 50) {
SDL_RenderDrawLine(renderer, 0, y, ENV_WIDTH, y);
// Afficher les coordonnées y
std::string yText = std::to_string(y);
SDL_Surface* textSurface = TTF_RenderText_Solid(font, yText.c_str(), {255, 255, 255});
SDL_Texture* textTexture = SDL_CreateTextureFromSurface(renderer, textSurface);
SDL_Rect textRect = {0, y, textSurface->w, textSurface->h};
SDL_RenderCopy(renderer, textTexture, nullptr, &textRect);
SDL_FreeSurface(textSurface);
SDL_DestroyTexture(textTexture);
}
// Dessiner les lignes verticales et les coordonnées x
for (int x = 0; x < ENV_WIDTH; x += 50) {
SDL_RenderDrawLine(renderer, x, 0, x, ENV_HEIGHT);
// Afficher les coordonnées x
std::string xText = std::to_string(x);
SDL_Surface* textSurface = TTF_RenderText_Solid(font, xText.c_str(), {255, 255, 255});
SDL_Texture* textTexture = SDL_CreateTextureFromSurface(renderer, textSurface);
SDL_Rect textRect = {x, 0, textSurface->w, textSurface->h};
SDL_RenderCopy(renderer, textTexture, nullptr, &textRect);
SDL_FreeSurface(textSurface);
SDL_DestroyTexture(textTexture);
}
}
@@ -95,6 +132,20 @@ bool initSDL() {
return false;
}
if (TTF_Init() == -1) {
std::cerr << "Erreur d'initialisation de SDL_ttf: " << TTF_GetError() << std::endl;
SDL_Quit();
return false;
}
font = TTF_OpenFont("../fonts/arial.ttf", 16);
if (font == nullptr) {
std::cerr << "Erreur de chargement de la police: " << TTF_GetError() << std::endl;
TTF_Quit();
SDL_Quit();
return false;
}
window = SDL_CreateWindow("BloubBloub les poissons",
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
@@ -148,29 +199,22 @@ void handleEvents(int& playerX, int& playerY, const int playerSpeed) {
}
}
if (keystate[SDL_SCANCODE_W] && keystate[SDL_SCANCODE_A]) {
if (keystate[SDL_SCANCODE_W]) {
playerY -= playerSpeed;
playerX -= playerSpeed;
} else if (keystate[SDL_SCANCODE_W] && keystate[SDL_SCANCODE_D]) {
playerY -= playerSpeed;
playerX += playerSpeed;
} else if (keystate[SDL_SCANCODE_S] && keystate[SDL_SCANCODE_A]) {
}
if (keystate[SDL_SCANCODE_S]) {
playerY += playerSpeed;
}
if (keystate[SDL_SCANCODE_A]) {
playerX -= playerSpeed;
} else if (keystate[SDL_SCANCODE_S] && keystate[SDL_SCANCODE_D]) {
playerY += playerSpeed;
}
if (keystate[SDL_SCANCODE_D]) {
playerX += playerSpeed;
} else if (keystate[SDL_SCANCODE_W]) {
playerY -= playerSpeed;
} else if (keystate[SDL_SCANCODE_S]) {
playerY += playerSpeed;
} else if (keystate[SDL_SCANCODE_A]) {
playerX -= playerSpeed;
} else if (keystate[SDL_SCANCODE_D]) {
playerX += playerSpeed;
} else if (keystate[SDL_SCANCODE_ESCAPE]) {
}
if (keystate[SDL_SCANCODE_ESCAPE]) {
running = false;
} else if (keystate[SDL_SCANCODE_F11]) {
}
if (keystate[SDL_SCANCODE_F11]) {
Uint32 flags = SDL_GetWindowFlags(window);
if (flags & SDL_WINDOW_FULLSCREEN) {
SDL_SetWindowFullscreen(window, 0);
@@ -178,52 +222,82 @@ void handleEvents(int& playerX, int& playerY, const int playerSpeed) {
SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN);
}
}
if (keystate[SDL_SCANCODE_UP]) {
playerY -= playerSpeed;
for (auto& fish : school) {
fish.y -= playerSpeed;
}
rock.y -= playerSpeed;
reef.y -= playerSpeed;
kelp.y -= playerSpeed;
}
if (keystate[SDL_SCANCODE_DOWN]) {
playerY += playerSpeed;
for (auto& fish : school) {
fish.y += playerSpeed;
}
rock.y += playerSpeed;
reef.y += playerSpeed;
kelp.y += playerSpeed;
}
if (keystate[SDL_SCANCODE_LEFT]) {
playerX -= playerSpeed;
for (auto& fish : school) {
fish.x -= playerSpeed;
}
rock.x -= playerSpeed;
reef.x -= playerSpeed;
kelp.x -= playerSpeed;
}
if (keystate[SDL_SCANCODE_RIGHT]) {
playerX += playerSpeed;
for (auto& fish : school) {
fish.x += playerSpeed;
}
rock.x += playerSpeed;
reef.x += playerSpeed;
kelp.x += playerSpeed;
}
// Ensure player stays within environment bounds
if (playerX < 0) {
playerX = windowWidth;
} else if (playerX > windowWidth) {
playerX = 0;
} else if (playerX > ENV_WIDTH) {
playerX = ENV_WIDTH;
}
if (playerY < 0) {
playerY = windowHeight;
} else if (playerY > windowHeight) {
playerY = 0;
} else if (playerY > ENV_HEIGHT) {
playerY = ENV_HEIGHT;
}
}
void renderScene(int playerX, int playerY) {
int offsetX = playerX - windowWidth / 2;
int offsetY = playerY - windowHeight / 2;
if (offsetX < 0) offsetX = 0;
if (offsetY < 0) offsetY = 0;
if (offsetX > ENV_WIDTH - windowWidth) offsetX = ENV_WIDTH - windowWidth;
if (offsetY > ENV_HEIGHT - windowHeight) offsetY = ENV_HEIGHT - windowHeight;
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
SDL_RenderClear(renderer);
drawGradientBackground(renderer, offsetX, offsetY);
//drawGradientBackground(renderer);
drawGridBackground(renderer);
rock.draw(renderer, offsetX, offsetY);
reef.draw(renderer, offsetX, offsetY);
kelp.draw(renderer, offsetX, offsetY);
rock.draw(renderer);
reef.draw(renderer);
kelp.draw(renderer);
std::lock_guard<std::mutex> lock(mtx);
for (auto& fish : school) {
fish.draw(renderer);
}
SDL_Rect playerRect = { playerX - offsetX, playerY - offsetY, 75, 75 };
SDL_Rect playerRect = { playerX, playerY, 75, 75 };
SDL_RenderCopy(renderer, playerTexture, nullptr, &playerRect);
SDL_RenderPresent(renderer);
}
void cleanup() {
TTF_CloseFont(font);
TTF_Quit();
SDL_DestroyTexture(schoolTexture);
if (renderer != nullptr) {
SDL_DestroyRenderer(renderer);