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

Auteur Sujet: Problème de position  (Lu 1391 fois)

0 Membres et 1 Invité sur ce sujet

Jamese

  • Jr. Member
  • **
  • Messages: 72
    • Voir le profil
Problème de position
« le: Septembre 02, 2014, 10:18:51 am »
Bonjour après avoir "réaliser" mon algo pour détecter collision ou non, je ne sait quoi faire pour interdire le déplacement de mon joueur ( Jame ). Du coup je suis un peut bloquer.

Voici mon code en gardant l'essentiel :

main.cpp :

#include "TileMap.h"
#include "Jame.h"
#include <iostream>
#include <SFML/Graphics.hpp>

using namespace std;

int main()
{

Jame blop;


    // on crée la fenêtre
    sf::RenderWindow window(sf::VideoMode(1920, 1080), "Tilemap");
    window.setFramerateLimit(60);

    // on définit le niveau à l'aide de numéro de tuiles
    const int level[] =
    {
        1, 1, 1, 1, 1, 1, 1, 1,
        1, 0, 0, 0, 0, 0, 0, 1,
        1, 0, 0, 0, 0, 0, 0, 1,
        1, 0, 0, 0, 2, 0, 0, 1,
        1, 0, 0, 0, 2, 0, 0, 1,
        1, 0, 2, 0, 2, 0, 2, 1,
        1, 0, 2, 2, 2, 0, 2, 1,
        1, 1, 1, 1, 1, 1, 1, 1,
    };
    // on crée la tilemap avec le niveau précédemment défini
    TileMap map;
    if (!map.load("tileset.png", sf::Vector2u(80, 80), level, 8, 8))
        return -1;

    // on fait tourner la boucle principale
    while (window.isOpen())
    {
        // on gère les évènements
        sf::Event event;
        while (window.pollEvent(event))
        {
            if(event.type == sf::Event::Closed)
                window.close();
        }
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))
{
  window.close();
}

if (sf::Keyboard::isKeyPressed(sf::Keyboard::Z))
{

    blop.deplacement_H();
}
if ((sf::Keyboard::isKeyPressed(sf::Keyboard::Q)) && (blop.collision == false)) /*j'avais panssais a sa */
{
    blop.deplacement_G();
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::S))
{
    blop.deplacement_B();
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::D))
{
    blop.deplacement_D();
}
        // on dessine le niveau
        window.clear();
        window.draw(map);
        window.draw(blop);
        window.display();
    }

    return 0;
}
 


Et mon Jame.cpp :

#include "Jame.h"
#include <SFML/Graphics.hpp>


Jame::Jame()
{
    t_jame.loadFromFile("ressource/Jame.png");
    spr_jame.setTexture(t_jame);
    spr_jame.setPosition(160,160);
}
void Jame::deplacement_B()
{
    spr_jame.move(sf::Vector2f(0,4)) ;
}
void Jame::deplacement_D()
{
    spr_jame.move(sf::Vector2f(4,0)) ;
}
void Jame::deplacement_G()
{
    spr_jame.move(sf::Vector2f(-4,0)) ;
}
void Jame::deplacement_H()
{
    spr_jame.move(sf::Vector2f(0,-4)) ;
}
bool Jame::collision()
{

    bool map_collision[] =
    {
        1,1,1,1,1,1,1,1,
        1,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,1,
        1,0,0,0,0,0,0,1,
        1,1,1,1,1,1,1,1,
    };
    posX = spr_jame.getPosition().x;
    posY = spr_jame.getPosition().y;

    hauteur_2 = posX + 80 ;
    largeur_2 = posY + 80 ;
int tiles = posX / 80 ;
int tiles2 = posY / 80 ;

    for (int hauteur_1 = posX -80; hauteur_1 < hauteur_2; ++hauteur_1)
            for (int largeur_1 = posY -80; largeur_1 < largeur_2; ++largeur_1)
            {
                if (map_collision [tiles + 3* tiles2] == 1)
                {
                    return true;
                }
                return false;
            }


}

 

Voila j'attend votre aide avec impatience.
Et sur ce bonne journée.

AnselmeSfml

  • Jr. Member
  • **
  • Messages: 78
    • Voir le profil
    • E-mail
Re : Problème de position
« Réponse #1 le: Septembre 02, 2014, 11:54:57 am »
Salut!
Si tu n'arrives pas à faire ça c'est que tu n'as pas compris comment traiter le cycle d'un déplacement: réfléchi bien, c'est celui-ci.

1. L'utilisateur appuie sur une touche.
2. On check si il à le droit d'aller à la case sur laquelle il sera après ce déplacement.
3. Si c'est une case valide, on le déplace.

Voilà.

PS: ce n'était pas utile d'ouvrir un 2ème topic, je t'aurai répondu sur l'ancien ;)