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

Auteur Sujet: [RESOLUT]Documentation-Tilemap undefine reference  (Lu 5269 fois)

0 Membres et 1 Invité sur ce sujet

Ariake

  • Newbie
  • *
  • Messages: 22
    • Voir le profil
    • E-mail
[RESOLUT]Documentation-Tilemap undefine reference
« le: Juillet 20, 2014, 03:53:22 pm »

Bonjour,

J'ai testé le code avec la classe TileMap de la documentation SFML :

http://www.sfml-dev.org/tutorials/2.1/graphics-vertex-array-fr.php#exemple-tile-map

Mais j’obtiens l’erreur : Undefined reference to "vtable for TileMap"

Après plusieurs recherche il semblerai que cela soit du au destructeur qui ne serait pas déclaré, mais alors quoi mettre ? :S (désolé, je suis encore novice...)

Merci par avance à la communauté !
« Modifié: Juillet 20, 2014, 09:15:35 pm par Ariake »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Documentation-Tilemap undefine reference
« Réponse #1 le: Juillet 20, 2014, 04:12:49 pm »
Est-ce que ton projet ou makefile contient bien le fichier dans lequel est implémenté la classe ?
Laurent Gomila - SFML developer

Ariake

  • Newbie
  • *
  • Messages: 22
    • Voir le profil
    • E-mail
Re : Documentation-Tilemap undefine reference
« Réponse #2 le: Juillet 20, 2014, 04:33:52 pm »
oui !

Voici pour l'affichage (render.cpp) :
#include <iostream>
#include <SFML/Graphics.hpp>
#include "render.hpp"
#include "tilemap.hpp"

void renderingThread(sf::RenderWindow* window)
{


    const int mapshow[] =
    {
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    };
    TileMap map;

    // la boucle de rendu
    while (window->isOpen())
    {
        window->clear(sf::Color::Black);
        if (!map.load("tileset1.png", sf::Vector2u(40, 40), mapshow, 32, 15))
            std::cout<<"Erreur durant le chargement du tileset"<<std::endl;
        window->draw(map);


        // fin de la frame
        window->display();
    }
}
 
Voici pour la classe (tilemap.cpp) :
#include <iostream>
#include <SFML/Graphics.hpp>
#include "tilemap.hpp"

class TileMap : public sf::Drawable, public sf::Transformable
{
    bool load(const std::string& tileset, sf::Vector2u tileSize, const int* 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];

                // 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;
    }

    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;
};


 

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Documentation-Tilemap undefine reference
« Réponse #3 le: Juillet 20, 2014, 04:46:00 pm »
Tu utilises quel OS, compilo et IDE ?
Laurent Gomila - SFML developer

Ariake

  • Newbie
  • *
  • Messages: 22
    • Voir le profil
    • E-mail
Re : Documentation-Tilemap undefine reference
« Réponse #4 le: Juillet 20, 2014, 04:47:24 pm »
Windows 8
Code Blocks
GNU GCC Compiler

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Documentation-Tilemap undefine reference
« Réponse #5 le: Juillet 20, 2014, 04:50:14 pm »
Can you post the contents of your project file (.cbp)?
Laurent Gomila - SFML developer

Ariake

  • Newbie
  • *
  • Messages: 22
    • Voir le profil
    • E-mail
Re : Documentation-Tilemap undefine reference
« Réponse #6 le: Juillet 20, 2014, 05:20:52 pm »
Voici !  ;)
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
        <FileVersion major="1" minor="6" />
        <Project>
                <Option title="Alearth" />
                <Option pch_mode="2" />
                <Option compiler="gcc" />
                <Build>
                        <Target title="Debug">
                                <Option output="bin/Debug/----" prefix_auto="1" extension_auto="1" />
                                <Option object_output="obj/Debug/" />
                                <Option type="0" />
                                <Option compiler="gcc" />
                                <Compiler>
                                        <Add option="-g" />
                                </Compiler>
                                <Linker>
                                        <Add library="C:\SFML-2.1\lib\libsfml-audio-s-d.a" />
                                        <Add library="C:\SFML-2.1\lib\libsfml-graphics-s-d.a" />
                                        <Add library="C:\SFML-2.1\lib\libsfml-window-s-d.a" />
                                        <Add library="C:\SFML-2.1\lib\libsfml-system-s-d.a" />
                                </Linker>
                        </Target>
                        <Target title="Release">
                                <Option output="bin/Release/----" prefix_auto="1" extension_auto="1" />
                                <Option object_output="obj/Release/" />
                                <Option type="0" />
                                <Option compiler="gcc" />
                                <Compiler>
                                        <Add option="-O2" />
                                </Compiler>
                                <Linker>
                                        <Add option="-s" />
                                        <Add library="C:\SFML-2.1\lib\libsfml-audio-s.a" />
                                        <Add library="C:\SFML-2.1\lib\libsfml-graphics-s.a" />
                                        <Add library="C:\SFML-2.1\lib\libsfml-window-s.a" />
                                        <Add library="C:\SFML-2.1\lib\libsfml-system-s.a" />
                                </Linker>
                        </Target>
                </Build>
                <Compiler>
                        <Add option="-Wall" />
                        <Add option="-DSFML_STATIC" />
                        <Add directory="C:/SFML-2.1/include" />
                </Compiler>
                <Linker>
                        <Add directory="C:/SFML-2.1/lib" />
                </Linker>
                <Unit filename="main.cpp" />
                <Unit filename="render.cpp" />
                <Unit filename="render.hpp" />
                <Unit filename="tilemap.cpp">
                        <Option target="&lt;{~None~}&gt;" />
                </Unit>
                <Unit filename="world.cpp">
                        <Option target="&lt;{~None~}&gt;" />
                </Unit>
                <Unit filename="world.hpp">
                        <Option target="&lt;{~None~}&gt;" />
                </Unit>
                <Extensions>
                        <code_completion />
                        <envvars />
                        <debugger />
                </Extensions>
        </Project>
</CodeBlocks_project_file>
 
« Modifié: Juillet 20, 2014, 06:05:48 pm par Ariake »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Documentation-Tilemap undefine reference
« Réponse #7 le: Juillet 20, 2014, 05:26:31 pm »
Pourquoi est-ce que tu redéfinis une classe Tilemap dans ton .cpp (j'imagine que tu le fais déjà dans le .hpp) ?
Laurent Gomila - SFML developer

Ariake

  • Newbie
  • *
  • Messages: 22
    • Voir le profil
    • E-mail
Re : Documentation-Tilemap undefine reference
« Réponse #8 le: Juillet 20, 2014, 05:38:12 pm »
AW ! Oups ! Désolé, effectivement c'est une erreur !
(je n'ai pas l'habitude encore des entêtes à cause du Python)
Voici mon nouveau .cpp : j'ai du faire une autre erreur dedans je pense !
#include <iostream>
#include <SFML/Graphics.hpp>
#include "tilemap.hpp"


bool TileMap::load(const std::string& tileset, sf::Vector2u tileSize, const int* 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];

            // 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;
}

virtual void TileMap::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);
}

 
mon .hpp :
#ifndef TILEMAP_HPP_INCLUDED
#define TILEMAP_HPP_INCLUDED

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

class TileMap : public sf::Drawable, public sf::Transformable
{
    public:
        bool load(const std::string& tileset, sf::Vector2u tileSize, const int* tiles, unsigned int width, unsigned int height);

    private:
        virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const;
        sf::VertexArray m_vertices;
        sf::Texture m_tileset;
};

#endif // TILEMAP_HPP_INCLUDED
 
« Modifié: Juillet 20, 2014, 05:39:46 pm par Ariake »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Documentation-Tilemap undefine reference
« Réponse #9 le: Juillet 20, 2014, 05:40:07 pm »
"virtual" ne doit être spécifié que pour la déclaration d'une fonction, pas pour sa définition. Ton code ne devrait même pas compiler.
Laurent Gomila - SFML developer

Ariake

  • Newbie
  • *
  • Messages: 22
    • Voir le profil
    • E-mail
Re : Documentation-Tilemap undefine reference
« Réponse #10 le: Juillet 20, 2014, 05:41:52 pm »
Très bien je prend note, merci pour ta patience :S
(toujours le même problème)
.cpp :
#include <iostream>
#include <SFML/Graphics.hpp>
#include "tilemap.hpp"


bool TileMap::load(const std::string& tileset, sf::Vector2u tileSize, const int* 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];

            // 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;
}

void TileMap::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);
}
 
« Modifié: Juillet 20, 2014, 05:45:09 pm par Ariake »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Documentation-Tilemap undefine reference
« Réponse #11 le: Juillet 20, 2014, 05:53:56 pm »
Fais un rebuild complet ("rebuild" ou "clean" + "build") pour être sûr.
Laurent Gomila - SFML developer

Ariake

  • Newbie
  • *
  • Messages: 22
    • Voir le profil
    • E-mail
Re : Documentation-Tilemap undefine reference
« Réponse #12 le: Juillet 20, 2014, 05:59:18 pm »
Rebuild fait.
Toujours le même problème.
Clean + Build fait.
Toujours le même problème.
||=== Build: Debug in ---- (compiler: GNU GCC Compiler) ===|
In function `Z15renderingThreadPN2sf12RenderWindowE':
undefined reference to `TileMap::load(std::string const&, sf::Vector2<unsigned int>, int const*, unsigned int, unsigned int)'
In function `ZN7TileMapC1Ev':
undefined reference to `vtable for TileMap'
undefined reference to `vtable for TileMap'
In function `ZN7TileMapD1Ev':
undefined reference to `vtable for TileMap'
undefined reference to `vtable for TileMap'
||=== Build failed: 5 error(s), 0 warning(s) (0 minute(s), 1 second(s)) ===|
 
« Modifié: Juillet 20, 2014, 06:05:05 pm par Ariake »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Documentation-Tilemap undefine reference
« Réponse #13 le: Juillet 20, 2014, 06:21:03 pm »
This thing looks strange in your project file:
<Option target="&lt;{~None~}&gt;" />

I don't know what it means. Any idea? (i.e. is there any specific option set for the Tilemap.cpp file?)
Laurent Gomila - SFML developer

Ariake

  • Newbie
  • *
  • Messages: 22
    • Voir le profil
    • E-mail
Re : Documentation-Tilemap undefine reference
« Réponse #14 le: Juillet 20, 2014, 06:23:27 pm »
No specific option has been set for the "tilemap.cpp"...
I will try to delete and re-create the file, and I will edit this post.

EDIT :

I recreate the files (tilemap2.cpp and tilemap2.hpp) but it still not work and the strange line is still here :
<Option target="&lt;{~None~}&gt;" />
« Modifié: Juillet 20, 2014, 07:10:14 pm par Ariake »

 

anything