C++ 具有相同sprite循环的SFML 2.0
我正在使用SFML2.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
//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搞混了。我将对其进行编辑以使其更易于理解。您可以像访问数组一样访问入侵者Pritesinvestrsprites[0]
是第一个,而investrsprites[1]
是第二个。我假设你知道数组,但如果你不知道,一定要开始阅读。我确实知道数组,我只是担心我不太擅长编程,尽管我真的很喜欢它:(J.J.N.)我给了你一个大提示——如果你开始对变量进行编号,你可能需要数组!A<代码> STD::向量< /代码>就像一个数组,但是它更安全,并且可以在大小上生长和缩小。有经验的C++程序员倾向于使用容器(如<代码> STD::向量< /代码>)在普通的旧数组上。@JohnathanBrowninvestrTexture
是我在第一个代码示例中定义的sf::Texture
。啊,很好。然后我可以得到类似于?for(int I=0;I@JohnathanBrown我可能把你和一些C++11搞混了。我将对它进行编辑以使其更易于理解。你可以像数组一样访问inversprites
。inversprites[0]
是第一个,inversprites[1]
是第二个。我假设你知道数组,但如果你不知道,一定要开始阅读。我确实知道数组,我只是担心我不太擅长编程,尽管我非常喜欢它:(J.J.N.)我给了你一个大提示——如果你开始对变量进行编号,你可能需要数组!A<代码> STD::向量< /代码>就像一个数组,但是它更安全,并且可以在大小上生长和缩小。有经验的C++程序员倾向于使用容器(如<代码> STD::向量< /代码>)在普通的旧数组上。@JohnathanBrowninventertexture
是我在第一个代码示例中定义的sf::Texture
。