CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Problème SFML c++

redsnack24
redsnack24
Niveau 1
17 février 2018 à 17:04:30

Bonjour à toutes et à tous, je tente de coder seul un projet de shoot em up mais mon problème actuel se situe dans l'organisation de mon code, j'ai réussi à faire quelques petits trucs e je vais continuer mais utilisant la bibliothèque SFML, je n'arrive pas a utiliser des classes avec un cpp ET un .h, actuellement ce que je fais fonctionne mais j'ai main.cpp vaisseau.h(ou tout est codé dedans) et d'autres choses qui ne nous intéressent pas actuellement. J'ai tenté de mettre un .cpp et un .h (je sais que j'ai aussi la fonction projectile dedans que j'enleverai) et ca donne ca

main.cpp

  1. pragma region Includes
  2. include <SFML/Graphics.hpp>
  3. include <stdio.h>
  4. include <iostream>
  5. include "vaisseau.h"
  6. include "fond.h"
  7. include "monstre.h"
  8. include "projectile.h"
  9. pragma endregion
  1. pragma region Main

int main()
{

window.setSize(Vector2u(800, 1100));
window.setPosition(Vector2i(500, 0));
window.setFramerateLimit(60);

vaisseau monVaisseau;
fond monFond;
vaisseau monProjectile;
monstre monMonstre;
//projectile monProjectile;

monFond.chargement();
monVaisseau.chargement();
monMonstre.chargement();

while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();

monFond.affichage();
monVaisseau.deplacement();
monVaisseau.projectile();
monMonstre.affichage();

window.display();

}

  1. pragma endregion

return 0;
}

vaisseau.cpp

  1. include <SFML\Graphics.hpp>
  2. include "vaisseau.h"

using namespace std;
using namespace sf;

void vaisseau::chargement()
{
textVaisseau.loadFromFile("images/vaisseau.png");
spriteV.setTexture(textVaisseau);
spriteV.setPosition(920, 930);
spriteV.setScale(0.8, 0.35);

textProjectile.loadFromFile("images/Projectile2.png");
spriteP.setTexture(textProjectile);
spriteP.setScale(3, 1.5);
spriteP.setPosition(-50, -50);
}

void vaisseau::deplacement()
{
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
{
spriteV.move(Vector2f(-40, 0));
}
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
{
spriteV.move(Vector2f(40, 0));
}

if (spriteV.getPosition().x < 0)
{
spriteV.setPosition(Vector2f(0, spriteV.getPosition().y));
}
if (spriteV.getPosition().x > 1730)
{
spriteV.setPosition(Vector2f(1730, spriteV.getPosition().y));
}

//cout << spriteV.getPosition().x << endl;
window.draw(spriteV);
}

  1. pragma endregion
  1. pragma region Projectile

void vaisseau::projectile()
{
if (oneTime == true)
{
oneTime = false;
}

timeProjectile = clockProjectile.getElapsedTime();
if (timeProjectile.asSeconds() > 0.1 + t && conditionDepla1 == false)
{
posPos1.x = spriteV.getPosition().x;
posPos1.y = spriteV.getPosition().y;
spriteP.setPosition(Vector2f(posPos1.x + 70, posPos1.y - 50 - x * 20));
x++;
}

if (timeProjectile.asSeconds() > 0.9 + t)
{
conditionDepla1 = false;
spriteP.setPosition(Vector2f(-100, -100));
x = 0;
}

while (timeProjectile.asSeconds() > 1 + t)
{
t = t + 1;
}

window.draw(spriteP);
}

  1. pragma endregion

vaisseau.h

  1. ifndef __vaisseau__
  2. define __vaisseau__
  3. include <string>
  1. pragma region Initialisation

using namespace sf;
using namespace std;
RenderWindow window(sf::VideoMode(1930, 1100), "Projet FSTU ALPHA!");

  1. pragma endregion
  1. pragma region Déclarations

class vaisseau
{
public:

vaisseau();
~vaisseau();
void chargement();
void deplacement();
void projectile();
int positionX;
int positionY;

private:

Texture textVaisseau;
Sprite spriteV;
Texture textProjectile;
Sprite spriteP;

Clock clockProjectile;
Time timeProjectile;
bool oneTime = true;
bool conditionDepla1 = false;

Clock clockAttaque;
Time timeAttaque;
int x = 0;
float t = 0;
Vector2f posPos1;

};

  1. pragma endregion
  1. pragma region Vaisseau

vaisseau::vaisseau()
{

}

vaisseau::~vaisseau()
{

}

  1. endif

et mes erreurs sont :
Gravité Code Description Projet Fichier Ligne État de la suppression
Erreur LNK2005 "class sf::RenderWindow window" (?window@@3VRenderWindow@sf@@A) déjà défini(e) dans main.obj FSTU2 C:\Users\alane\Documents\FSTU2\FSTU2\vaisseau.obj 1
Erreur LNK2005 "public: __thiscall vaisseau::vaisseau(void)" (??0vaisseau@@QAE@XZ) déjà défini(e) dans main.obj FSTU2 C:\Users\alane\Documents\FSTU2\FSTU2\vaisseau.obj 1
Erreur LNK2005 "public: __thiscall vaisseau::~vaisseau(void)" (??1vaisseau@@QAE@XZ) déjà défini(e) dans main.obj FSTU2 C:\Users\alane\Documents\FSTU2\FSTU2\vaisseau.obj 1
Erreur LNK1169 un ou plusieurs symboles définis à différentes reprises ont été rencontrés FSTU2 C:\Users\alane\Documents\FSTU2\Debug\FSTU2.exe 1

whiteapplex
whiteapplex
Niveau 35
17 février 2018 à 17:26:07

pragma region ? Je connaissais pas.
Pour que ça fonctionne, il faut essayer de respecter les règles classiques: Déclaration(dire que la méthode/la classe existe), définition (écrire le code de la méthode), instanciation

Pour tester: Dans le main, tu mets le .h de ta classe, et tu l'instancie dans le main
Dans le .h de la classe, tu déclares la classe, les méthodes, les attributs.
Dans le .cpp de la classe, tu définis les méthodes, et tu mets le .h de la classe.
Et si jamais tu veux partager du code ici, il faut soit utiliser les balises <code> soit utiliser pastebin sinon c'est pas très lisible

AtmelAVR
AtmelAVR
Niveau 4
17 février 2018 à 19:11:16

Tu déclares une variable et tu implémentes des méthodes dans vaisseau.h. Ce fichier étant inclus dans main.cpp et vaisseau.cpp, tu te retrouves avec des déclarations multiples.

Déplace l’implémentation du constructeur et destructeur de vaisseau dans vaisseau.cpp.
Pour la variable window, le mieux serait de la déclarer au début de main puis de la passer en argument aux méthodes de vaisseau qui en ont besoin. Si tu préfères la solution variable globale, il faut que tu la déclares dans un seul des .cpp et dans l'autre avec le mot clef extern.

Message édité le 17 février 2018 à 19:11:52 par AtmelAVR
Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de Jeux
  • Programmation
  • Création de sites web
  • Linux
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment