Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: collision  (Lu 3746 fois)

0 Membres et 1 Invité sur ce sujet

Snitteur

  • Jr. Member
  • **
  • Messages: 63
    • Voir le profil
collision
« le: Juin 18, 2014, 10:50:14 am »
Bonjour désoler de redemander de l'aider mais depuis hier soir j'ai une erreur et je n'ai aucune idée d'où cela peut venir.

Apres avoir réussit a crée ma tile map, il falai bien faire les collision j'ai donc trouver un post qui disais de faire un tableau de bool de même dimension que la tile map,
le 0 correspond a un objet sans collision et le 1 un avec une collision.

C'est ce que j'ai fait mais ma fenêtre ce ferme aussitôt ouverte. Et le problème viens de la condition bool.
Je vous post le code complet   

J'ai bien entendu redimensionner la carte car un tableau de 26/22 sa fait grand pour test le fonctionnement

Je remercie ceux pouvant m'aider.
#include <SFML/Audio.hpp>
#include <SFML/Graphics.hpp>
#include <iostream>
#include <sstream>
#include <stdlib.h>
int LARGEUR_TILE = 40;
int HAUTEUR_TILE = 40;
int horloge =0;
int x;
int y;
int taillecase = 40;

using namespace std;
int main()
{
    sf::RenderWindow World(sf::VideoMode(800, 600), "tilemap");
World.setFramerateLimit(60);


sf::Texture myTexture;
    myTexture.loadFromFile("ressource/tile.png");


sf ::Texture Perso;
Perso.loadFromFile("ressource/zone.png");
sf::Sprite perso;
perso.setTexture(Perso);
perso.setPosition(160,160);
 int map[5] [5]
    {
      {4,4,4,4,4},
      {4,0,0,0,4},
      {4,0,0,0,4},
      {4,0,0,0,4},
      {4,4,4,4,4},

    };
bool masque [] =
{
      1,1,1,1,1,
      1,0,0,0,1,
      1,0,0,0,1,
      1,0,0,0,1,
      1,1,1,1,1
};


bool collision (bool masque []);
{
    if ( masque [ int (x/taillecase) + 3*int(y/taillecase) ] ==1 )
    {
        return true;
    }
    else
    {
        return false;
    }
}

///tuile 0 : route
    sf::Sprite mySprite(myTexture);
    mySprite.setTextureRect(sf::IntRect(0,0,40,40));
    sf::Sprite tuile0;
    tuile0 = mySprite;
///tuile 1 : herbe
    sf::Sprite mySprite1(myTexture);
    mySprite1.setTextureRect(sf::IntRect(40,0,40,40));
    sf::Sprite tuile1;
    tuile1 = mySprite1;
///tuile 2 : maison
    sf::Sprite mySprite2(myTexture);
    mySprite2.setTextureRect(sf::IntRect(80,0,40,40));
    sf::Sprite tuile2;
    tuile2 = mySprite2;
///tuile 3 : eau
    sf::Sprite mySprite3(myTexture);
    mySprite3.setTextureRect(sf::IntRect(120,0,40,40));
    sf::Sprite tuile3;
    tuile3 = mySprite3;
///tuile 4 : arbre
    sf::Sprite mySprite4(myTexture);
    mySprite4.setTextureRect(sf::IntRect(160,0,40,40));
    sf::Sprite tuile4;
    tuile4 = mySprite4;
///tuile 5 : pont
    sf::Sprite mySprite5(myTexture);
    mySprite5.setTextureRect(sf::IntRect(0,40,40,40));
    sf::Sprite tuile5;
    tuile5 = mySprite5;
    ///tuile 6 : pas d'idée
    sf::Sprite mySprite6(myTexture);
    mySprite6.setTextureRect(sf::IntRect(40,40,40,40));
    sf::Sprite tuile6;
    tuile6 = mySprite6;
    ///tuile 7 : sable
    sf::Sprite mySprite7(myTexture);
    mySprite7.setTextureRect(sf::IntRect(80,40,40,40));
    sf::Sprite tuile7;
    tuile7 = mySprite7;


///VUE///////////////////////////////////
sf::View view1;                      ///
///.////////////////////////////////////


///BOUCLE///////////////////////////////
    while (World.isOpen())
    {
        sf::Event event;
        while (World.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                World.close();
        }



if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
{
    perso.move(sf::Vector2f(4,0)) ;
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
{
    perso.move(sf::Vector2f(-4,0)) ;
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
{
    perso.move(sf::Vector2f(0,-4)) ;
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
{
    perso.move(sf::Vector2f(0,4)) ;
}

World.clear();
for (int i = 0; i < 5; i++)
{
    for(int j = 0; j < 5; j++)
    {
        ///selon le code trouve dans le tableau on parametre le bon tile et on le colle sur l'ecran
        switch(map[i][j])
        {
            case 0:
            tuile0.setPosition(i * LARGEUR_TILE, j * HAUTEUR_TILE);
            World.draw(tuile0);
            break;
            case 1:
            tuile1.setPosition(i * LARGEUR_TILE, j * HAUTEUR_TILE);
            World.draw(tuile1);
            break;
            case 2:
            tuile2.setPosition(i * LARGEUR_TILE, j * HAUTEUR_TILE);
            World.draw(tuile2);
            break;
            case 3:
            tuile3.setPosition(i * LARGEUR_TILE, j * HAUTEUR_TILE);
            World.draw(tuile3);
            break;
            case 4:
            tuile4.setPosition(i * LARGEUR_TILE, j * HAUTEUR_TILE);
            World.draw(tuile4);
            break;
            case 5:
            tuile5.setPosition(i * LARGEUR_TILE, j * HAUTEUR_TILE);
            World.draw(tuile5);
            break;
            case 6:
            tuile6.setPosition(i * LARGEUR_TILE, j * HAUTEUR_TILE);
            World.draw(tuile6);
            break;
            case 7:
            tuile7.setPosition(i * LARGEUR_TILE, j * HAUTEUR_TILE);
            World.draw(tuile7);
            break;
        }
    }
}
view1.reset(sf::FloatRect(0,0,800,600));
sf::Vector2f position(400,300);
position.x = perso.getPosition().x + 20 - 400;
position.y = perso.getPosition().y + 20 - 300;
if ( position.x < 0)
{
    position.x = 0;
}
if ( position.x > 700)
{
    position.x = 800;
}
if ( position.y < 0)
{
    position.y = 0;
}
if ( position.y > 600)
{
    position.y = 600;
}
view1.reset(sf::FloatRect(position.x,position.y,800,600));
World.setView(view1);


World.draw(perso);


World.display();
    }
}
 

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : collision
« Réponse #1 le: Juin 18, 2014, 10:57:34 am »
Citer
j'ai une erreur et je n'ai aucune idée d'où cela peut venir
C'est pour cela qu'on a inventé les debuggers ;)

Plus tôt tu apprendras à t'en servir, plus vite tu arriveras à ne pas perdre de temps inutilement sur des bêtises comme celle-ci.
Laurent Gomila - SFML developer

Snitteur

  • Jr. Member
  • **
  • Messages: 63
    • Voir le profil
Re : collision
« Réponse #2 le: Juin 18, 2014, 11:09:35 am »
j'ai beau appuyer sur le bouton rouge ( code block ) pour debbugers et rien ne ce passe, sa m'affiche rien

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : collision
« Réponse #3 le: Juin 18, 2014, 11:12:48 am »
Dans ce cas essaye de trouver un bon tutoriel, ou demande sur un forum spécialisé Code::Blocks. Personne ne peut développer correctement sans un debugger. Si tu viens demander sur un forum à chaque fois que ton code plante, tu vas y passer ta vie.
Laurent Gomila - SFML developer

Snitteur

  • Jr. Member
  • **
  • Messages: 63
    • Voir le profil
Re : collision
« Réponse #4 le: Juin 18, 2014, 11:18:21 am »
sa c'est sur mais cette aprèm je suis pris par une chose que l'on appel le BAC. Donc je verais sa ce soir

Snitteur

  • Jr. Member
  • **
  • Messages: 63
    • Voir le profil
Re : collision
« Réponse #5 le: Juin 18, 2014, 09:35:27 pm »
Je n'ai rien trouver, j'ai donc décider d'isoler le problème avec un code simple prenant que la fonction bool :

#include <SFML/Audio.hpp>
#include <SFML/Graphics.hpp>
#include <iostream>
#include <sstream>
#include <stdlib.h>
int x;
int y;
int taillecase = 40;
using namespace std;

int main()
{
    sf::RenderWindow World(sf::VideoMode(800, 600), "tilemap");

bool masque [] =
{
      1,1,1,1,1,
      1,0,0,0,1,
      1,0,0,0,1,
      1,0,0,0,1,
      1,1,1,1,1
};



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

        bool collision;
        {
            if ( masque [ int (x / taillecase) + 3*int(y / taillecase) ] ==1 )
            {
                return true;
                cout << "blabla" << endl;
            }
        }

    }
}
 


Cela ne change rien la fenêtre s'ouvre/ferme. Cela ne viens donc pas du reste mais de cette fonction.

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : collision
« Réponse #6 le: Juin 18, 2014, 09:56:39 pm »
C'est pas une fonction ça, et evite de l'écrire comme ça à l'intérieur du main. :o

Là tu déclares une variable booléenne qui s'appelle collision.
Puis tu fais un test avec des variables x et y non-initialisées (qui sont surement à 0 du coup), et tu retournes (en retour de la fonction main puisque c'est ta seule fonction) true et donc ton programme se termine.

Dans le code d'avant c'est la même merde avec le point-virgule :
bool collision (bool masque []);
Faut apprendre à déclarer une fonction, là ça ressemble à rien. :/

Snitteur

  • Jr. Member
  • **
  • Messages: 63
    • Voir le profil
Re : collision
« Réponse #7 le: Juin 18, 2014, 11:46:36 pm »
^^ j'ai appeler sa fonction mais ce que je voulais dire na rien à voire a une fonction. Pour les classe je commence demain ou vendredi car suite a plusieurs essai infructueux j’ai abandonner mais il faut vraiment que j'arrive à coder en POO.   

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : collision
« Réponse #8 le: Juin 19, 2014, 12:46:54 am »
Ben je sais pas de quoi tu parles alors.
Mais ce qui est sûr, c'est que quand tu fais un return dans le main bah ton programme se termine quoi. :p
Donc normal que ta fenêtre s'ouvre et se referme tout de suite.

Snitteur

  • Jr. Member
  • **
  • Messages: 63
    • Voir le profil
Re : collision
« Réponse #9 le: Juin 19, 2014, 09:06:46 am »
Ok merci.