Welcome, Guest. Please login or register. Did you miss your activation email?

Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - bisthebis

Pages: [1] 2
1
System / Re: How do std::thread and sf::thread compare ?
« on: February 01, 2016, 05:43:10 pm »
I see. My compiler supports C++11... except thread. I'll have a look at newer compilers.
BTW, I've never heard of SFML 3. How long has the team been working on it ?

2
System / How do std::thread and sf::thread compare ?
« on: February 01, 2016, 05:19:10 pm »
I've read that using std:thread is better than SFML Thread if they are availabe.
To me they aren't (MinGW doesn't support them).
Since I'm programming for myself, I guess I shouldn't get a headache to switch compiler, but I'd like to know how better std::thread are.
Are they more efficient ? (I guess not, since it looks like it's just system calls)
More flexible ?
More portable ? (Well, I guess not since that's fort portability that I don't use them :D)
Or is it juste because relying on STL is considered better ?

3
Graphics / Re: [OpenGL 4] Internal error with sf::texture
« on: December 15, 2015, 11:39:05 am »
It definitely looks like sf::Texture file-loading was causing the issue...
I've written my own Texture class (which DOES handle error, this time :D) and I still get the error when binding VAO. But if I delete the lines when I load a sf::Texture (which I don't use anyway, since I've made my own Texture class) the issue disappear.

4
Graphics / Re: [OpenGL 4] Internal error with sf::texture
« on: December 15, 2015, 10:31:51 am »
I just learned about glGetError yesterday. Looks like the tutorials I've been follwoing aren't doing enough work about error-handling.

5
Graphics / Re: [OpenGL 4] Internal error with sf::texture
« on: December 14, 2015, 07:41:33 pm »
Maybe I should indeed test more my code... When everything works fine I tend to forget security  ;D
Is there an other way to check these errors withou pasting sfml code ?
I've found (by spammin sf::Texture::bind(NULL) wherever there could be an error in the previous line), and I found out that the problem came by using glBindVertexArray... But I don't get what error it could be, because there's no problem in the VAO creation tested by sf::Texture::bind(NULL) spamming) neither just after...
Only the first time I bind it to use it do I get an error.
Any tips ? (I'm gonna look for VAO related things)
Quote
On a side note, if you are using an OpenGL 3.2+ context and have the core profile bit set, you will not be able to use any sfml-graphics objects (Texture, Shader, etc.) in your code. They rely on legacy functions which have been removed in the core profile.

So you'd suggest me to create my own texture wrapper instead of using sf::Texture::bind() ?

6
Graphics / [OpenGL 4] Internal error with sf::texture
« on: December 14, 2015, 05:51:31 pm »
Quote
An Internal OpenGL call failed in Textures.cpp (the SFML one) (524) : GL_INVALID OPERATION, the specified operation is not allowed in the current state.
In SFML Source Code, line 524 (is this the line number in the error ?) it's about a function testing whether texture is repeated or not. It doesn't matter if I make the texture repeatable or not.
My main code :
///creating window and stuff like that
///.....
Model cube("Shaders/texture.vert", "Shaders/texture.frag", "cube.obj");
sf::Texture texture;
    texture.loadFromFile("grass.jpg");
    texture.setRepeated(true);

///... loading other things

///Main loop

///Rendering part of the loop :

while(running)
{
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        cube.display(projection, modelview, &texture);
     
        window.display();

}


 

cube displaying method :
void Model::display(glm::mat4 const &projection, glm::mat4 const &modelview, sf::Texture *text)
{
        glUseProgram(m_shader.getProgramID());


            glBindVertexArray(m_VAO);

                glUniformMatrix4fv(glGetUniformLocation(m_shader.getProgramID(), "projection"), 1, GL_FALSE, value_ptr(projection));
                glUniformMatrix4fv(glGetUniformLocation(m_shader.getProgramID(), "modelview"), 1, GL_FALSE, value_ptr(modelview));


                sf::Texture::bind(text);
                glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
                glDrawArrays(GL_TRIANGLES, 0, 36);
                sf::Texture::bind(NULL);


            glBindVertexArray(0);



        glUseProgram(0);
}
 


It does run perfectly (even repeating textures work if I enable them)... But I get an error in console, and I have no idea why...

If I bind the texture in main function (before calling display() and relasing just after), it yeld exactly the same result as expected, but my error is in line 560 instead of 524 (in source code, 560 is the end of the bind function though)


If you want to check sourcecode of texture .cpp of GitHub :
(click to show/hide)


Maybe a comaptibility between modern and old OpenGL ? Maybe I should use sf::Image to load textures and create my own OpenGL Texture instead of binding with sf::Texture ? (Is this deprecated ? Have I done something wrong ?)
The strangest thing is that my program runs perfectly with this though.

7
SFML projects / Re: Space Invaders Clone
« on: August 21, 2015, 02:14:57 pm »
That's nice. I've dowloaded it :)

8
Graphics / Re: Blinking screen when using massive view.move ?
« on: August 13, 2015, 12:20:26 pm »
That was this, thanks :)
The next time I'll try do provide a real minimal+functional code  :D
And I'll look into static_cast for the future !

9
Graphics / Re: Blinking screen when using massive view.move ?
« on: August 13, 2015, 09:36:43 am »
In fact I have no idea of how to educe it more...

10
Graphics / Re: Blinking screen when using massive view.move ?
« on: August 12, 2015, 09:12:19 pm »
I haven't worked on this for 2 days, so here's a cleaned code of how I left it.
I'm almost sure the problem resides in the main file, so other fils are here in case you want to test

Main :
#include <SFML/Graphics.hpp>
#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include "BackgroundTileMap.h"
#include <fstream>
#include <iostream>
#include <string>

int const TILESIZE = 32;


int main()
{



    sf::RenderWindow window(sf::VideoMode(320, 320), "Tilemap");
    sf::RenderWindow referencePic(sf::VideoMode(512, 512), "Tilemap", sf::Style::Titlebar); //Not tied to our problem, it's a secondary windows
    //window.setVerticalSyncEnabled(true); Didn't solve the probleme in any way so we don't care : I got rid of it
    window.setFramerateLimit(60);
    sf::View view(sf::FloatRect(0, 0, 160, 160));
    view.setViewport(sf::FloatRect(0, 0, 1, 1));
    std::string fileoutputname;
    // on définit le niveau à l'aide de numéro de tuiles
    const int level[] =
    {
        0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0,
        1, 1, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3,
        0, 1, 0, 0, 2, 0, 3, 3, 3, 0, 1, 1, 1, 0, 0, 0,
        0, 1, 1, 0, 3, 3, 3, 0, 0, 0, 1, 1, 1, 2, 0, 0,
        0, 0, 1, 0, 3, 0, 2, 2, 0, 0, 1, 1, 1, 1, 2, 0,
        2, 0, 1, 0, 3, 0, 2, 2, 2, 0, 1, 1, 1, 1, 1, 1,
        0, 0, 1, 0, 3, 2, 2, 2, 0, 0, 0, 0, 1, 1, 1, 1,
    };

    // on crée la tilemap avec le niveau précédemment défini
    BackgroundTileMap map;
    if (!map.load("tileset_castle.png", sf::Vector2u(TILESIZE, TILESIZE), level, 16, 8))
        return -1;

    map.setRefWindow(&referencePic);
    referencePic.setSize(sf::Vector2u(512,512));
    referencePic.setTitle("Reference");




    int newvalue;
    int valueToApply = -1;
    int brushSize = 1;
     sf::Vector2i pixelPos;
     sf::Vector2f worldPos;
     sf::Vector2f wheelPos, wheelPos2;
    bool wheelPressed = false;

    // Main events handling
    while (window.isOpen() || referencePic.isOpen())
    {
        // on gère les évènements
        sf::Event event;
        while (window.pollEvent(event))
        {

                switch(event.type)
                {
                    case sf::Event::Closed:
                        window.close();
                        referencePic.close();
                        break;
                    case sf::Event::MouseButtonPressed:
                        pixelPos = sf::Mouse::getPosition(window);

                        worldPos = window.mapPixelToCoords(pixelPos);
                        worldPos.x /= TILESIZE;
                        worldPos.y /= TILESIZE;
                        newvalue = 1;
                        if (event.mouseButton.button == sf::Mouse::Right)
                            newvalue = -1;
                        if (event.mouseButton.button == sf::Mouse::Right || event.mouseButton.button == sf::Mouse::Left)
                        {
                            if (brushSize == 1)
                            {


                                if (valueToApply == -1)
                                map.changeTile((int)worldPos.x + (int)worldPos.y*map.getDimensions().x, newvalue);
                                else
                                map.changeTile((int)worldPos.x + (int)worldPos.y*map.getDimensions().x, valueToApply, false);
                                std::cout << "X : " << (int)worldPos.x << ". Y : " << (int)worldPos.y << std::endl;
                            }
                            else
                            {
                                 for (int i = -brushSize +1 ; i < brushSize; i++)
                                    for (int j = -brushSize +1; j < brushSize; j++)
                                        {
                                            if(map.getDimensions().x * j + i > 0)
                                            {
                                                if (valueToApply == -1)
                                                map.changeTile((int)(worldPos.x + j) + (int)(worldPos.y+i)*map.getDimensions().x, newvalue);
                                                else
                                                map.changeTile((int)(worldPos.x + j) + (int)(worldPos.y+i)*map.getDimensions().x, valueToApply, false);
                                                std::cout << "X : " << (int)worldPos.x << ". Y : " << (int)worldPos.y << std::endl;

                                            }

                                        }
                            }



                            /*


                            //*/

                        }
                        else if (event.mouseButton.button == sf::Mouse::Middle)
                            {
                            wheelPos = window.mapPixelToCoords(sf::Mouse::getPosition(window));

                            wheelPressed = true;
                            }
                        break;

                    case sf::Event::MouseMoved:
                        if (wheelPressed)
                        {
                            wheelPos2 = window.mapPixelToCoords(sf::Mouse::getPosition(window));
                            wheelPos2.x = (int)(wheelPos.x - wheelPos2.x);
                            wheelPos2.y = (int)(wheelPos.y - wheelPos2.y);
                            view.move((float)wheelPos2.x, (float)wheelPos2.y);
                            std:: cout << (float)wheelPos2.x << "x" << (float)wheelPos2.y << std::endl;
                            wheelPos = window.mapPixelToCoords(sf::Mouse::getPosition(window));
                        }



                        break;


                    case sf::Event::MouseButtonReleased:
                        if (wheelPressed && event.mouseButton.button == sf::Mouse::Middle)
                        wheelPressed = false;
                        break;

                    case sf::Event::KeyPressed:
                        if (event.key.code == sf::Keyboard::Subtract)
                            view.zoom(2.6);
                        else if (event.key.code == sf::Keyboard::Add)
                            view.zoom(0.38);
                        else if (event.key.code == sf::Keyboard::T)
                        {
                            pixelPos = sf::Mouse::getPosition(referencePic);
                            valueToApply = (int)(pixelPos.x / TILESIZE) + (int)(pixelPos.y / TILESIZE) * 16;
                            std::cout << valueToApply ;
                        }
                        else if (event.key.code == sf::Keyboard::Left)
                        {
                            view.move(-TILESIZE,0);
                        }
                        else if (event.key.code == sf::Keyboard::Right)
                        {
                            view.move(TILESIZE,0);
                        }
                        else if (event.key.code == sf::Keyboard::Up)
                        {
                            view.move(0,-TILESIZE);
                        }
                        else if (event.key.code == sf::Keyboard::Down)
                        {
                            view.move(0,TILESIZE);
                        }



                        break;

                    case sf::Event::MouseWheelScrolled:
                        if (event.mouseWheelScroll.delta < 0)
                            view.zoom(2.6);
                        else if (event.mouseWheelScroll.delta > 0)
                            view.zoom(0.38);
                        break;

                    default:
                        break;
                }



                //"Boucle" secondaire
                referencePic.pollEvent(event);
                    switch (event.type)
                    {
                        case sf::Event::Closed:
                            referencePic.close();
                            break;

                    }


        }

        // on dessine le niveau
        window.clear();
        referencePic.clear();
        //Arrondi de la vue
        sf::Vector2f viewPos;
        viewPos = view.getCenter();
        viewPos.x = (int)viewPos.x;
        viewPos.y = (int)viewPos.y;
        view.setCenter(viewPos);
        window.setView(view);
        window.draw(map);





        referencePic.display();
        window.display();
    }

    return 0;
}

 

BackgroundTileMap.h
#ifndef BACKGROUNDTILEMAP_H
#define BACKGROUNDTILEMAP_H

#include <SFML/Graphics.hpp>
#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include <iostream>
#include <string>
#include <sstream>


class BackgroundTileMap : public sf::Drawable, public sf::Transformable
{
    public:
    //tmp
    //*
     std::string WriteLevel() const
    {
        std::string retour = "";
        for (int i = 0; i < m_level.size(); i++)
        {
            //retour += (m_level[i]+'0');
            //retour += std::string(m_level[i]);

                std::stringstream ss;
                ss << m_level[i];
                std::string str = ss.str();
            retour += str;
            retour += " ";
            if ((i+1)%m_dimensions.x == 0)
                retour+= "\r\n";




        }
        return retour;

    }
    bool WriteToFile(std::string const &filename);
    const sf::Vector2u &getDimensions() const {return m_dimensions;}
    const int getSize() const {return m_dimensions.x*m_dimensions.y;}
    bool load(const std::string& tileset, sf::Vector2u tileSize, const int* tiles, unsigned int width, unsigned int height);


    bool setTexture(const std::string& texture) {


         if (!m_tileset.loadFromFile(texture))
         {  //Modification de la seconde fenetre
            /*
            if (secWindow != NULL)
            {
                sf::Sprite text(m_tileset);
                secWindow->draw(text);
            }
            //*/



             return false;
             }

            else return true;


                                                    }
    bool loadNewMap(std::string const &filename); //fichier texte

    bool changeTile(int tileNumber, int newvalue, bool addMode = true); //Si true, on met le tile suivant, si false, on change en valeur absolue

    bool update();//Sans changer les valeurs

    void CreateBlankMap(int newx, int newy);

    void setRefWindow (sf::RenderWindow *new_window) {m_window = new_window;}


private:

    sf::RenderWindow *m_window;

    //attributs primaires
    sf::VertexArray m_vertices;
    sf::Texture m_tileset;
    //attributs secondaires:
    sf::Vector2u m_tileSize; //dimensions d'un Tile
    sf::Vector2u m_dimensions; //Du tileset, en nombre de tiles (ex : 16*8)
    std::vector<int> m_level;  //contient les numéros d'un tile
    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);

        //if(m_window->isOpen())
        m_window->draw(sf::Sprite(m_tileset));
    }

};




#endif // BACKGROUNDTILEMAP_H
 

And finally BackGroundTileMap.cpp
#include "BackgroundTileMap.h"
#include <fstream>

bool BackgroundTileMap::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;

        //Changement des "attributs secondaires"
        m_tileSize = tileSize;
        m_dimensions.x = width;
        m_dimensions.y = height;

        m_level.resize(width*height);

        for (int i = 0; i < m_level.size(); i++)
        {
            m_level[i] = tiles[i];
        }

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

bool BackgroundTileMap::loadNewMap(std::string const &filename)
{
    //ouverture du fichier (avec la librairie standard)
        std::ifstream file(filename.c_str());
        if(!file.is_open())
            return false;
            std::string line;
            //trois étapes : trouver la longuer, la largeur, les valeurs
            int step = 0;
            int value = 0;
            m_dimensions.x=0;
            m_dimensions.y=0;
            m_level.resize(0);
            while(step == 0)
            {
                std::getline(file, line);
                if ( ! (std::istringstream(line) >> m_dimensions.x) ) return false;
                //std::cout << "largeur "<<m_dimensions.x << std::endl;
                if (m_dimensions.x > 0)
                    step++;

            }
            while(step == 1)
            {
                std::getline(file, line);
                if ( ! (std::istringstream(line) >> m_dimensions.y) ) return false;
                //std::cout << "hauteur "<< m_dimensions.y << std::endl;
                if (m_dimensions.y > 0)
                    step++;

            }
            file.ignore();
            while(step == 2)
            {
                char a;
                file.get(a);
                if (a == ':')
                {
                    step++;

                }

            }
            file.ignore();
            while(m_level.size() < m_dimensions.y * m_dimensions.x)
            {
                file >> line;
                if ( ! (std::istringstream(line) >> value) ) return false;
                m_level.push_back(value);
            }

        file.close();
        //std::cout << "fini !";

        //suite
        //Changement des "attributs secondaires"

        //*
       // m_tileSize = tileSize; //Déjà assigné : dans l'autre sens
        sf::Vector2u tileSize = m_tileSize;
    //m_dimensions.x = width;   //ci-dessus
       // m_dimensions.y = height;


       int width = m_dimensions.x;
       int height = m_dimensions.y;

        if (m_level.size()!=width*height)
            return false;
        //for (int i = 0; i < m_level.size(); i++)
        //{
        //    m_level[i] = tiles[i];
        //}

        // on redimensionne le tableau de vertex pour qu'il puisse contenir tout le niveau
        //m_vertices.setPrimitiveType(sf::Quads); Pas besoin car déjà chargé
        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 = m_level[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;
}


bool BackgroundTileMap::changeTile(int tileNumber, int newvalue, bool addMode)
{
    if (addMode)
        m_level[tileNumber] += newvalue;
    else
        m_level[tileNumber] = newvalue;

        //std::cout << m_level[tileNumber];

    return update();
/*
    int width = m_dimensions.x;
    int height = m_dimensions.y;
    //int j = tileNumber%width;
    //int i = tileNumber-(j*width); //x


                // on en déduit sa position dans la texture du tileset
                int tu = tileNumber % (m_tileset.getSize().x / m_tileSize.x);
                int tv = tileNumber / (m_tileset.getSize().x /  m_tileSize.x);

                // on récupère un pointeur vers le quad à définir dans le tableau de vertex
                sf::Vertex* quad = &m_vertices[(tileNumber) * 4];

                // on définit ses quatre coins
                /* // La position ne change pas !
                quad[0].position = sf::Vector2f(i * m_tileSize.x, j * m_tileSize.y);
                quad[1].position = sf::Vector2f((i + 1) * m_tileSize.x, j * m_tileSize.y);
                quad[2].position = sf::Vector2f((i + 1) * m_tileSize.x, (j + 1) * m_tileSize.y);
                quad[3].position = sf::Vector2f(i * m_tileSize.x, (j + 1) * m_tileSize.y);
                //*/

                // on définit ses quatre coordonnées de texture
                /* // défaillant
                m_vertices[tileNumber*4].texCoords = sf::Vector2f(tu * m_tileSize.x, tv * m_tileSize.y);
                m_vertices[tileNumber*4+1].texCoords = sf::Vector2f((tu + 1) * m_tileSize.x, tv * m_tileSize.y);
                m_vertices[tileNumber*4+2].texCoords = sf::Vector2f((tu + 1) * m_tileSize.x, (tv + 1) * m_tileSize.y);
                m_vertices[tileNumber*4+3].texCoords = sf::Vector2f(tu * m_tileSize.x, (tv + 1) * m_tileSize.y);
                //*/

                /* BACKUP
                quad[0].texCoords = sf::Vector2f(tu * m_tileSize.x, tv * m_tileSize.y);
                quad[1].texCoords = sf::Vector2f((tu + 1) * m_tileSize.x, tv * m_tileSize.y);
                quad[2].texCoords = sf::Vector2f((tu + 1) * m_tileSize.x, (tv + 1) * m_tileSize.y);
                quad[3].texCoords = sf::Vector2f(tu * m_tileSize.x, (tv + 1) * m_tileSize.y);

                //*/

                /*/ TEST 0
                quad[0].texCoords = sf::Vector2f(0,0);
                quad[1].texCoords = sf::Vector2f(31,0);
                quad[2].texCoords = sf::Vector2f(31,31);
                quad[3].texCoords = sf::Vector2f(0,31);
                //*/


                //*/

    return true;



}


bool BackgroundTileMap::update()
{


   // on remplit le tableau de vertex, avec un quad par tuile
        for (unsigned int i = 0; i < m_dimensions.x; ++i)
            for (unsigned int j = 0; j < m_dimensions.y; ++j)
            {
                // on récupère le numéro de tuile courant
                int tileNumber = m_level[i + j * m_dimensions.x];

                // on en déduit sa position dans la texture du tileset
                int tu = tileNumber % (m_tileset.getSize().x / m_tileSize.x);
                int tv = tileNumber / (m_tileset.getSize().x / m_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 * m_dimensions.x) * 4];

                // on définit ses quatre coins
                quad[0].position = sf::Vector2f(i * m_tileSize.x, j * m_tileSize.y);
                quad[1].position = sf::Vector2f((i + 1) * m_tileSize.x, j * m_tileSize.y);
                quad[2].position = sf::Vector2f((i + 1) * m_tileSize.x, (j + 1) * m_tileSize.y);
                quad[3].position = sf::Vector2f(i * m_tileSize.x, (j + 1) * m_tileSize.y);

                // on définit ses quatre coordonnées de texture
                quad[0].texCoords = sf::Vector2f(tu * m_tileSize.x, tv * m_tileSize.y);
                quad[1].texCoords = sf::Vector2f((tu + 1) * m_tileSize.x, tv * m_tileSize.y);
                quad[2].texCoords = sf::Vector2f((tu + 1) * m_tileSize.x, (tv + 1) * m_tileSize.y);
                quad[3].texCoords = sf::Vector2f(tu * m_tileSize.x, (tv + 1) * m_tileSize.y);
            }
        //*/
        return true;
}



bool BackgroundTileMap::WriteToFile(std::string const &filename)
{
    std::ofstream outputFile;
    outputFile.open(filename.c_str());


    outputFile << m_dimensions.x << std::endl << m_dimensions.y << std::endl << std::endl << ":" << std::endl;
    for (int i = 0; i < m_level.size(); i++)
    {
        outputFile << m_level[i] << " ";
    }
}


void BackgroundTileMap::CreateBlankMap(int newx, int newy)
{


        m_dimensions.x = newx;
        m_dimensions.y = newy;

        m_level.resize(newx*newy);

        for (int i = 0; i < m_level.size(); i++)
        {
            m_level[i] = 0;
        }

        // on redimensionne le tableau de vertex pour qu'il puisse contenir tout le niveau
        m_vertices.setPrimitiveType(sf::Quads);
        m_vertices.resize(newx * newy * 4);

        // on remplit le tableau de vertex, avec un quad par tuile
        for (unsigned int i = 0; i < newx; ++i)
            for (unsigned int j = 0; j < newy; ++j)
            {
                // on récupère le numéro de tuile courant
                int tileNumber = m_level[i + j * newx];

                // on en déduit sa position dans la texture du tileset
                int tu = tileNumber % (m_tileset.getSize().x / m_tileSize.x);
                int tv = tileNumber / (m_tileset.getSize().x / m_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 * newx) * 4];

                // on définit ses quatre coins
                quad[0].position = sf::Vector2f(i * m_tileSize.x, j * m_tileSize.y);
                quad[1].position = sf::Vector2f((i + 1) * m_tileSize.x, j * m_tileSize.y);
                quad[2].position = sf::Vector2f((i + 1) * m_tileSize.x, (j + 1) * m_tileSize.y);
                quad[3].position = sf::Vector2f(i * m_tileSize.x, (j + 1) * m_tileSize.y);

                // on définit ses quatre coordonnées de texture
                quad[0].texCoords = sf::Vector2f(0,0);
                quad[1].texCoords = sf::Vector2f(31,0);
                quad[2].texCoords = sf::Vector2f(31,31);
                quad[3].texCoords = sf::Vector2f(0,31);
            }



        }
 

11
Graphics / Re: Blinking screen when using massive view.move ?
« on: August 11, 2015, 08:53:18 am »
I see what you mean here, I'll try it.
AFAIK, my 1st post has all the required code (excepted {} in 2nd line) but I might give more.
i'away for two days though  :(

12
Graphics / Re: Blinking screen when using massive view.move ?
« on: August 10, 2015, 10:28:48 pm »
It looked like a nice idea, but the fact is that I get the problem even without zoom. (I did try with floating values too though)

13
Graphics / Re: Blinking screen when using massive view.move ?
« on: August 10, 2015, 07:13:40 pm »
I'm not sure to understand the problem with mixing events and realtime  :-[
I forgot using window as paramter, bu as you point it, it doesn't matter in this case (did the tests)

14
Graphics / Re: Blinking screen when using massive view.move ?
« on: August 10, 2015, 06:55:21 pm »
A video is better than any words :
https://www.youtube.com/watch?v=5--jNIfkPK4&feature=youtu.be
Look at 0:06 for example.

IIRC it is better now with rounded values (float to int, then this int to float) but it's still there, only a bit less visible

15
Graphics / Re: Blinking screen when using massive view.move ?
« on: August 10, 2015, 10:23:37 am »
I feel stupid to have missed the {}, thanks.
I've tried rounding down the position (both by using an round move and ensuring final position is round) but it did'nt work.

Pages: [1] 2