mirror of
https://github.com/BreizhHardware/bloubloulespoissons.git
synced 2026-03-18 21:50:32 +01:00
Fix camera by adding a Camera class
This commit is contained in:
@@ -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
5
camera.cpp
Normal file
@@ -0,0 +1,5 @@
|
||||
//
|
||||
// Created by BreizhHardware on 05/11/2024.
|
||||
//
|
||||
|
||||
#include "camera.h"
|
||||
26
camera.h
Normal file
26
camera.h
Normal 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
|
||||
14
decors.cpp
14
decors.cpp
@@ -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);
|
||||
}
|
||||
1
decors.h
1
decors.h
@@ -8,6 +8,7 @@
|
||||
#include <ctime>
|
||||
#include <cstdlib>
|
||||
#include <vector>
|
||||
#include "camera.h"
|
||||
|
||||
class Rock {
|
||||
public:
|
||||
|
||||
6
fish.cpp
6
fish.cpp
@@ -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
1
fish.h
@@ -6,6 +6,7 @@
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "camera.h"
|
||||
|
||||
const int ENV_WIDTH = 1920;
|
||||
const int ENV_HEIGHT = 1080;
|
||||
|
||||
49
main.cpp
49
main.cpp
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user