mirror of
https://github.com/BreizhHardware/bloubloulespoissons.git
synced 2026-01-19 09:07:33 +01:00
Compare commits
15 Commits
fix
...
Random-spa
| Author | SHA1 | Date | |
|---|---|---|---|
| 83c52a9a5f | |||
| ad85095721 | |||
|
|
f38d39bed6 | ||
| 64a83518d0 | |||
|
|
34aa5490cb | ||
|
|
100a6b91d1 | ||
|
|
4745f6fb19 | ||
|
|
ccefcb8c87 | ||
| 17e65843b0 | |||
|
|
4d4447d250 | ||
| 479ae3c4da | |||
| bf48cdf306 | |||
| e2cc90d8a5 | |||
|
|
d5520ded03 | ||
| 6fd472fb24 |
12
.github/workflows/build.yml
vendored
12
.github/workflows/build.yml
vendored
@@ -10,19 +10,23 @@ jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
container:
|
||||
image: fedora:latest
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up C++ environment
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y gcc g++ build-essential
|
||||
dnf install -y gcc gcc-c++ cmake make
|
||||
|
||||
- name: Install SDL2 dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y libsdl2-dev libsdl2-image-dev libsdl2-ttf-dev libsdl2-net-dev libsdl2-mixer-dev
|
||||
dnf install -y SDL2 SDL2-devel SDL2_image SDL2_image-devel SDL2_ttf SDL2_ttf-devel SDL2_net SDL2_net-devel SDL2_mixer SDL2_mixer-devel
|
||||
|
||||
- name: Clean build directory
|
||||
run: rm -rf build
|
||||
|
||||
- name: Create build directory
|
||||
run: mkdir build
|
||||
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -54,6 +54,8 @@ cmake-build-fedora
|
||||
cmake-build-fedora/
|
||||
cmake-build-debug-wsl
|
||||
cmake-build-debug-wsl/
|
||||
cmake-build-release-mingw
|
||||
cmake-build-release-mingw/
|
||||
|
||||
# .vscode folder
|
||||
.vscode/
|
||||
|
||||
@@ -14,6 +14,7 @@ find_package(SDL2 REQUIRED)
|
||||
find_package(SDL2_image REQUIRED)
|
||||
find_package(SDL2_ttf REQUIRED)
|
||||
find_package(SDL2_net REQUIRED)
|
||||
find_package(SDL2_mixer REQUIRED)
|
||||
|
||||
include_directories(${SDL2_INCLUDE_DIRS} ${SDL2_IMAGE_INCLUDE_DIRS} ${SDL2_TTF_INCLUDE_DIRS} ${SDL2_NET_INCLUDE_DIRS})
|
||||
|
||||
@@ -36,7 +37,8 @@ add_executable(bloubloulespoissons main.cpp fish.cpp decors.cpp
|
||||
shark.h
|
||||
)
|
||||
|
||||
target_link_libraries(bloubloulespoissons ${SDL2_LIBRARIES} -lSDL2_image -lSDL2_ttf -lSDL2_net -lSDL2_mixer)
|
||||
# Lier SDL2 et SDL2_image
|
||||
target_link_libraries(bloubloulespoissons ${SDL2_LIBRARIES} SDL2::SDL2 SDL2_image::SDL2_image SDL2_ttf::SDL2_ttf SDL2_net::SDL2_net SDL2_mixer::SDL2_mixer)
|
||||
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0")
|
||||
@@ -48,4 +50,9 @@ if (WIN32)
|
||||
set_target_properties(bloubloulespoissons PROPERTIES LINK_FLAGS "/SUBSYSTEM:CONSOLE")
|
||||
endif()
|
||||
target_link_libraries(bloubloulespoissons ws2_32)
|
||||
endif()
|
||||
|
||||
# Options pour la liaison statique en mode release
|
||||
if (CMAKE_BUILD_TYPE STREQUAL "Release")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
|
||||
endif()
|
||||
BIN
img/shark.png
BIN
img/shark.png
Binary file not shown.
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 43 KiB |
78
main.cpp
78
main.cpp
@@ -40,6 +40,7 @@ std::vector<Player> players_server;
|
||||
struct ThreadInfo {
|
||||
std::thread::id id;
|
||||
std::string functionName;
|
||||
bool isRunning;
|
||||
};
|
||||
|
||||
std::vector<ThreadInfo> threadInfos;
|
||||
@@ -62,6 +63,7 @@ void HandleMenuClick(Menu& menu);
|
||||
void updateFishRange(std::vector<Fish>& school, int start, int end);
|
||||
int pas_la_fontion_main_enfin_ce_nest_pas_la_fontion_principale_du_programme_mais_une_des_fonctions_principale_meme_primordiale_du_projet_denomme_bloubloulespoissons(int argc, char* args[]);
|
||||
int pas_la_fontion_main_enfin_ce_nest_pas_la_fontion_principale_du_programme_mais_une_des_fonctions_principale_meme_primordiale_du_projet_denomme_bloubloulespoissons_mais_celle_ci_elle_lance_en_multijoueur(int argc, std::string args);
|
||||
void checkThreads();
|
||||
|
||||
template <typename Function, typename... Args>
|
||||
std::thread createThread(std::string key, Function&& func, Args&&... args) {
|
||||
@@ -71,12 +73,28 @@ std::thread createThread(std::string key, Function&& func, Args&&... args) {
|
||||
ThreadInfo info;
|
||||
info.id = std::this_thread::get_id();
|
||||
info.functionName = key;
|
||||
info.isRunning = true;
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mtx);
|
||||
threadInfos.push_back(info);
|
||||
}
|
||||
func(std::forward<Args>(args)...);
|
||||
std::cout << "ThreadID = " << info.id << " ThreadFunction = " << info.functionName << std::endl;
|
||||
try {
|
||||
func(std::forward<Args>(args)...);
|
||||
} catch (const std::exception& e) {
|
||||
std::cerr << "Exception in thread " << key << ": " << e.what() << std::endl;
|
||||
} catch (...) {
|
||||
std::cerr << "Unknown exception in thread " << key << std::endl;
|
||||
}
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mtx);
|
||||
for (auto& threadInfo : threadInfos) {
|
||||
if (threadInfo.id == std::this_thread::get_id()) {
|
||||
threadInfo.isRunning = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
std::cout << "ThreadID = " << info.id << " ThreadFunction = " << info.functionName << " finished" << std::endl;
|
||||
});
|
||||
return thread;
|
||||
} catch (const std::system_error& e) {
|
||||
@@ -85,6 +103,17 @@ std::thread createThread(std::string key, Function&& func, Args&&... args) {
|
||||
}
|
||||
}
|
||||
|
||||
void checkThreads() {
|
||||
std::lock_guard<std::mutex> lock(mtx);
|
||||
for (const auto& threadInfo : threadInfos) {
|
||||
if (threadInfo.isRunning) {
|
||||
std::cout << "Thread " << threadInfo.functionName << " (ID: " << threadInfo.id << ") is still running." << std::endl;
|
||||
} else {
|
||||
std::cout << "Thread " << threadInfo.functionName << " (ID: " << threadInfo.id << ") has stopped." << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void displayFPS(SDL_Renderer* renderer, TTF_Font* font, int fps) {
|
||||
std::string fpsText = "FPS: " + std::to_string(fps);
|
||||
SDL_Color color = {0, 255, 0}; // Green
|
||||
@@ -246,8 +275,14 @@ void handleQuitThread() {
|
||||
};
|
||||
|
||||
void HandleMenuClick(Menu& menu){
|
||||
while (running) {
|
||||
menu.handleClickedButton();
|
||||
try {
|
||||
while (menuRunning) {
|
||||
menu.handleClickedButton();
|
||||
}
|
||||
} catch (const std::exception& e) {
|
||||
std::cerr << "Exception in HandleMenuClick: " << e.what() << std::endl;
|
||||
} catch (...) {
|
||||
std::cerr << "Unknown exception in HandleMenuClick" << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -287,6 +322,7 @@ int main(int argc, char* args[]) {
|
||||
menu.changePage("Main");
|
||||
|
||||
std::thread menu_thread = createThread("Menu thread", HandleMenuClick, std::ref(menu));
|
||||
std::thread quit_thread = createThread("Quit thread", handleQuitThread);
|
||||
|
||||
menu.addText("Main", (windowWidth/2) - 300, 50, 600, 100, "BloubBloub les poissons", 1024);
|
||||
|
||||
@@ -362,7 +398,6 @@ int main(int argc, char* args[]) {
|
||||
|
||||
|
||||
//menu.addButton((windowWidth/2) - 100, (windowHeight/2 + 25) + 50, 200, 50, "Multi", 1024);
|
||||
std::thread quit_thread = createThread("Quit thread", handleQuitThread);
|
||||
|
||||
while (running) {
|
||||
|
||||
@@ -373,22 +408,33 @@ int main(int argc, char* args[]) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
std::cout << "Check Threads 1" << std::endl;
|
||||
checkThreads();
|
||||
try {
|
||||
if (menu_thread.joinable())
|
||||
menuRunning = false;
|
||||
if (menu_thread.joinable()) {
|
||||
menuRunning = false;
|
||||
menu_thread.join();
|
||||
}
|
||||
} catch (const std::system_error& e) {
|
||||
std::cerr << "Exception caught: " << e.what() << std::endl;
|
||||
}
|
||||
checkThreads();
|
||||
try{
|
||||
if(quit_thread.joinable())
|
||||
quit_thread.join();
|
||||
}catch(const std::system_error& e){
|
||||
std::cerr << "Exception caught 2: " << e.what() << std::endl;
|
||||
}
|
||||
|
||||
if (!isPlayingOnline) {
|
||||
cleanup();
|
||||
}
|
||||
|
||||
std::cout << "Check Threads 2" << std::endl;
|
||||
checkThreads();
|
||||
|
||||
//pas_la_fontion_main_enfin_ce_nest_pas_la_fontion_principale_du_programme_mais_une_des_fonctions_principale_meme_primordiale_du_projet_denomme_bloubloulespoissons(argc, args);
|
||||
return 0;
|
||||
}
|
||||
@@ -577,13 +623,6 @@ int pas_la_fontion_main_enfin_ce_nest_pas_la_fontion_principale_du_programme_mai
|
||||
std::cerr << "Failed to initialize client!" << std::endl;
|
||||
return -1;
|
||||
}
|
||||
/*
|
||||
std::random_device rd;
|
||||
std::mt19937 gen(rd());
|
||||
std::uniform_int_distribution<> disX(0, ENV_WIDTH);
|
||||
std::uniform_int_distribution<> disY(0, ENV_HEIGHT);
|
||||
players.emplace_back(Player(disX(gen), disY(gen), 5, renderer, 1));
|
||||
*/
|
||||
players.emplace_back(Player(windowWidth / 2, windowHeight / 2, 5, renderer, 1));
|
||||
std::ranges::sort(school, Fish::SortByX);
|
||||
std::vector<std::thread> fish_threads;
|
||||
@@ -708,17 +747,6 @@ void renderScene(std::vector<Player>& players, const std::vector<Kelp>& kelps, c
|
||||
shark.draw(renderer);
|
||||
|
||||
displayFPS(renderer, font, fps);
|
||||
for (auto& player : players) {
|
||||
auto [playerX, playerY] = player.getPlayerPos();
|
||||
displayPlayerCoord(renderer, font, playerX, playerY);
|
||||
}
|
||||
|
||||
for (auto& player_server : players_server) {
|
||||
int unifiedX = player_server.getUnifiedX();
|
||||
int unifiedY = player_server.getUnifiedY();
|
||||
displayUnifiedPlayerCoord(renderer, font, unifiedX, unifiedY);
|
||||
displayNearbyPlayers(renderer, font, player_server, players_server, 500.0);
|
||||
}
|
||||
|
||||
SDL_RenderPresent(renderer);
|
||||
}
|
||||
|
||||
@@ -146,7 +146,7 @@ void Player::handlePlayerMovement(int ENV_WIDTH, int ENV_HEIGHT, int windowWidth
|
||||
unifiedY = camera.getY() + this->y;
|
||||
} else {
|
||||
Uint32 currentTime = SDL_GetTicks();
|
||||
if (currentTime - lastMoveTime >= 5000) {
|
||||
if (currentTime - lastMoveTime >= 1000) {
|
||||
if (this->energy > 50.0f) {
|
||||
this->energy += 0.4f; // Récupération plus rapide si l'énergie est élevée
|
||||
} else {
|
||||
|
||||
5
player.h
5
player.h
@@ -41,10 +41,13 @@ class Player {
|
||||
bool onlineMovement();
|
||||
int unifiedX = 0;
|
||||
int unifiedY = 0;
|
||||
int HITBOX = 50;
|
||||
public:
|
||||
Player(int x, int y, int playerSpeed, SDL_Renderer* renderer, int playerId) : x(x), y(y), playerBaseX(x), playerBaseY(y), playerSpeed(playerSpeed), playerId(playerId) {
|
||||
playerPosForRender.x = x;
|
||||
playerPosForRender.y = y;
|
||||
unifiedX = x + windowWidth / 2;
|
||||
unifiedY = y + windowHeight / 2;
|
||||
|
||||
SDL_Surface* playerSurface = IMG_Load(playerIMG);
|
||||
if (playerSurface == nullptr) {
|
||||
@@ -75,6 +78,8 @@ class Player {
|
||||
return playerTexture;
|
||||
}
|
||||
|
||||
int getHITBOX() const {return HITBOX;}
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -55,6 +55,12 @@ void Shark::checkNeighborhood(Player& player, float &xpos_avg, float &ypos_avg,
|
||||
}
|
||||
}
|
||||
|
||||
void Shark::checkCollision(Player& player) {
|
||||
if (player.getUnifiedX() + player.getHITBOX() >= x - HITBOX && player.getUnifiedX() - player.getHITBOX() <= x + HITBOX && player.getUnifiedY() + player.getHITBOX() >= y - HITBOX && player.getUnifiedY() - player.getHITBOX() <= y + HITBOX) {
|
||||
game_running = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Shark::cycle() {
|
||||
int neighboring_player = 0;
|
||||
@@ -62,6 +68,7 @@ void Shark::cycle() {
|
||||
for (auto& player : players_list) {
|
||||
if (isInView(player)) {
|
||||
checkNeighborhood(player, xpos_avg, ypos_avg, xvel_avg, yvel_avg, neighboring_player);
|
||||
checkCollision(player);
|
||||
}
|
||||
}
|
||||
if (neighboring_player > 0) {
|
||||
|
||||
3
shark.h
3
shark.h
@@ -21,6 +21,7 @@ private:
|
||||
const float MAX_SPEED = 3;
|
||||
const float MIN_SPEED = 0.6;
|
||||
const float BIASVALUE = 0.001;
|
||||
const int HITBOX = 50;
|
||||
|
||||
float x, y;
|
||||
float vx, vy;
|
||||
@@ -42,6 +43,7 @@ public:
|
||||
float getY() const { return y; };
|
||||
float getVx() const { return vx; };
|
||||
float getVy() const { return vy; };
|
||||
int getHITBOX() const { return HITBOX; };
|
||||
|
||||
|
||||
|
||||
@@ -52,6 +54,7 @@ public:
|
||||
bool isInView(Player& player);
|
||||
void checkNeighborhood(Player& player, float &xpos_avg, float &ypos_avg, float &xvel_avg, float &yvel_avg, int &neighboring_player);
|
||||
void updatePosition(int newX, int newY);
|
||||
void checkCollision(Player& player);
|
||||
|
||||
};
|
||||
|
||||
|
||||
BIN
video/Menu-bg.mp4
Normal file
BIN
video/Menu-bg.mp4
Normal file
Binary file not shown.
Reference in New Issue
Block a user