SFML community forums

Help => Graphics => Topic started by: timrik on October 26, 2015, 11:11:41 pm

Title: Problems with Sprite and Textures
Post by: timrik on October 26, 2015, 11:11:41 pm
Sorry for my english and my bad code, it is my first game with SFML. I am creating game like bomberman. Instead by pressing the space bar to display the dynamite, it displays a white square. I checked the name of the file 100 times. And if I create an object of class dynamite separately in maine.cpp, then everything is fine displays.when I try to portray as one of the elements of a vector, which is a field of a class player, displays white square. Plz help =)
main.cpp
 
#include <SFML/Graphics.hpp>
#include <cmath>
#include <iostream>
#include <vector>
//#include <iterator>
#include <conio.h>
#include "map.h"
#include "dinamite.h"
#include "enity.h"
 
using namespace sf;
using namespace std;
 
class Player : public Enity
{
public:
    float dx, dy, speed;
    int dir;
    int bomb_count;
    int planted_bomb_count;
    vector<Dinamite> dinamite;
 
    Player(String F, float X, float Y, float W, float H) : Enity(F, X, Y, W, H)
    {
        dir = 0;
        speed = 0;
        bomb_count = 1;
        planted_bomb_count = 0;
        sprite.setTextureRect(IntRect(15, 16, w, h));
        dinamite.push_back(Dinamite("dinamite.png", 0, 0, 48, 48));
    }
 
    void update(float time)
    {
        switch (dir)
        {
            case 0: dx = speed; dy = 0;   break;
            case 1: dx = -speed; dy = 0;   break;
            case 2: dx = 0; dy = speed;   break;
            case 3: dx = 0; dy = -speed;   break;
        }
 
        x += dx*time;
        y += dy*time;
 
        speed = 0;
        sprite.setPosition(x, y);
        interactionWithMap();
    }
 
    void interactionWithMap()
    {
 
        for (int i = y / 48; i < (y + h) / 48; i++)
        for (int j = x / 48; j<(x + w) / 48; j++)
        {
            if (TileMap[i][j] == '0')
            {
                if (dy>0)
                    y = i * 48 - h;
                if (dy<0)
                    y = i * 48 + 48;
                if (dx>0)
                    x = j * 48 - w;
                if (dx < 0)
                    x = j * 48 + 48;
            }
 
            if (TileMap[i][j] == 'v')
            {
                TileMap[i][j] = ' ';
                incBombCount();
            }
        }
    }
 
    void incBombCount()
    {
        bomb_count++;
        dinamite.push_back(Dinamite("dinamite.png", 0, 0, 48, 48));
    }
 
};
 
int main()
{
 
    randomBlockGenerate();
 
    RenderWindow window(VideoMode(624, 624), "Explosion");
 
    Player p("robot_white.png", 49, 49, 38, 40);
 
    /*Texture dinamite_texture;
    dinamite_texture.loadFromFile("images/dinamite.png");
 
    Sprite dinamite_sprite;
    dinamite_sprite.setTexture(dinamite_texture);*/

 
    Image map_image;
    map_image.loadFromFile("images/map1.png");
 
    Texture map_texture;
    map_texture.loadFromImage(map_image);
 
    Sprite map_sprite;
    map_sprite.setTexture(map_texture);
 
    double x, y = 0;
 
    float CurrentFrame = 0;
    Clock clock;
 
    while (window.isOpen())
    {
        float time = clock.getElapsedTime().asMicroseconds();
        clock.restart();
        time = time / 800;
 
        if (p.planted_bomb_count != 0)
            for (int i = 0; i < p.bomb_count; i++)
            {
                if (p.dinamite[i].planted)
                    p.dinamite[i].work_time = p.dinamite[i].clock.getElapsedTime().asMilliseconds();
            }
 
        Event event;
        while (window.pollEvent(event))
        {
            if (event.type == Event::Closed)
                window.close();
            if (event.type == Event::KeyReleased)
            if ((event.key.code == Keyboard::Space) && (p.planted_bomb_count != p.bomb_count))
            {
                for (int i = 0; i < p.bomb_count; i++)
                {
                    if (p.dinamite[i].work_time == 0)
                    {
                        x = int(round(p.x / 48)) * 48;
                        y = int(round(p.y / 48)) * 48;
                        p.dinamite[i].sprite.setPosition(x, y);
                        p.dinamite[i].clock.restart();
                        p.dinamite[i].planted = true;
                        p.planted_bomb_count++;
                        break;
                    }
                }
            }
        }
 
 
        for (int i = 0; i < HEIGHT_MAP; i++)
            for (int j = 0; j < WIDTH_MAP; j++)
            {
                if (TileMap[i][j] == ' ') map_sprite.setTextureRect(IntRect(0, 0, 48, 48));
                if (TileMap[i][j] == '0') map_sprite.setTextureRect(IntRect(48, 0, 48, 48));
                if (TileMap[i][j] == 's') map_sprite.setTextureRect(IntRect(96, 0, 48, 48));
                if (TileMap[i][j] == 'v') map_sprite.setTextureRect(IntRect(144, 0, 48, 48));
                map_sprite.setPosition(j * 48, i * 48);
                window.draw(map_sprite);
            }
 
           
            if (Keyboard::isKeyPressed(Keyboard::Left))
            {
                p.dir = 1; p.speed = 0.1;
                CurrentFrame += 0.005*time;
                if (CurrentFrame > 4) CurrentFrame -= 4;
                p.sprite.setTextureRect(IntRect(15 + 59 * int(CurrentFrame), 74, 38, 40));
            }
 
            if (Keyboard::isKeyPressed(Keyboard::Right))
            {
                p.dir = 0; p.speed = 0.1;
                CurrentFrame += 0.005*time;
                if (CurrentFrame > 4) CurrentFrame -= 4;
                p.sprite.setTextureRect(IntRect(15 + 59 * int(CurrentFrame), 133, 38, 40));
            }
 
            if (Keyboard::isKeyPressed(Keyboard::Up))
            {
                p.dir = 3; p.speed = 0.1;
                CurrentFrame += 0.005*time;
                if (CurrentFrame > 4) CurrentFrame -= 4;
                p.sprite.setTextureRect(IntRect(15 + 59 * int(CurrentFrame), 192, 38, 40));
 
            }
 
            if (Keyboard::isKeyPressed(Keyboard::Down))
            {
                p.dir = 2; p.speed = 0.1;
                CurrentFrame += 0.005*time;
                if (CurrentFrame > 4) CurrentFrame -= 4;
                p.sprite.setTextureRect(IntRect(15 + 59 * int(CurrentFrame), 15, 38, 40));
 
            }
 
            for (int i = 0; i < p.bomb_count; i++)
            {
 
                if (p.dinamite[i].planted)
                {
                    if (p.dinamite[i].work_time < 3000)
                    {      
                        window.draw(p.dinamite[i].sprite);
                    }
                    else
                    {
                        p.dinamite[i].planted = false;
                        p.dinamite[i].work_time = 0;
                        p.dinamite[i].clock.restart();
                        p.planted_bomb_count--;
                    }
                }
            }
 
 
        p.update(time);
 
        window.draw(p.sprite);
        window.display();
    }
 
    return 0;
}
 
dinamite.h
 
#ifndef DINAMITE_H
#define DINAMITE_H
 
#include <SFML/Graphics.hpp>
#include "enity.h"
 
class Dinamite : public Enity
{
public:
    Clock clock;
    int work_time;
    bool planted;
    Dinamite(String F, float X, float Y, float W, float H) : Enity(F, X, Y, W, H)
    {
        sprite.setTextureRect(IntRect(0, 0, w, h));
        work_time = 0;
        planted = false;
    }
};
 
#endif DINAMITE_H
 
enity.h
 
#ifndef ENITY_H
#define ENITY_H
 
#include <SFML/Graphics.hpp>
 
using namespace sf;
 
class Enity
{
public:
    float x, y, w, h;
    Image image;
    Texture texture;
    Sprite sprite;
    String file;
 
    Enity(String F, float X, float Y, float W, float H)
    {
        file = F;
        x = X; y = Y;
        w = W; h = H;
        image.loadFromFile("images/" + file);
        texture.loadFromImage(image);
        sprite.setTexture(texture);
    }
};
 
#endif ENITY_H
 
 map.h not needed

Title: Re: Problems with Sprite and Textures
Post by: DarkRoku12 on October 27, 2015, 12:25:51 am
Ensure that the texture of the dinamite is valid on the moment that the sprite is displayed.
Ensure that the textureRect's coordinates are the dinamite and not a white part of the texture.
You can make a test without custom classes (only use SFML classes) and when all is working gently ( little by little) insert custom classes.

I mentaly cannot debug 2 sheets of code.


If you speak spanish i can provide help with the project using sfml private messages.
Title: Re: Problems with Sprite and Textures
Post by: zsbzsb on October 27, 2015, 02:47:23 am
I will let others comment on other issues with the code... but your problem is because std::vector<T> copies elements when it resizes. So your enity is copied (including the texture) but the sprite still has the pointer to the old texture location which no longer exists after the copy.
Title: Re: Problems with Sprite and Textures
Post by: timrik on October 27, 2015, 07:32:31 pm
Thanks guys!
zsbzsb, could you plz show me how to correct my code and how to create copy constructor plz?
Title: Re: Problems with Sprite and Textures
Post by: Jesper Juhl on October 27, 2015, 07:36:39 pm
Maybe also see http://en.sfml-dev.org/forums/index.php?topic=19148.msg138817#msg138817 and related posts..
Title: Re: Problems with Sprite and Textures
Post by: Mr_Blame on October 29, 2015, 03:21:25 pm
also it is too hard to be minimal code ;)