2013-06-04 87 views
3

我想创建一个循环在屏幕上绘制10块,但没有显示。我没有错误,所以我认为这个矢量并没有存储精灵。我是SFML的新手,所以我不知道自己做错了什么。SFML 2.0 - 绘制与精灵矢量

sf::Texture bTexture; 
sf::Texture bloqueTexture; 
sf::Sprite bloqueSprite; 

//create vector of blocks 
std::vector<sf::Sprite> bricks(10, sf::Sprite(bloqueTexture)); 

fondo.setTexture(img_mgr.getImage("fondo.jpg")); 
personaje.setTexture(img_mgr.getImage("jumper.png")); 
personaje.setPosition(100,POSICION_TERRENO_Y); 
bloqueSprite.setTexture(img_mgr.getImage("bloque.png")); 
bloqueTexture.loadFromFile("Recursos/imagenes/bloque.png"); 

//Fill the vector with the texture 
for (int i = 0; i < bricks.size(); i++) 
{ 
    bricks[i].setTexture(bloqueTexture); 
    bricks[i].setPosition(100 + (i * 45) , 320); 
    window.draw(bricks[i]); 
} 

回答

2

第二编辑与最终回答:如果你想显示png与SFML文件,保存他们8位。

编辑:我在第二个代码一些不好的复制/粘贴,我固定它

至于SFML为多媒体应用(主要是游戏)制成,你需要刷新和借鉴筛选多次按秒(即frames)。话虽如此,基本的方法是有一个主循环做3件事:处理输入,更新你的游戏逻辑,然后绘制。

请参阅从SFML网站上的经典例子:

#include <SFML/Graphics.hpp> 

int main() 
{ 
    sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!"); 
    sf::CircleShape shape(100.f); 
    shape.setFillColor(sf::Color::Green); 

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

     window.clear(); 
     window.draw(shape); 
     window.display(); 
    } 

    return 0; 
} 

你的纹理加载和填充矢量必须完成主循环之前,然后之间window.clear()window.display你需要画出你想要显示的一切(你的块)。

你最终可能会是这样的:(!bloqueTexture.loadFromFile( “RECURSOS/imagenes/bloque.png”))

#include <SFML/Graphics.hpp> 

int main() 
{ 
    sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!"); 

    sf::Texture bTexture; 
    sf::Texture bloqueTexture; 
    sf::Sprite bloqueSprite; 

    //create vector of blocks 
    std::vector<sf::Sprite> bricks(10, sf::Sprite(bloqueTexture)); 

    fondo.setTexture(img_mgr.getImage("fondo.jpg")); 
    personaje.setTexture(img_mgr.getImage("jumper.png")); 
    personaje.setPosition(100,POSICION_TERRENO_Y); 
    bloqueSprite.setTexture(img_mgr.getImage("bloque.png")); 
    bloqueTexture.loadFromFile("Recursos/imagenes/bloque.png"); 

    for (int i = 0; i < bricks.size(); i++) 
    { 
     bricks[i].setTexture(bloqueTexture); 
     bricks[i].setPosition(100 + (i * 45) , 320); 
    } 

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

     window.clear(); 
     for (int i = 0; i < bricks.size(); i++) 
     { 
      window.draw(bricks[i]; 
     } 
     // Consider doing this : 
     // for(const auto& brick : bricks) 
     // window.draw(brick); 

     window.display(); 

    } 

    return 0; 
} 
+0

我的代码像您说的那样放置,并且不工作,没有错误ethier。 – Ishidad

+0

@Ishidad你有什么在屏幕上渲染?如果你的'.jpg'渲染不是'.png',我建议你将它们保存为8位,16位或24位PNG不能很好地工作。你也可以尝试直接在你的main中加载纹理,看看问题是否来自你的图像管理器。 –

+0

完成后,我添加纹理JPG文件,似乎工作。感谢Thanx的帮助。 – Ishidad

2

我认为问题是与装载纹理,尝试检查是loadFromFile函数返回true。

+0

我尝试添加 如果 返回EXIT_FAILURE; 并且没有错误。 – Ishidad

+0

嗯尝试从SFML网站运行示例并在代码中查找差异 – piotrek