#pragma region Variables
RenderWindow window;
Vector2i resolutionEcran(800, 600);
Vector2i positionSouris;
Texture perso;
Sprite sprite_perso;
Texture carte;
Sprite sprite_carte;
const float deplacement(200.0);
float deplacementFPS(0);
enum Dir{Down, Left, Right, Up};
Vector2i anim(1, Down);
bool stopAnim(true);
View view;
Music musicFond;
IpAddress IP = IpAddress::getLocalAddress();
TcpSocket socket;
char buffer[2000];
size_t received;
Font font;
Text message_server;
Text message_client;
TcpSocket client;
#pragma endregion Variables
int main()
{
Clock chronoFPS; // Démarre le chrono. (Utilisé pour gérer le temps de l'application selon les FPS)
Clock chronoAnimation; // Démarre le chrono pour la vitesse de l'animation.
// Log.
string const logFichier("logs.txt");
ofstream log(logFichier.c_str());
if(log)
{
cout << "Lancement du jeu..." << endl;
// Création de la fenêtre.
window.create(VideoMode(resolutionEcran.x, resolutionEcran.y), "Tuto Scol");//, Style::Fullscreen);
window.setFramerateLimit(60); // Définit les images par seconde.
window.setVerticalSyncEnabled(true);
// Chargement des textures.
log << "Chargement des textures..." << endl;
cout << "Chargement des textures..." << endl;
if(!perso.loadFromFile("player.png"))
{
log << "Echec : L'image 'player.png' est introuvable." << endl;
cout << "Echec : L'image 'player.png' est introuvable." << endl;
window.close();
return 0;
}
log << "- player.png" << endl;
perso.setSmooth(true);
sprite_perso.setTexture(perso);
sprite_perso.setPosition(255, 1040); // Spawn du personnage.
if(!carte.loadFromFile("carte.png"))
{
log << "Echec : L'image 'carte.png' est introuvable." << endl;
cout << "Echec : L'image 'carte.png' est introuvable." << endl;
window.close();
return 0;
}
log << "- carte.png" << endl;
log << "Chargement des textures réussi." << endl;
cout << "Chargement des textures réussi." << endl;
sprite_carte.setTexture(carte);
// Chargement des sons.
log << "Chargement des sons..." << endl;
cout << "Chargement des sons..." << endl;
if(!musicFond.openFromFile("Portal.ogg"))
{
log << "Echec : Le son 'Portal.mp3' est introuvable." << endl;
cout << "Echec : Le son 'Portal.mp3' est introuvable." << endl;
window.close();
return 0;
}
log << "- Portal.ogg" << endl;
log << "Chargement des sons réussi." << endl;
cout << "Chargement des sons réussi." << endl;
musicFond.setLoop(true);
//Text
if (!font.loadFromFile("arial.ttf"))
{
log << "Echec : La police 'arial.ttf' est introuvable." << endl;
cout << "Echec : La police 'arial.ttf' est introuvable." << endl;
window.close();
return 0;
}
message_server.setFont(font);
message_server.setCharacterSize(24);
message_server.setColor(Color::Red);
message_server.setStyle(Text::Bold);
message_client.setFont(font);
message_client.setCharacterSize(24);
message_client.setColor(Color::Red);
message_client.setStyle(Text::Bold);
}
else
{
cout << "ERREUR: Impossible d'ouvrir le fichier 'logs.txt'." << endl;
window.close();
}
// Tant que la fenêtre est ouverte.
while(window.isOpen())
{
Event event;
// Test des événements.
while(window.pollEvent(event))
{
// Si on clique sur fermer l'application, on ferme la fenêtre.
if(event.type == Event::Closed)
window.close();
if(Keyboard::isKeyPressed(Keyboard::Escape)) // Pour quitter le jeu en plein écran.
window.close();
if(Keyboard::isKeyPressed(Keyboard::P)) // Pour lancer la music.
{
musicFond.play();
}
if(Keyboard::isKeyPressed(Keyboard::S)) // Pour créer session multijoueur.
{
TcpListener listener; // Attend les connections des clients sur le port 53000.
if(listener.listen(53000) != sf::Socket::Done)
{
log << "Impossible d'utilisé le port 53000." << endl;
cout << "Impossible d'utilisé le port 53000." << endl;
}
else
{
if(listener.accept(client) != sf::Socket::Done)
{
log << "Impossible d'accepter le client." << endl;
cout << "Impossible d'accepter le client." << endl;
}
else
{
message_server.setString("Connection établi avec le client.");
log << "Connection établi avec le client." << endl;
cout << "Connection établi avec le client." << endl;
message_server.setPosition(sprite_perso.getPosition().x, sprite_perso.getPosition().y);
}
}
}
if(Keyboard::isKeyPressed(Keyboard::C)) // Pour rejoindre une session multijoueur.
{
sf::Socket::Status status = socket.connect("192.168.1.23", 53000);
if (status != sf::Socket::Done)
{
message_client.setString("Impossible d'établir une connection avec le serveur.");
log << "Impossible d'établir une connection avec : 192.168.1.23" << endl;
cout << "Impossible d'établir une connection avec : 192.168.1.23" << endl;
}
else
{
message_client.setString("Connection avec le serveur réussi.");
}
message_client.setPosition(sprite_perso.getPosition().x, sprite_perso.getPosition().y);
}
if(socket.send(buffer, sizeof(buffer)) != sf::Socket::Done)
{
// erreur...
}
}
// Gestion du clavier.
gestion_clavier();
// Animations du personnage.
Time animTime = chronoAnimation.getElapsedTime();
if(stopAnim)
{
anim.x = 1;
}
else if(animTime.asSeconds() >= 0.1f)
{
anim.x++;
if(anim.x * 32 >= perso.getSize().x)
{
anim.x = 0;
}
chronoAnimation.restart();
}
sprite_perso.setTextureRect(IntRect(anim.x * 32, anim.y * 32, 32, 32));
// Centrer caméra sur le personnage.
Vector2f position(0, 0);
position.x = sprite_perso.getPosition().x + 16 - (1200 / 2);
position.y = sprite_perso.getPosition().y + 16 - (800 / 2);
if(position.x < 0)
position.x = 0;
if(position.y < 0)
position.y = 0;
if(position.x > carte.getSize().x - 1200)
position.x = carte.getSize().x - 1200;
if(position.y > carte.getSize().y - 800)
position.y = carte.getSize().y - 800;
view.reset(FloatRect(position.x, position.y, 1200, 800));
//view.zoom(0.7f);
window.setView(view);
// Affichage du jeu.
window.clear(); // On efface l'affichage de la fenêtre.
window.draw(sprite_carte); // On affiche la map.
window.draw(sprite_perso); // On affiche le personnage dans la fenêtre.
window.draw(message_server);
window.draw(message_client);
window.display(); // On affiche la fenêtre avec tous les éléments.
// Gérer le temps pour déplacement (Utilisé pour gérer le temps de l'application selon les FPS)
Time frameTime = chronoFPS.restart(); // Check le FPS.
deplacementFPS = deplacement * frameTime.asSeconds();
chronoFPS.restart();
}
return 0;
}