Fix camera by adding a Camera class

This commit is contained in:
2024-11-05 09:11:17 +01:00
parent 1d602ca51d
commit 81242a87b5
8 changed files with 60 additions and 46 deletions

View File

@@ -12,7 +12,9 @@ find_package(SDL2_ttf REQUIRED)
include_directories(${SDL2_INCLUDE_DIRS} ${SDL2_IMAGE_INCLUDE_DIRS} ${SDL2_TTF_INCLUDE_DIRS})
add_executable(bloubloulespoissons main.cpp fish.cpp decors.cpp)
add_executable(bloubloulespoissons main.cpp fish.cpp decors.cpp
camera.cpp
camera.h)
# Lier SDL2 et SDL2_image
target_link_libraries(bloubloulespoissons ${SDL2_LIBRARIES} -lSDL2_image -lSDL2_ttf)

5
camera.cpp Normal file
View File

@@ -0,0 +1,5 @@
//
// Created by BreizhHardware on 05/11/2024.
//
#include "camera.h"

26
camera.h Normal file
View File

@@ -0,0 +1,26 @@
//
// Created by BreizhHardware on 05/11/2024.
//
#ifndef CAMERA_H
#define CAMERA_H
class Camera {
public:
static Camera& getInstance() {
static Camera instance;
return instance;
}
int getX() const { return x; }
int getY() const { return y; }
void setPosition(int newX, int newY) { x = newX; y = newY; }
void move(int dx, int dy) { x += dx; y += dy; }
private:
Camera(): x(0), y(0) {}
int x, y;
};
#endif //CAMERA_H

View File

@@ -3,18 +3,25 @@
//
#include "decors.h"
#include <iostream>
void Rock::draw(SDL_Renderer* renderer) {
Camera& camera = Camera::getInstance();
int cameraX = camera.getX();
int cameraY = camera.getY();
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, y + dy);
SDL_Rect rect = { x + dx - cameraX, y + dy - cameraY, 1, 1 };
SDL_RenderFillRect(renderer, &rect);
}
}
}
//std::cout << "Rock drawn at (" << x << ", " << y << ")" << std::endl;
}
Reef::Reef(int x, int y) : x(x), y(y) {
@@ -36,7 +43,10 @@ void Reef::draw(SDL_Renderer* renderer) {
}
void Kelp::draw(SDL_Renderer* renderer) {
Camera& camera = Camera::getInstance();
int cameraX = camera.getX();
int cameraY = camera.getY();
SDL_SetRenderDrawColor(renderer, r, g, b, 255);
SDL_Rect kelpRect = { x, y, size / 3, size };
SDL_Rect kelpRect = { x - cameraX, y - cameraY, size / 3, size };
SDL_RenderFillRect(renderer, &kelpRect);
}

View File

@@ -8,6 +8,7 @@
#include <ctime>
#include <cstdlib>
#include <vector>
#include "camera.h"
class Rock {
public:

View File

@@ -37,7 +37,11 @@ void Fish::drawArrow(SDL_Renderer *renderer, int x, int y, float vx, float vy) {
}
void Fish::draw(SDL_Renderer *renderer) {
SDL_Rect rect = {static_cast<int>(x), static_cast<int>(y), width, height};
Camera &camera = Camera::getInstance();
int cameraX = camera.getX();
int cameraY = camera.getY();
SDL_Rect rect = {static_cast<int>(x) - cameraX, static_cast<int>(y) - cameraY, width, height};
float angle = atan2(vy, vx) * 180 / M_PI; // Convert angle to degrees
if (texture) {

1
fish.h
View File

@@ -6,6 +6,7 @@
#include <iostream>
#include <string>
#include <vector>
#include "camera.h"
const int ENV_WIDTH = 1920;
const int ENV_HEIGHT = 1080;

View File

@@ -9,6 +9,7 @@
#include "fish.h"
#include "decors.h"
#include "camera.h"
std::mutex mtx;
std::atomic<bool> running(true);
@@ -210,17 +211,19 @@ void handleEvents(int& playerX, int& playerY, const int playerSpeed) {
}
}
Camera& camera = Camera::getInstance();
if (keystate[SDL_SCANCODE_W]) {
playerY -= playerSpeed;
camera.move(0, -playerSpeed);
}
if (keystate[SDL_SCANCODE_S]) {
playerY += playerSpeed;
camera.move(0, playerSpeed);
}
if (keystate[SDL_SCANCODE_A]) {
playerX -= playerSpeed;
camera.move(-playerSpeed, 0);
}
if (keystate[SDL_SCANCODE_D]) {
playerX += playerSpeed;
camera.move(playerSpeed, 0);
}
if (keystate[SDL_SCANCODE_ESCAPE]) {
running = false;
@@ -234,44 +237,6 @@ void handleEvents(int& playerX, int& playerY, const int playerSpeed) {
}
}
// Déplacement de la vue avec les flèches du clavier
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 = 0;