Partage

[SFML] Tile mapping

Sujet résolu
15 août 2018 à 13:57:03

Bonjours,

Je suis en train de creer un moteur de jeu avec la sfml pour des jeux en 2d mais j'ai un probleme de concernant les tiles. C'est assez bizarre en faite😅. Je vous donne le code et je vous explique

mon code : 

Map.cpp

#include "Map.h"
#include <fstream>

Map::Map(std::string const& tileSetPath) : m_tileSet(), m_array_map(), m_imageTileSet()
{
	if (m_imageTileSet.loadFromFile(tileSetPath.c_str())) 
	{
		m_tileSet.loadFromImage(m_imageTileSet);
	}
	else
	{
		std::cout << "Erreur chargement tuiles";
	}
}

void Map::loadMapFromFile(std::string const & filepath)
{
	char a;

	std::ifstream fichier("nivo/"+filepath+".txt");
	if (fichier)
	{
		for (int i(0); i < NOMBRE_BLOCS_HAUTEUR; i++)
		{
			for (int j(0); j < NOMBRE_BLOCS_LARGEUR; j++)
			{
				fichier.get(a);
				if (a != 10)
				{
					m_array_map[i][j] = a - 48;
				}
			}
		}
	}
	for (int i(0); i < NOMBRE_BLOCS_HAUTEUR; i++)
	{
		for (int j(0); j < NOMBRE_BLOCS_LARGEUR; j++)
		{
			std::cout << m_array_map[i][j] << "|";
		}
	}
}

void Map::drawMap(sf::RenderWindow & window)
{
	sf::Sprite sprite_tile;
	sprite_tile.setTexture(m_tileSet);
	std::cout << std::endl << std::endl;
	for (int i(0); i < NOMBRE_BLOCS_HAUTEUR; i++)
	{
		for (int j(0); j < NOMBRE_BLOCS_LARGEUR; j++)
		{
			std::cout << m_array_map[i][j] << "|";
			sprite_tile.setPosition(sf::Vector2f(float(i*32), float(j*32)));
			sprite_tile.setTextureRect(sf::IntRect(m_array_map[i][j] * 32, 0, 32, 32));
			window.draw(sprite_tile);
		}
	}
}

Map.h

#include <string>
#include <iostream>
#include <SFML/Graphics.hpp>
#include <array>

#define LARGEUR_TILE 32
#define HAUTEUR_TILE 32

#define NOMBRE_BLOCS_LARGEUR 10
#define NOMBRE_BLOCS_HAUTEUR 10

typedef std::array<std::array<int, NOMBRE_BLOCS_LARGEUR>, NOMBRE_BLOCS_HAUTEUR> ArrayMap;

class Map
{
public:
	Map(std::string const& tileSetPath);
	void loadMapFromFile(std::string const& filepath);
	void drawMap(sf::RenderWindow& window);

private:
	sf::Image m_imageTileSet;
	sf::Texture m_tileSet;
	ArrayMap m_array_map;
};

Main.cpp

#include <SFML/Graphics.hpp>


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


int main()
{
	sf::RenderWindow window(sf::VideoMode(NOMBRE_BLOCS_HAUTEUR * HAUTEUR_TILE, NOMBRE_BLOCS_LARGEUR * LARGEUR_TILE), "Titre");

	Map map1("tiles/tileset.png");
	map1.loadMapFromFile("nivo1");
	window.clear();
	map1.drawMap(window);
	window.display();


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

	}

	return 0;
}

Tileset.png : 

En gros ce code ne marche qu'a moitie il marchait bien et d'un seul coup ben il marchait plus avec ce nivo : 

nivo.txt :

2222200000
2222000111
2200011100
2000110000
0000100000
0000100000
0000100002
0001100022
0001000222
0001000222

Du coup je me suis dit que j'allais enlever les saut de ligne tel :

2222200000222200011122000111002000110000000010000000001000000000100002000110002200010002220001000222

Et la ça marche bien ( pour l'instant :p ) mais je voudrais pouvoir mettre les saut de ligne car meme si c'est pour un editeur de jeu je voudrais que si jamais je dois aller modifier manuellement la map ben je puisse donc que dois-je faire

EDIT : Ce code ne vient pas exclusivement de moi je l'ai pris sur internet (je crois sur ce forum) et je l'ai modifie




-
Edité par samuelcasasdray1 15 août 2018 à 13:58:15

Vous êtes demandeur d'emploi ?
Sans diplôme post-bac ?

Devenez Développeur web junior

Je postule
Formation
en ligne
Financée
à 100%
15 août 2018 à 15:28:05

Salut !

Les retours à la ligne ne sont pas codés de la même manière suivant les systèmes d'exploitation.

https://fr.wikipedia.org/wiki/Fin_de_ligne

Pour ne pas lire les valeurs des retours à la ligne, vérifie plutôt que ton caractère acsii est bien entre 48 et 57.

remplace la ligne 28 de ton Map.cpp par:

if(a>47 && a < 58)

Ca devrait marcher.

15 août 2018 à 16:01:01

Je ne peux pas faire sa puisque a est un valeur superieur a 48 (48 = 0 dans le fichier)
15 août 2018 à 16:45:09

Si tu peux, ou alors tu ne comprends pas ce que tu fais.

Tu as fait une autre erreur, c'est que tu continues d'avancer dans ta matrice même si le caractère lu est invalide. Du coup tout se décale. Cela fonctionne chez moi :

fichier.get(a);
while(a < 48 || a > 57)
{
    fichier.get(a);
}
m_array_map[i][j] = a - 48;



-
Edité par Umbre37 15 août 2018 à 16:45:44

15 août 2018 à 17:26:41

    if (fichier)
    {
        for (int i(0); i < NOMBRE_BLOCS_HAUTEUR; i++)
        {
            for (int j(0); j < NOMBRE_BLOCS_LARGEUR; j++)
            {
                fichier.get(a);
                std::cout << a << "|";
            }
        }
    }

Ton code marche super bien merci beaucoup mais pourquoi le code ci dessus m'affiche que des valeur comprise entre 48 et 51 (sans les /n) ?

De plus aurait tu eventuellement un code plus optimisé

-
Edité par samuelcasasdray1 15 août 2018 à 17:27:13

15 août 2018 à 18:22:16

Cela doit t'afficher des 0, 1, 2 pas des 48 49 50.

Ensuite niveau optimisation, tu dois changer la manière dont tu stockes tes données. Tu fais comment si tu as plus de 10 tiles différentes ?

Le pire du pire c'est que tu crées tous les sprites et tu calcules leurs positions sur la fenêtre et sur la texture à chaque frame ! C'est de la folie :) niveau optimisation.

Et pourquoi diable passer par une sf::Image pour charger ta texture ? Ca c'est un gaspillage énorme aussi.

-
Edité par Umbre37 15 août 2018 à 18:29:29

15 août 2018 à 18:53:16

D'accord je vais voir comment faire pour changer mais entre temps j'ai deja change le premier point que tu as dit c'est optimise de ce point de vue.

Autre question qui n'a pas de rapport avec les precedantes question : est ce qu'il existe des fenetre comme sa :

15 août 2018 à 19:40:48

Je ne sais pas. Avec Qt certainement. Tu peux aussi faire une GUI toi même avec la SFML. Mais c'est bcp de boulo, et quel serait l'intérêt... ?
16 août 2018 à 8:34:05

Salut,

Sous Windows, la fenêtre "Enregistrer sous" est standard :

http://fvirtman.free.fr/recueil/04_01_02_getopenfilename.c.php


Recueil de codes C et C++ : http://fvirtman.free.fr/recueil/index.html
16 août 2018 à 12:24:51

Salut,

Merci je vais tester ce que tu m'a dit ça me sauve car qt j'aime bien mais j'aurais preferer ne pas l'utiliser et surtout car il marche pas tres bien on m'a dit sous vs 2017 donc merci

[SFML] Tile mapping

× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
  • Editeur
  • Markdown