Your solution worked too Laurent. I realized I was counting the frames in the explosion bitmap, instead of counting time. To get the correct animation sequence, I had to do like this:
#include <iostream>
#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#define SFML_STATIC //Se till så att det inte behövs extra DLL-filer
using namespace std; // utifall att konsollen behövs för felsökning
class Explosion
{
public :
sf::Sprite Sprite; // en per instans
};
void pang(float x, float y, Explosion &Klassinstans, sf::Image bildfilsnamn, sf::RenderWindow &App );
//Funktionen som initierar explosionen
int main (int argc, char *argv)
{ //main startar
//ladda in bild för explosionen
sf::Image explosionsbildmap;
//explosionens spritemap är 5 x 5 rutor 64x64 pixels stora
if (!explosionsbildmap.LoadFromFile("xplosion17.png"))
{
cout << "Kan inte hitta bilden: xplosion17.png " << endl;
}
//Skapa en kopia av explosionen
Explosion Explosionskopia;
sf::RenderWindow App(sf::VideoMode(800, 600, 32), "Test av explosion");
// Skapa fönstret vi skall testa explosionen i
while (App.IsOpened())
{ //while 1 startar
sf::Event Event; //kolla om mus/tangentbord används
while (App.GetEvent(Event))
{ //while 2 börjar
if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Escape))
App.Close();//avsluta programmet
if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Return))
//Visa upp explosionen om man trycker ner return-knappen
pang(100, 100, Explosionskopia, explosionsbildmap, App);
//Slutligen visar vi upp ändringarna om och om igen många gånger i sekunden
App.Clear(sf::Color(0, 100, 0)); //rensa allt i fönstret och ersätt med grönfärg
App.Display(); //visa upp ändringarna för användaren
} //while 1 slutar
} //while 2 slutar
} //main slutar
void pang(float x, float y, Explosion &Klassinstans, sf::Image bildfilsnamn, sf::RenderWindow &App )
{
bool avsluta=false;
int rutorY = 0; //max 5, bildrutor i y-led
int rutorX = 0; //max 5, bildrutor i x led
int bildbredd = 64; //varje enskild rutas bredd
int bildhojd = 64; //varje enskild rutas höjd
sf::Clock ExplosionClock;
//Skapa en timer för explosionen
float visningstid = 0.01f;
Klassinstans.Sprite.SetPosition(x,y);
//Placera ut den på rätt plats på spelplanen
Klassinstans.Sprite.SetImage(bildfilsnamn);
ExplosionClock.Reset(); //Se till så att klockan verkligen är 0
while ( rutorY < 5) //Så länge man är på någon rad
{//while i y-led
while (ExplosionClock.GetElapsedTime() < (visningstid * 5)) //Så länge man är på någon bild i en rad
{ //while i x-led
if (ExplosionClock.GetElapsedTime() < visningstid && ExplosionClock.GetElapsedTime() > 0.0)
{
bildbredd = 64; //Gå till första bilden
}
else if (ExplosionClock.GetElapsedTime() < (visningstid * 2) && ExplosionClock.GetElapsedTime() > visningstid)
{
bildbredd = 128; //Gå till bild 2
}
else if (ExplosionClock.GetElapsedTime() < (visningstid * 3) && ExplosionClock.GetElapsedTime() > (visningstid * 2))
{
bildbredd = 192; //Gå till bild 3
}
else if (ExplosionClock.GetElapsedTime() < (visningstid * 4) && ExplosionClock.GetElapsedTime() > (visningstid * 3))
{
bildbredd = 256; //Gå till nästa bild
}
else if (ExplosionClock.GetElapsedTime() < (visningstid * 5) && ExplosionClock.GetElapsedTime() > (visningstid * 4))
{
bildbredd = 320; //Gå till nästa bild
}
Klassinstans.Sprite.SetSubRect(sf::IntRect(bildbredd-64,bildhojd-64,bildbredd,bildhojd)); //Visa bilden
App.Draw(Klassinstans.Sprite);//Rita ut explosionen
App.Display(); //visa upp ändringarna för användaren
} //slut i x-led
ExplosionClock.Reset(); // sätter om klockan till noll
bildhojd = bildhojd + 64;//Hoppa ner en rad
rutorY = rutorY + 1; //Öka till nästa rad
} //while i y-led
}//pang slutar