【问题标题】:SFML 2.0 c++ sprite in array/vector数组/向量中的 SFML 2.0 c++ 精灵
【发布时间】:2014-02-16 05:10:57
【问题描述】:

我的文件中有这个 blocks.h:

  #include <vector>
    class Blocks{
        public:
        string files_name[4];
        vector < Sprite > sprites;
        void load(){
            for(int i=0;i<=sizeof(files_name);i++){
                Texture my_texture;
                my_texture.loadFromFile(this->files_name[i]);
                sprites[i].setTexture( my_texture );

            }
        }
        Blocks(){
            this->files_name[0] = "wall.png";
            this->files_name[1] = "floor.png";
            this->files_name[2] = "live.png";
            this->files_name[3] = "coins.png";
            this->load();
        }
        void show(int id, int X, int Y){
            sprites[id].setPosition(X, Y);
            window.draw(sprites[id]);
        }
    };

我没有错误,但我的游戏崩溃了。我认为,问题在于sprites[i].setTexture(...)

我只有消息:进程终止,状态为 -1073741819(0 分 2 秒)

我的 IDE 是 Code::Blocks 10.05,我有 Windows 8。

当然,在文件main.cpp中,我已经定义了窗口:

RenderWindow window( VideoMode(920, 640, 32 ), "Game" );

#include "blocks.h"
Blocks BLOCKS;

----更新: 好的,现在它没有崩溃,谢谢!但是,现在我看不到纹理!我阅读了 Benjamin Lindley 的帖子,并添加了一个带有纹理的新矢量。我的代码现在看起来像这样:

const int arraySize = 4; 
string files_name[4]; 
vector < Sprite > sprites; 
vector < Texture > textures; 

并且,在load(),我有:

for(int i = 0; i < arraySize; i++){ 
Texture new_texture; 
new_texture.loadFromFile(this->files_name[i]); 
textures.push_back(new_texture); 
sprites[i].setTexture(textures[i]); 

然后它又崩溃了!

---更新:现在我再次更改了我的代码并且我没有崩溃,但我的纹理是white squares。我的纹理live.png 有效,但其他纹理是白色的!这是我的新代码:

    Sprite new_sprite;
    new_sprite.setTexture(textures[i]);
    sprites.push_back(new_sprite);

【问题讨论】:

    标签: c++ vector textures sfml sprite


    【解决方案1】:

    问题出在这一行:

    for(int i=0;i<=sizeof(files_name);i++){
    

    如果你打印出sizeof(files_name)的值,你会发现它是16而不是4!不要在这里使用 sizeof 。另外,不要在此处使用

    你可以使用:

    const int arraySize = 4;
    string files_name[arraySize];
    ...
    for(int i = 0; i < arraySize; i++)
    

    或类似的东西。

    另外,希望你在某个时候初始化精灵。在调用 load() 之前,您需要使用 Sprites(使用 sprites.push_back(mySprite) 之类的东西)填充您的向量。

    【讨论】:

    • 感谢您的回复,我更新了我的帖子。请阅读,但是当我添加带有纹理的矢量时再次崩溃。
    • 我再次更新我的帖子。现在我没有崩溃,但我只能看到一个纹理“live.png”,其他的都是白色的。
    【解决方案2】:

    SFML sprites 通过指针存储它们关联的纹理。您正在创建的纹理是循环的局部纹理,因此在每次迭代结束时都会被销毁,从而使精灵中的指针无效。你需要让你的纹理在任何精灵使用它们的持续时间内保持活跃。

    另外,您的 sprites 向量没有元素,您需要指定大小,或在循环中使用 push_back

    另外,正如 Scott 所指出的,sizeof(files_name) 不是循环的适当终止值,因为它为您提供了 sizeof(string) * 数组中的元素数。您只需要数组中元素的数量。

    【讨论】:

    • 我更新了我的帖子。请阅读。现在我没有崩溃,但我只能看到一种纹理,其他的是白色的:/ 感谢您的回复
    【解决方案3】:

    好的,它只能在两个循环中工作:感谢您的帮助:)

    vector < Sprite > sprites;
    vector < Texture > tekstures;
    

    和:

    for(int i = 0; i < arraySize; i++){
        Texture new_texture;
        new_texture.loadFromFile(this->files_name[i]);
        tekstures.push_back(new_texture);
    }
    
    for(int i = 0; i < arraySize; i++){
        Sprite new_sprite;
        new_sprite.setTexture(tekstures[i]);
        sprites.push_back(new_sprite);
    }
    

    在一个循环中它不起作用,我有白色纹理:

    for(int i = 0; i < arraySize; i++){
        Texture new_texture;
        new_texture.loadFromFile(this->files_name[i]);
        tekstures.push_back(new_texture);
        Sprite new_sprite;
        new_sprite.setTexture(tekstures[i]);
        sprites.push_back(new_sprite);
    }
    

    您好!

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多