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

Auteur Sujet: création et utilisation d'une classe Tile  (Lu 3798 fois)

0 Membres et 1 Invité sur ce sujet

tenkai188

  • Newbie
  • *
  • Messages: 11
    • Voir le profil
    • E-mail
création et utilisation d'une classe Tile
« le: Août 28, 2017, 11:24:01 pm »
Bonjour,

j'ai créé une classe Tile afin de pouvoir créé un tableau dynamique de Tile a partir d'un fichier txt pour gérer plus facilement les collisions. Pour cela cette classe utilise des vector et une énumération pour savoir de quel type de tile il s'agit. Cependant la map se s'affiche pas :(

Tile.h:
#pragma once
#include <SFML/Graphics.hpp>
#include <vector>
#include <iostream>
#include <fstream>
 
class Tile
{
public:
    Tile();
    Tile(int,std::vector<int>, std::vector<int>, std::vector<int>);
    ~Tile();
 
    int getId() const
    {
        return id;
    }
    void setId(int ide)
    {
        id = ide;
    }
 
    enum type { on, off, below };
private:
    int id;
};
 

Tile.cpp:
#include "Tile.h"
Tile::Tile()
{
    id = 0;
    type on;
}
Tile::Tile(int ide, std::vector<int>tabOn, std::vector<int>tabOff, std::vector<int>tabBelow)
{
    int id = ide;
    bool findIt = false;
 
    for (int b = 0; b < tabOn.size(); b++)
    {
        if ((ide == tabOn[b])&&(findIt==false))
        {
            type on;
            findIt = true;
        }
    }
    for (int b = 0; b < tabOff.size(); b++)
    {
        if ((ide == tabOff[b]) && (findIt == false))
        {
            type off;
            findIt = true;
        }
    }
    for (int b = 0; b < tabBelow.size(); b++)
    {
        if ((ide == tabBelow[b]) && (findIt == false))
        {
            type below;
            findIt = true;
        }
    }
}
 

la classe Tilemap que l'on trouve comme exemple sur le site de sfml que j'ai légèrement modifié:
#pragma once
#include <SFML/Graphics.hpp>
#include <string>
#include <iostream>
#include <ctime>
#include <cstdlib>
#include "Tile.h"
 
class TileMap : public sf::Drawable, public sf::Transformable
{
public:
    TileMap();
    ~TileMap();
    bool load(const std::string& tileset, sf::Vector2u tileSize, std::vector <Tile> tiles, unsigned int width, unsigned int height)
    {
        // on charge la texture du tileset
        if (!m_tileset.loadFromFile(tileset))
            return false;
 
        // on redimensionne le tableau de vertex pour qu'il puisse contenir tout le niveau
        m_vertices.setPrimitiveType(sf::Quads);
        m_vertices.resize(width * height * 4);
 
        // on remplit le tableau de vertex, avec un quad par tuile
        for (unsigned int i = 0; i < width; ++i)
            for (unsigned int j = 0; j < height; ++j)
            {
                // on récupère le numéro de tuile courant
                int tileNumber = tiles[i + j * width].getId();
 
                // on en déduit sa position dans la texture du tileset
                int tu = tileNumber % (m_tileset.getSize().x / tileSize.x);
                int tv = tileNumber / (m_tileset.getSize().x / tileSize.x);
 
                // on récupère un pointeur vers le quad à définir dans le tableau de vertex
                sf::Vertex* quad = &m_vertices[(i + j * width) * 4];
 
                // on définit ses quatre coins
                quad[0].position = sf::Vector2f(i * tileSize.x, j * tileSize.y);
                quad[1].position = sf::Vector2f((i + 1) * tileSize.x, j * tileSize.y);
                quad[2].position = sf::Vector2f((i + 1) * tileSize.x, (j + 1) * tileSize.y);
                quad[3].position = sf::Vector2f(i * tileSize.x, (j + 1) * tileSize.y);
 
                // on définit ses quatre coordonnées de texture
                quad[0].texCoords = sf::Vector2f(tu * tileSize.x, tv * tileSize.y);
                quad[1].texCoords = sf::Vector2f((tu + 1) * tileSize.x, tv * tileSize.y);
                quad[2].texCoords = sf::Vector2f((tu + 1) * tileSize.x, (tv + 1) * tileSize.y);
                quad[3].texCoords = sf::Vector2f(tu * tileSize.x, (tv + 1) * tileSize.y);
            }
 
        return true;
    }
 
private:
 
    virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const
    {
        // on applique la transformation
        states.transform *= getTransform();
 
        // on applique la texture du tileset
        states.texture = &m_tileset;
 
        // et on dessine enfin le tableau de vertex
        target.draw(m_vertices, states);
    }
 
    sf::VertexArray m_vertices;
    sf::Texture m_tileset;
};
 

main.cpp:
std::ifstream monFlux("demoSol.txt");
std::vector <int> tableau;
std::vector <int> tabOn;
std::vector <int> tabOff;
std::vector <int> tabBelow;
int nombre;
tabOn.push_back(56);
 
tabOff.push_back(19);
tabOff.push_back(28);
tabOff.push_back(33);
tabOff.push_back(36);
tabOff.push_back(48);
tabOff.push_back(49);
tabOff.push_back(50);
 
while (monFlux >> nombre)
    tableau.push_back(nombre);
 
for (int a = 0; a < tableau.size(); a++)
{
    tabTile.push_back(Tile(tableau[a], tabOn, tabOff, tabBelow));
 
}
 

if (!map.load("tileset.png", sf::Vector2u(32, 32), tabTile, 50, 50))
                        return -1;
 

Guit0x

  • Newbie
  • *
  • Messages: 35
    • Voir le profil
Re: création et utilisation d'une classe Tile
« Réponse #1 le: Août 28, 2017, 11:53:57 pm »
Bonsoir Tenkai,

Aucune erreur d'indiquée ? Sinon question bête mais, tu n'as pas oublié le draw() au niveau de ta fenêtre principale ? Du moins la fenête est bien passée au niveau du draw() virtuel ?
« Modifié: Août 28, 2017, 11:58:31 pm par Guit0x »

tenkai188

  • Newbie
  • *
  • Messages: 11
    • Voir le profil
    • E-mail
Re: création et utilisation d'une classe Tile
« Réponse #2 le: Août 29, 2017, 12:39:55 am »
Non, j'ai seulement un écran noir qui s'affiche avec le sprite de mon perso mais sans la map.
voila ma page main (désolé, comme je débute mon code est très brouillon)  :(

#include <SFML/Graphics.hpp>
#include <string>
#include <iostream>
#include <ctime>       
#include <cstdlib>
#include <fstream>
#include <cctype>
#include "TileMap.h"
#include <array>
#include <vector>
#include "Character.h"
#include "Player.h"
#include "Animation.h"
#include "Main.h"
#include <cmath>
#include "Tile.h"


//void gestion_clavier();
int tileNbr(sf::Sprite playerSprite);

std::vector <Tile> tabTile ;
sf::Texture playerTexture;
sf::Sprite playerSprite;
enum Direction { Down, Left, Right, Up };
sf::Vector2i anim(1, Down);
int speed=2;
bool updateFPS = false;
sf::Clock animClock;
float fpsCount = 0, switchFps = 100, fpsSpeed = 500;
int currenTileX = 0, nbrRow=0,nbrCol=0;
bool screenTitleOn = true;
int selection = 1;
TileMap map;
int a;
sf::View view;


int main()
{
        sf::Vector2i screenDimensions(1400, 763);
       
        sf::RenderWindow window(sf::VideoMode(screenDimensions.x, screenDimensions.y), "My first SFML game");
       
        window.setKeyRepeatEnabled(false);
       
        a = screenDimensions.x;
        window.setFramerateLimit(60);
       

        float frameCounter = 0, switchFrame = 100, frameSpeed = 500;

        //image de fond:
        sf::Texture pTexture;
        sf::Sprite fond;
        //rectangle noir a placer sur l'image
        sf::RectangleShape rect(sf::Vector2f((screenDimensions.x/100)*20, screenDimensions.y));
        rect.setPosition((screenDimensions.x / 100) * 10, 0);
        rect.setFillColor(sf::Color(0, 0, 0, 170));
        //menu
        sf::Font font;
        sf::String newGame = "New Game";
        sf::String continu = "Load Game";
        sf::String options = "Options";
        sf::String exit = "Exit";

        sf::Text ng(newGame, font, 20);
        sf::Text ctn(continu, font, 20);
        sf::Text opt(options, font, 20);
        sf::Text ext(exit, font, 20);
       
        //rectangle de selection
        sf::RectangleShape rectSelect(sf::Vector2f((screenDimensions.x / 100) * 20, 30));
        rectSelect.setPosition((screenDimensions.x / 100) * 10, ((screenDimensions.y / 100) * 40));
        rectSelect.setFillColor(sf::Color(255, 255, 255, 0));
        rectSelect.setOutlineColor(sf::Color(255, 255, 255, 255));
        rectSelect.setOutlineThickness(2.0f);
       
        ng.setColor(sf::Color(255, 255, 255));
        ctn.setColor(sf::Color(255, 255, 255));
        opt.setColor(sf::Color(255, 255, 255));
        ext.setColor(sf::Color(255, 255, 255));


        if (!font.loadFromFile("arial.ttf"))
                std::cout << "Error could not load the font file" << std::endl;

        if (!pTexture.loadFromFile("SplashScreen.jpg"))
                std::cout << "Error could not load player image" << std::endl;

        fond.setTexture(pTexture);
        ng.setPosition(((screenDimensions.x / 100) * 15), ((screenDimensions.y / 100) * 40));
        ctn.setPosition(((screenDimensions.x / 100) * 15), ((screenDimensions.y / 100) * 45));
        opt.setPosition(((screenDimensions.x / 100) * 15), ((screenDimensions.y / 100) * 50));
        ext.setPosition(((screenDimensions.x / 100) * 15), ((screenDimensions.y / 100) * 55));
       
       
        std::ifstream monFlux("demoSol.txt");
        std::vector <int> tableau;
        std::vector <int> tabOn;
        std::vector <int> tabOff;
        std::vector <int> tabBelow;
        int nombre;
        tabOn.push_back(56);
       
        tabOff.push_back(19);
        tabOff.push_back(28);
        tabOff.push_back(33);
        tabOff.push_back(36);
        tabOff.push_back(48);
        tabOff.push_back(49);
        tabOff.push_back(50);

        while (monFlux >> nombre)
                tableau.push_back(nombre);
       
        for (int a = 0; a < tableau.size(); a++)
        {
                tabTile.push_back(Tile(tableau[a], tabOn, tabOff, tabBelow));

        }
       
        //création du perso principale
        !playerTexture.loadFromFile("knight.png");
        playerSprite.setTexture(playerTexture);

        while (window.isOpen())
        {
               
                sf::Event event;
               
                while (window.pollEvent(event))
                {
                        switch (event.type)
                        {
                        case sf::Event::Closed:
                                window.close();
                                break;

                        }
                        if (event.type == sf::Event::KeyPressed)
                                updateFPS = true;
                       
                        else
                                updateFPS = false;
                       
                       
                currenTileX = std::abs(playerSprite.getPosition().x / 32);
                if ((event.type == sf::Event::KeyPressed)&&(screenTitleOn==true))
                {
                       
                        if (event.key.code == sf::Keyboard::Up)
                        {
                                if (selection == 1)
                                {
                                        selection = 4;
                                        rectSelect.setPosition(((screenDimensions.x / 100) * 10), ((screenDimensions.y / 100) * 55));
                                }
                                else
                                {
                                        selection--;
                                        rectSelect.move(0, -((screenDimensions.y / 100) * 5));
                                }
                        }
                        else if (event.key.code == sf::Keyboard::Down)
                        {
                                if (selection == 4)
                                {
                                        selection = 1;
                                        rectSelect.setPosition(((screenDimensions.x / 100) * 10), ((screenDimensions.y / 100) * 40));
                                }
                                else
                                {
                                        selection++;
                                        rectSelect.move(0, ((screenDimensions.y / 100) * 5));
                                }
                        }

                        if (event.key.code == sf::Keyboard::Return)
                        {
                                switch (selection)
                                {
                                case 1:
                                        screenTitleOn = false;
                                        if (!map.load("tileset.png", sf::Vector2u(32, 32), tabTile, 50, 50))
                                                return -1;
                                        break;
                                case 4:
                                        window.close();
                                        break;
                                }
                        }
                       
                }
                }

                if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
                {
                        anim.y = Up;
                        playerSprite.move(0, -speed);
                }
                else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
                {
                        anim.y = Down;
                        playerSprite.move(0, speed);
                }
                else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
                {
                        nbrCol = std::abs(playerSprite.getPosition().x / 32);
                        nbrRow = std::abs(playerSprite.getPosition().y / 32);
                        currenTileX = (nbrRow * 50) + nbrCol+1;
                        /*if (tabTile[currenTileX])
                        {*/

                                anim.y = Right;
                               
                                playerSprite.move(speed, 0);
                        //}
                }
                else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
                {
                        anim.y = Left;
                        playerSprite.move(-speed, 0);
                }
                if (playerSprite.getPosition().x <= 0)
                        playerSprite.setPosition(sf::Vector2f(0, playerSprite.getPosition().y));
                if (playerSprite.getPosition().y <= 0)
                        playerSprite.setPosition(sf::Vector2f(playerSprite.getPosition().x,0));
                if (updateFPS == true)
                {
                        if (animClock.getElapsedTime().asMilliseconds() >= 50)
                        {
                                anim.x--;
                                if (anim.x * 32 >= playerTexture.getSize().x)
                                        anim.x = 2;
                                animClock.restart();
                        }
                }
               
                playerSprite.setTextureRect(sf::IntRect(anim.x * 32, anim.y * 32, 32, 32));
               
                //parametrage de la vue
                view.reset(sf::FloatRect(0, 0, screenDimensions.x, screenDimensions.y));
                sf::Vector2f position(screenDimensions.x/2, screenDimensions.y/2);
                position.x = playerSprite.getPosition().x + 16 - (screenDimensions.x / 2);
                position.y = playerSprite.getPosition().y + 16 - (screenDimensions.y / 2);
                if (position.x < 0)
                        position.x = 0;
                if (position.y < 0)
                        position.y = 0;
                view.reset(sf::FloatRect(position.x, position.y, screenDimensions.x, screenDimensions.y));
               
                window.clear();
                window.draw(fond);
                window.draw(rect);
                window.draw(ng);
                window.draw(ctn);
                window.draw(opt);
                window.draw(ext);
                window.draw(rectSelect);
                if (screenTitleOn == false)
                {
                        window.clear();
                        window.setView(view);
                        window.draw(map);
                        window.draw(playerSprite);
                }
                window.display();
        }
        return 0;
}
       
int tileNbr(sf::Sprite playerSprite)
{
        nbrCol = std::abs(playerSprite.getPosition().x / 32);
        nbrRow = std::abs(playerSprite.getPosition().y / 32);
        return currenTileX = (nbrRow * 50) + nbrCol;
}
 

Guit0x

  • Newbie
  • *
  • Messages: 35
    • Voir le profil
Re: création et utilisation d'une classe Tile
« Réponse #3 le: Août 29, 2017, 12:23:34 pm »
Je vois un truc qui me chiffonne ici :
if (event.type == sf::Event::KeyPressed && screenTitleOn==true)
Pourquoi ajouter screenTitleOn dans cette condition ?

Et ici aussi :
if (screenTitleOn == false)
                {
                        window.clear();
                        window.setView(view);
                        window.draw(map);
                        window.draw(playerSprite);
                }
Le clear() est volontaire ?

tenkai188

  • Newbie
  • *
  • Messages: 11
    • Voir le profil
    • E-mail
Re: création et utilisation d'une classe Tile
« Réponse #4 le: Août 29, 2017, 01:10:13 pm »
j'utilise "screenTitleOn" pour indiquer que j'ai quitter le menu de démarrage.
Pour le clear: je l'ai placer pour effacer le menu de démarrage avant d'afficher la map du jeu :(

Guit0x

  • Newbie
  • *
  • Messages: 35
    • Voir le profil
Re: création et utilisation d'une classe Tile
« Réponse #5 le: Août 29, 2017, 01:58:56 pm »
Pour un menu de démarrage je vois plutôt ça dans une boucle while précédant une boucle inGame. Cela devrait donner un peu plus de clarté au niveau du main. Chaque boucle contenant ainsi ses propres draw.

while(window.isOpen())
{
    while(inMenu)
    {
        //...
    }

    while(inGame)
    {
        //...
    }
}
« Modifié: Août 29, 2017, 02:03:44 pm par Guit0x »

tenkai188

  • Newbie
  • *
  • Messages: 11
    • Voir le profil
    • E-mail
Re: création et utilisation d'une classe Tile
« Réponse #6 le: Août 29, 2017, 05:19:07 pm »
j'ai essayer de modifier mon code comme tu me la conseiller mais je crois que j'ai du me tromper quelque part, du coup c'est pire qu'avant  :(
Maintenant le démarrage est plus lent et le perso ne s’affiche même plus.

#include <SFML/Graphics.hpp>
#include <string>
#include <iostream>
#include <ctime>        
#include <cstdlib>
#include <fstream>
#include <cctype>
#include "TileMap.h"
#include <array>
#include <vector>
#include "Character.h"
#include "Player.h"
#include "Animation.h"
#include "Main.h"
#include <cmath>
#include "Tile.h"


//void gestion_clavier();
int tileNbr(sf::Sprite playerSprite);

std::vector <Tile> tabTile;
sf::Texture playerTexture;
sf::Sprite playerSprite;
enum Direction { Down, Left, Right, Up };
sf::Vector2i anim(1, Down);
int speed = 2;
bool updateFPS = false;
sf::Clock animClock;
float fpsCount = 0, switchFps = 100, fpsSpeed = 500;
int currenTileX = 0, nbrRow = 0, nbrCol = 0;
int selection = 1;
TileMap map;
int a;
sf::View view;
bool inMenu = true;
bool inGame = false;
sf::Event event;


int main()
{
        sf::Vector2i screenDimensions(1400, 763);

        sf::RenderWindow window(sf::VideoMode(screenDimensions.x, screenDimensions.y), "My first SFML game");

        window.setKeyRepeatEnabled(false);

        a = screenDimensions.x;
        window.setFramerateLimit(60);


        float frameCounter = 0, switchFrame = 100, frameSpeed = 500;

        //image de fond:
        sf::Texture pTexture;
        sf::Sprite fond;
        //rectangle noir a placer sur l'image
        sf::RectangleShape rect(sf::Vector2f((screenDimensions.x / 100) * 20, screenDimensions.y));
        rect.setPosition((screenDimensions.x / 100) * 10, 0);
        rect.setFillColor(sf::Color(0, 0, 0, 170));
        //menu
        sf::Font font;
        sf::String newGame = "New Game";
        sf::String continu = "Load Game";
        sf::String options = "Options";
        sf::String exit = "Exit";

        sf::Text ng(newGame, font, 20);
        sf::Text ctn(continu, font, 20);
        sf::Text opt(options, font, 20);
        sf::Text ext(exit, font, 20);

        //rectangle de selection
        sf::RectangleShape rectSelect(sf::Vector2f((screenDimensions.x / 100) * 20, 30));
        rectSelect.setPosition((screenDimensions.x / 100) * 10, ((screenDimensions.y / 100) * 40));
        rectSelect.setFillColor(sf::Color(255, 255, 255, 0));
        rectSelect.setOutlineColor(sf::Color(255, 255, 255, 255));
        rectSelect.setOutlineThickness(2.0f);

        ng.setColor(sf::Color(255, 255, 255));
        ctn.setColor(sf::Color(255, 255, 255));
        opt.setColor(sf::Color(255, 255, 255));
        ext.setColor(sf::Color(255, 255, 255));


        if (!font.loadFromFile("arial.ttf"))
                std::cout << "Error could not load the font file" << std::endl;

        if (!pTexture.loadFromFile("SplashScreen.jpg"))
                std::cout << "Error could not load player image" << std::endl;

        fond.setTexture(pTexture);
        ng.setPosition(((screenDimensions.x / 100) * 15), ((screenDimensions.y / 100) * 40));
        ctn.setPosition(((screenDimensions.x / 100) * 15), ((screenDimensions.y / 100) * 45));
        opt.setPosition(((screenDimensions.x / 100) * 15), ((screenDimensions.y / 100) * 50));
        ext.setPosition(((screenDimensions.x / 100) * 15), ((screenDimensions.y / 100) * 55));


        std::ifstream monFlux("demoSol.txt");
        std::vector <int> tableau;
        std::vector <int> tabOn;
        std::vector <int> tabOff;
        std::vector <int> tabBelow;
        int nombre;
        tabOn.push_back(56);

        tabOff.push_back(19);
        tabOff.push_back(28);
        tabOff.push_back(33);
        tabOff.push_back(36);
        tabOff.push_back(48);
        tabOff.push_back(49);
        tabOff.push_back(50);

        while (monFlux >> nombre)
                tableau.push_back(nombre);

        for (int a = 0; a < tableau.size(); a++)
        {
                tabTile.push_back(Tile(tableau[a], tabOn, tabOff, tabBelow));

        }

        //création du perso principale
        !playerTexture.loadFromFile("knight.png");
        playerSprite.setTexture(playerTexture);

        while (window.isOpen())
        {
                while (inMenu == true)
                {
                        while (window.pollEvent(event))
                        {
                                switch (event.type)
                                {
                                case sf::Event::Closed:
                                        window.close();
                                        break;
                                }
                                if (event.type == sf::Event::KeyPressed)
                                        updateFPS = true;

                                else
                                        updateFPS = false;

                                if (event.type == sf::Event::KeyPressed)
                                {

                                        if (event.key.code == sf::Keyboard::Up)
                                        {
                                                if (selection == 1)
                                                {
                                                        selection = 4;
                                                        rectSelect.setPosition(((screenDimensions.x / 100) * 10), ((screenDimensions.y / 100) * 55));
                                                }
                                                else
                                                {
                                                        selection--;
                                                        rectSelect.move(0, -((screenDimensions.y / 100) * 5));
                                                }
                                        }
                                        else if (event.key.code == sf::Keyboard::Down)
                                        {
                                                if (selection == 4)
                                                {
                                                        selection = 1;
                                                        rectSelect.setPosition(((screenDimensions.x / 100) * 10), ((screenDimensions.y / 100) * 40));
                                                }
                                                else
                                                {
                                                        selection++;
                                                        rectSelect.move(0, ((screenDimensions.y / 100) * 5));
                                                }
                                        }

                                        if (event.key.code == sf::Keyboard::Return)
                                        {
                                                switch (selection)
                                                {
                                                case 1:
                                                        if (!map.load("tileset.png", sf::Vector2u(32, 32), tabTile, 50, 50))
                                                                return -1;
                                                        inGame = true;
                                                        break;
                                                case 4:
                                                        window.close();
                                                        break;
                                                }
                                        }
                                }
                                window.clear();
                                window.draw(fond);
                                window.draw(rect);
                                window.draw(ng);
                                window.draw(ctn);
                                window.draw(opt);
                                window.draw(ext);
                                window.draw(rectSelect);
                                window.display();
                        }
                }
                while (inGame == true)
                {
                        while (window.pollEvent(event))
                        {
                                switch (event.type)
                                {
                                case sf::Event::Closed:
                                        window.close();
                                        break;
                                }
                                currenTileX = std::abs(playerSprite.getPosition().x / 32);
                                if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
                                {
                                        anim.y = Up;
                                        playerSprite.move(0, -speed);
                                }
                                else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
                                {
                                        anim.y = Down;
                                        playerSprite.move(0, speed);
                                }
                                else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
                                {
                                        nbrCol = std::abs(playerSprite.getPosition().x / 32);
                                        nbrRow = std::abs(playerSprite.getPosition().y / 32);
                                        currenTileX = (nbrRow * 50) + nbrCol + 1;
                                        /*if (tabTile[currenTileX])
                                        {*/

                                        anim.y = Right;
                                        playerSprite.move(speed, 0);
                                        //}
                                }
                                else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
                                {
                                        anim.y = Left;
                                        playerSprite.move(-speed, 0);
                                }
                                if (playerSprite.getPosition().x <= 0)
                                        playerSprite.setPosition(sf::Vector2f(0, playerSprite.getPosition().y));
                                if (playerSprite.getPosition().y <= 0)
                                        playerSprite.setPosition(sf::Vector2f(playerSprite.getPosition().x, 0));
                                if (updateFPS == true)
                                {
                                        if (animClock.getElapsedTime().asMilliseconds() >= 50)
                                        {
                                                anim.x--;
                                                if (anim.x * 32 >= playerTexture.getSize().x)
                                                        anim.x = 2;
                                                animClock.restart();
                                        }
                                }

                                playerSprite.setTextureRect(sf::IntRect(anim.x * 32, anim.y * 32, 32, 32));

                                //parametrage de la vue
                                view.reset(sf::FloatRect(0, 0, screenDimensions.x, screenDimensions.y));
                                sf::Vector2f position(screenDimensions.x / 2, screenDimensions.y / 2);
                                position.x = playerSprite.getPosition().x + 16 - (screenDimensions.x / 2);
                                position.y = playerSprite.getPosition().y + 16 - (screenDimensions.y / 2);
                                if (position.x < 0)
                                        position.x = 0;
                                if (position.y < 0)
                                        position.y = 0;
                                view.reset(sf::FloatRect(position.x, position.y, screenDimensions.x, screenDimensions.y));
                                window.clear();
                                window.setView(view);
                                window.draw(map);
                                window.draw(playerSprite);
                                window.display();
                        }
                }
               
        }
        return 0;
}

int tileNbr(sf::Sprite playerSprite)
{
        nbrCol = std::abs(playerSprite.getPosition().x / 32);
        nbrRow = std::abs(playerSprite.getPosition().y / 32);
        return currenTileX = (nbrRow * 50) + nbrCol;
}
 

Guit0x

  • Newbie
  • *
  • Messages: 35
    • Voir le profil
Re: création et utilisation d'une classe Tile
« Réponse #7 le: Août 29, 2017, 09:11:09 pm »
Dit moi si je me trompe mais... tu n'as pas l'impression d'être un peu submergé dans ton code ^^ ? Personnellement je le suis un peu ;). Tu disais être débutant, donc si c'est le cas, commence par des choses très simples, sans vouloir mettre la charrue avant les boeufs :P.

Moi-même quand je commence à me perdre, j'essai de le refaçonner d'une manière plus simple et plus logique, c'est l'une de mes priorités quand je code (et l'Orienté Objet est d'une très grande aide pour cela).

Là dans ton main j'ai vu quelques erreurs d'inattention, mais celle qui m'a particulièrement sauté aux yeux c'est celle concernant ce bloc-ci :

if (playerSprite.getPosition().x <= 0)
                playerSprite.setPosition(sf::Vector2f(0, playerSprite.getPosition().y));
if (playerSprite.getPosition().y <= 0)
                playerSprite.setPosition(sf::Vector2f(playerSprite.getPosition().x, 0));
if (updateFPS == true)
{
                if (animClock.getElapsedTime().asMilliseconds() >= 50)
                {
                                anim.x--;
                                if (anim.x * 32 >= playerTexture.getSize().x)
                                                anim.x = 2;
                                animClock.restart();
                }
}

playerSprite.setTextureRect(sf::IntRect(anim.x * 32, anim.y * 32, 32, 32));

//parametrage de la vue
view.reset(sf::FloatRect(0, 0, screenDimensions.x, screenDimensions.y));
sf::Vector2f position(screenDimensions.x / 2, screenDimensions.y / 2);
position.x = playerSprite.getPosition().x + 16 - (screenDimensions.x / 2);
position.y = playerSprite.getPosition().y + 16 - (screenDimensions.y / 2);
if (position.x < 0)
                position.x = 0;
if (position.y < 0)
                position.y = 0;
view.reset(sf::FloatRect(position.x, position.y, screenDimensions.x, screenDimensions.y));
window.clear();
window.setView(view);
window.draw(map);
window.draw(playerSprite);
window.display();
 

Tu l'as placé dans le pollEvent or il doit être en dehors (et je viens de voir que tu avais fait la même chose dans la boucle inMenu).

Ce n'est pas la seule chose que j'ai vu mais je te laisse chercher un peu.

Conseil : en sachant que le code n'est pas très grand pour le moment, n'hésite pas à repartir de zéro avec un main tout propre en y allant étape par étape si jamais tu te sens vraiment noyé dans le code, cela peut être bénéfique et c'est bon pour les révisions ;).

Courage !
« Modifié: Août 29, 2017, 09:43:43 pm par Guit0x »

tenkai188

  • Newbie
  • *
  • Messages: 11
    • Voir le profil
    • E-mail
Re: création et utilisation d'une classe Tile
« Réponse #8 le: Août 30, 2017, 09:37:58 pm »
ok je vais refaire ma page main :)
Merci pour les conseils.
Et j'ai réussi a faire + ou - ce que je voulais. Le problème (l'un des problèmes  ::) ) venait du constructeur de ma classe Tile qui créait un nouvel variable id au lieu de changer la valeur de l'attribut déjà existant  :-[

 

anything