IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Unhandled exception at 0x0FCFCAB6 (ucrtbased.dll) in SpaceShip.exe


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 18
    Points : 5
    Points
    5
    Par défaut Unhandled exception at 0x0FCFCAB6 (ucrtbased.dll) in SpaceShip.exe
    Bonjour!

    Je suis en train de programmer un jeu où des invaders apparaissent au haut de l'écran et qu'ils descendent. Le vaisseau (personnage principal) peut se déplacer en X seulement et appuyer sur la barre espace.
    Lorsqu'il appuie sur space bar, un missile apparait et monte vers le haut de l'écran. Si le missile touche un enemy, le missile et l'enemy disparaissent. Tout marche bien, sauf qu'une erreur majeure semble être présente ici.
    Effectivement, lorsque je "spam" la barre espace pour lancer plusieurs missile, un crash survient parfois au niveau des collisions disant:
    Unhandled exception at 0x0FCFCAB6 (ucrtbased.dll) in SpaceShip.exe: An invalid parameter was passed to a function that considers invalid parameters fatal. occurred
    J'ai pourtant beau vérifier mes ranges de vectors (vector d'enemy et vector de shoot), il n'y a pas de dépassement du range...

    Fonction de collision:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    void checkCollisions(character Character, vector<shoot> &Shoot, vector<enemy> &Enemies, bool &gameover) {
    	//Collision enemy - Character
    	for (int i = 0; i < Enemies.size(); i++) {
    		//Compteur condition au lieu de faire une vérification imbriquée
    		int CompteurCondition = 0;
    		if (Enemies[i].getY() + Enemies[i].getHeight() >= Character.getY() && Enemies[i].getY() + Enemies[i].getHeight() <= Character.getY() + Character.getHeight()) {
    			CompteurCondition++;
    		}
     
    		else if (Enemies[i].getY() <= Character.getY() + Character.getHeight() && Enemies[i].getY() >= Character.getY()) {
    			CompteurCondition++;
    		}
     
    		if (Enemies[i].getX() + Enemies[i].getWidth() >= Character.getX() && Enemies[i].getX() + Enemies[i].getWidth() <= Character.getX() + Character.getWidth()) {
    			CompteurCondition++;
    		}
     
    		else if (Enemies[i].getX() <= Character.getX() + Character.getWidth() && Enemies[i].getX() >= Character.getX()) {
    			CompteurCondition++;
    		}
    		//Si au moins deux conditions sont vraies
    		if (CompteurCondition >= 2) {
    			//Afficher Game Over etc...
    			gameover = true;
    		}
    		else {
     
    		}
    	}
    	//Collision enemy - shoot
    	for (int i = 0; i < Enemies.size(); i++) {
    		for (int j = 0; j < Shoot.size(); j++) {
    			int ConditionEnemy = 0;
    			if (Enemies[i].getY() + Enemies[i].getHeight() >= Shoot[j].getY() && Enemies[i].getY() + Enemies[i].getHeight() <= Shoot[j].getY() + Shoot[j].getHeight()) {
    				ConditionEnemy++;
    			}
     
    			else if (Enemies[i].getY() <= Shoot[j].getY() + Shoot[j].getHeight() && Enemies[i].getY() >= Shoot[j].getY()) {
    				ConditionEnemy++;
    			}
     
    			if (Enemies[i].getX() + Enemies[i].getWidth() >= Shoot[j].getX() && Enemies[i].getX() + Enemies[i].getWidth() <= Shoot[j].getX() + Shoot[j].getWidth()) {
    				ConditionEnemy++;
    			}
     
    			else if (Enemies[i].getX() <= Shoot[j].getX() + Shoot[j].getWidth() && Enemies[i].getX() >= Shoot[j].getX()) {
    				ConditionEnemy++;
    			}
    			//Si au moins deux conditions sont vraies : clear la case des vector Enemies et Shoot
    			if (ConditionEnemy >= 2) {
    				Enemies.erase(Enemies.begin() + i);
    				Shoot.erase(Shoot.begin() + j);
    			}
    			else {
     
    			}
    		}
    	}
    }
    Classe enemy:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    class enemy : public entity
    {
    public:
    	enemy();
    	~enemy();
    	void displayEnemy();
    	void moveEnemy();
    };
    enemy::enemy()
    {
    	x = rand() % Width;
    	y = 0;
    	image = ChargerImage("enemy.bmp");
    }
     
    enemy::~enemy()
    {
    }
     
    void enemy::displayEnemy() {
    	AfficherImage(image, x, y);
    }
     
    void enemy::moveEnemy() {
    	y = y + 1;
    }
    Classe Shoot:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    class shoot : public entity
    {
    public:
    	shoot::shoot(character Character);
    	shoot();
    	~shoot();
    	void displayShoot();
    	void moveShoot();
    };
     
    shoot::shoot(character Character)
    {
    	x = Character.getX();
    	y = Character.getY() - 1;
    	image = ChargerImage("shoot.bmp");
    }
     
    shoot::shoot() {
     
    }
     
    shoot::~shoot()
    {
    }
     
    void shoot::moveShoot() {
    	y = y - 5;
    }
     
    void shoot::displayShoot() {
    	AfficherImage(image, x, y);
    }
    Merci énormément!

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Dans sa grande mansuétude, la version DEBUG de la C-Runtime a détecté que vous lui envoyé de la merde en paramètre.
    Utilisez le débuggeur de VS pour avoir accès à la pile d'appel et voir où dans votre code vous lui envoyer de mauvais paramètres.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 18
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    J'ai réglé ce dernier problème en créant un vecteur d'index de shoot et d'ennemis afin de supprimer les éléments à supprimer en ordre décroissant.
    Toutefois, j'arrive à un dernier problème: Lorsque plusieurs ennemis sont dans un même rayon (que plusieurs ennemis touchent un missile), le jeu crash en affichant le message suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Unhandled exception at 0x1006CAB6 (ucrtbased.dll) in SpaceShip.exe: An invalid parameter was passed to a function that considers invalid parameters fatal. occurred
    Voici le dernier appel de la pile d'appel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    >	SpaceShip.exe!checkCollisions(character Character, std::vector<shoot,std::allocator<shoot> > & Shoot, std::vector<enemy,std::allocator<enemy> > & Enemies, bool & gameover) Line 129	C++	Symbols loaded.
    Je ne vois pas comment un paramètre peut être invalide techniquement...
    Merci!

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/07/2016, 22h56
  2. Unhandled Exception at 0x77474671 (ntdll.dll)
    Par Syarko dans le forum C++
    Réponses: 5
    Dernier message: 15/04/2015, 11h59
  3. Réponses: 5
    Dernier message: 10/06/2008, 23h23
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo