Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有相同sprite循环的SFML 2.0_C++_Sfml - Fatal编程技术网

C++ 具有相同sprite循环的SFML 2.0

C++ 具有相同sprite循环的SFML 2.0,c++,sfml,C++,Sfml,我正在使用SFML2.0在游戏中绘制入侵者精灵列表。目前,我必须不断复制和粘贴我的代码,以便在其中绘制更多精灵: //load the invaders images sf::Texture invaders; sf::Texture invaders2; sf::Texture invaders3; sf::Texture invaders4; sf::Texture invaders5; sf::Texture invaders6; invaders.loadFromFile("images

我正在使用SFML2.0在游戏中绘制入侵者精灵列表。目前,我必须不断复制和粘贴我的代码,以便在其中绘制更多精灵:

//load the invaders images
sf::Texture invaders;
sf::Texture invaders2;
sf::Texture invaders3;
sf::Texture invaders4;
sf::Texture invaders5;
sf::Texture invaders6;
invaders.loadFromFile("images/invaders.png");
invaders2.loadFromFile("images/invaders.png");
invaders3.loadFromFile("images/invaders.png");
invaders4.loadFromFile("images/invaders.png");
invaders5.loadFromFile("images/invaders.png");
invaders6.loadFromFile("images/invaders.png");

//Sprites
sf::Sprite invadersSprite(invaders);
sf::Sprite invadersSprite2(invaders2);
sf::Sprite invadersSprite3(invaders3);
sf::Sprite invadersSprite4(invaders4);
sf::Sprite invadersSprite5(invaders5);
sf::Sprite invadersSprite6(invaders6);

invadersSprite2.setPosition(30,NULL);
invadersSprite3.setPosition(60,NULL);
invadersSprite4.setPosition(90,NULL);
invadersSprite5.setPosition(120,NULL);
invadersSprite6.setPosition(150,NULL);

if(Clock.getElapsedTime().asSeconds()>REFRESH_RATE)
        {

            //carry out updating tasks
            static float spriteTimer=0.0;  //keep track of sprite time
            spriteTimer+=Clock.getElapsedTime().asSeconds();

            static int count=0; //keep track of where the sub rect is
            if(spriteTimer>delay)
            {
                invadersSprite.setTextureRect(area);
                invadersSprite2.setTextureRect(area);
                invadersSprite3.setTextureRect(area);
                invadersSprite4.setTextureRect(area);
                invadersSprite5.setTextureRect(area);
                invadersSprite6.setTextureRect(area);
                ++count;
                invadersSprite.move(xVelocity, yVelocity);  
                invadersSprite2.move(xVelocity, yVelocity); 
                invadersSprite3.move(xVelocity, yVelocity); 
                invadersSprite4.move(xVelocity, yVelocity); 
                invadersSprite5.move(xVelocity, yVelocity); 
                invadersSprite6.move(xVelocity, yVelocity); 


if (invadersSprite.getPosition().x >= 770 || invadersSprite2.getPosition().x >= 770 || invadersSprite3.getPosition().x >= 770 || invadersSprite4.getPosition().x >= 770 || invadersSprite5.getPosition().x >= 770 || invadersSprite6.getPosition().x >= 770)// When it hits the right hand side of the screen it will move back down to the left
            {
                xVelocity = left;
                invadersSprite.move(0,down);
                invadersSprite2.move(0,down);
                invadersSprite3.move(0,down);
                invadersSprite4.move(0,down);
                invadersSprite5.move(0,down);
                invadersSprite6.move(0,down);
            } 
            else if (invadersSprite.getPosition().x <= 0 || invadersSprite2.getPosition().x <= 0 || invadersSprite3.getPosition().x <= 0 || invadersSprite4.getPosition().x <= 0 || invadersSprite5.getPosition().x <= 0 || invadersSprite6.getPosition().x <= 0) // When it hits the left hand side of the screen it will move up to the right.
            {
                invadersSprite.move(0,down);
                invadersSprite2.move(0,down);
                invadersSprite3.move(0,down);
                invadersSprite4.move(0,down);
                invadersSprite5.move(0,down);
                invadersSprite6.move(0,down);
                xVelocity = right;
            }
然后执行for循环,该循环将精灵的渲染循环10次,这意味着精灵将加载10次。我说的对吗?如果我是,我可能会得到一些帮助,如何做到这一点


或者可能将精灵保存在内存中,找到它,然后用我的数组循环该内存位置?谢谢

因为
sf::Sprite
保留了指向您正在使用的纹理的常量指针,所以您可以毫无问题地重用相同的纹理。你在无缘无故地制作很多纹理,而一个纹理就可以了。不幸的是,这一点不适用于移动精灵,因为它们是独立的对象。

由于
sf::Sprite
保留了指向正在使用的纹理的常量指针,因此可以毫无问题地重用相同的纹理。你在无缘无故地制作很多纹理,而一个纹理就可以了。不幸的是,这一点不适用于移动精灵,因为这些精灵是独立的对象。

是的,您将其过度复杂化,并且没有在应该使用的位置使用数组或容器。任何时候只要在变量名末尾的数字增加的情况下重新生成变量,就可以使用容器了

由于所有的
sf::Texture
s都完全相同,因此只需执行一次:

// Create a texture
sf::Texture invaderTexture;
// Load image file into that texture
invaderTexture.loadFromFile("images/invaders.png");
然后,如果你想创建,比方说,10个入侵者精灵,你会有一个
sf::Sprite
的容器。这里我向您展示了一个
std::vector
,但其他容器(或普通的旧数组)也可以:

// Create a vector of 10 sprites initialised with the texture above
std::vector<sf::Sprite> invaderSprites(10, sf::Sprite(invaderTexture));
这应该可以帮助你开始


对数组执行同样的操作时,初始化过程如下所示:

// Create an array of 10 sprites (cannot initialise them with textures here)
sf::Sprite invaderSprites[10];
// Loop over each sprite, setting their textures
for (int i = 0; i < 10; i++) {
  invaderSprites[i].setTexture(invaderTexture);
}
//创建一个包含10个精灵的数组(此处无法使用纹理初始化)
sf::精灵入侵者Prites[10];
//在每个精灵上循环,设置其纹理
对于(int i=0;i<10;i++){
InjectorSprites[i].setTexture(InjectrTexture);
}

然后,您可以在需要对所有入侵者执行某些操作时执行相同类型的循环。

是的,您正在将其过度复杂化,而不是在您应该使用的位置使用数组或容器。任何时候只要在变量名末尾的数字增加的情况下重新生成变量,就可以使用容器了

由于所有的
sf::Texture
s都完全相同,因此只需执行一次:

// Create a texture
sf::Texture invaderTexture;
// Load image file into that texture
invaderTexture.loadFromFile("images/invaders.png");
然后,如果你想创建,比方说,10个入侵者精灵,你会有一个
sf::Sprite
的容器。这里我向您展示了一个
std::vector
,但其他容器(或普通的旧数组)也可以:

// Create a vector of 10 sprites initialised with the texture above
std::vector<sf::Sprite> invaderSprites(10, sf::Sprite(invaderTexture));
这应该可以帮助你开始


对数组执行同样的操作时,初始化过程如下所示:

// Create an array of 10 sprites (cannot initialise them with textures here)
sf::Sprite invaderSprites[10];
// Loop over each sprite, setting their textures
for (int i = 0; i < 10; i++) {
  invaderSprites[i].setTexture(invaderTexture);
}
//创建一个包含10个精灵的数组(此处无法使用纹理初始化)
sf::精灵入侵者Prites[10];
//在每个精灵上循环,设置其纹理
对于(int i=0;i<10;i++){
InjectorSprites[i].setTexture(InjectrTexture);
}

然后,您可以在需要对所有入侵者执行某些操作时执行相同类型的循环。

我将如何修改代码以执行此操作?我不完全明白。@JohnathanBrown与其拥有6种以上不同的纹理来加载相同的图像,不如只保留一种。将纹理视为精灵表。如何修改代码以实现此目的?我不完全明白。@JohnathanBrown与其拥有6种以上不同的纹理来加载相同的图像,不如只保留一种。把纹理想象成一张精灵纸。啊,不错。然后我可以吃点什么?对于(inti=0;i@JohnathanBrown,我可能把你和一些C++11搞混了。我将对其进行编辑以使其更易于理解。您可以像访问数组一样访问入侵者Prites
investrsprites[0]
是第一个,而
investrsprites[1]
是第二个。我假设你知道数组,但如果你不知道,一定要开始阅读。我确实知道数组,我只是担心我不太擅长编程,尽管我真的很喜欢它:(J.J.N.)我给了你一个大提示——如果你开始对变量进行编号,你可能需要数组!A<代码> STD::向量< /代码>就像一个数组,但是它更安全,并且可以在大小上生长和缩小。有经验的C++程序员倾向于使用容器(如<代码> STD::向量< /代码>)在普通的旧数组上。@JohnathanBrown
investrTexture
是我在第一个代码示例中定义的
sf::Texture
。啊,很好。然后我可以得到类似于?for(int I=0;I@JohnathanBrown我可能把你和一些C++11搞混了。我将对它进行编辑以使其更易于理解。你可以像数组一样访问
inversprites
inversprites[0]
是第一个,
inversprites[1]
是第二个。我假设你知道数组,但如果你不知道,一定要开始阅读。我确实知道数组,我只是担心我不太擅长编程,尽管我非常喜欢它:(J.J.N.)我给了你一个大提示——如果你开始对变量进行编号,你可能需要数组!A<代码> STD::向量< /代码>就像一个数组,但是它更安全,并且可以在大小上生长和缩小。有经验的C++程序员倾向于使用容器(如<代码> STD::向量< /代码>)在普通的旧数组上。@JohnathanBrown
inventertexture
是我在第一个代码示例中定义的
sf::Texture