Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

23.06.2012, 23:22

sdl game - explosionsanimation beim zerstören eines asteroiden

ich probiere seit einigen stunden, eine animation abspielen zulassen, sobald ein asteroid getroffen wurde...aber nichts klappt :dash: :dash: :dash:

ich habe versucht, eine klasse ähnlich wie CAsteroid zu erstellen, hat nicht geklappt. dann habe ich eine klasse namens CExplosion erstellt, welche von CSprite erbt...geht auch nicht. Dann habe ich CSprite modifiziert und dort alle methoden und variablen aus CExplosion reingepackt, der compiler zeigt keine fehlermeldungen kann und beim zerstören stürtzt mein spiel ab :dash:

momentan habe ich alles gelöscht und fange nochmal bei null an. also was die animation beim zerstören angeht...

könnte mir jemand einen guten ansatz sagen? ich komme echt nicht weiter und bin für jede hilfe dankbar :D

bei cocos2d gibt es eine hauseigene methode, die eine animation erstellt, diese durchläuft und das wars. eine zeile code...man braucht keine extra klassen usw. . gibt es soetwas bei der sdl auch??

2

23.06.2012, 23:27

Also bei mir habe ich bei der Update Funktion einen Timer eingebaut. Damit habe ich dann die vergangene Zeit berechnet: Vergangene Zeit = Aktuelle Zeit - Startzeit.

Wenn die vergangene Zeit größer als ein bestimmter Punkt ist, dann wechsele ich einfach die Textur. Das geht einfach so weiter, je kleiner der Abstand der Animationswechsel, desto schneller wird die Animation abgespielt.

Mfg
Delop

3

23.06.2012, 23:30

Also bei mir habe ich bei der Update Funktion einen Timer eingebaut. Damit habe ich dann die vergangene Zeit berechnet: Vergangene Zeit = Aktuelle Zeit - Startzeit.

Wenn die vergangene Zeit größer als ein bestimmter Punkt ist, dann wechsele ich einfach die Textur. Das geht einfach so weiter, je kleiner der Abstand der Animationswechsel, desto schneller wird die Animation abgespielt.

Mfg
Delop


wozu brauche ich denn die zeit, wenn ich eine animation abspielen will, sobald ich einen asteroiden zerstöre??
ich muss nach der kollisionskontrolle (asteroid<->laser) einfach eine methode aufrufen, welche einmal die animation durchläuft. und genau bei der methode scheitern meine c++ fähigkeiten...

4

23.06.2012, 23:34

Du musst ja die vergangene Zeit beachten, sonst siehst du nichts.


Die Hauptschleife bei einem Spiel:

Endlosschleife->Begin
Spiel->Updaten
Fenster->Löschen
Fenster->Zeichnen
Fenster->Anzeigen
Zurück zum Anfang der Endlosschleife

Wenn du jetzt dein Spiel updatest und die Bilder einfach "gnadenlos" hintereinander zeichnest in einem Schritt, dann kommst du gar nicht zu dem Schritt, dein Fenster zu löschen, renderen und anzuzeigen. Alles passiert schon davor.

5

23.06.2012, 23:43

stimmt, für die animation brauche ich einen timer. irgendwann habe ich es soweit hinbekommen, das beim player für nichtmal eine sekunde ein frame angezeigt wurde. ich denke, ich kann dir folgen :thumbup:
wobei ich irgendwie nicht weiß, wie ich das jetzt realisieren soll...wärst du vllt so nett, deinen code der welt zugänglich zumachen? :thumbsup:
oder wenigstens einen ansatzt... :)

ps: jetzt wird mir klar, das cocos2d eine verdammt gute engine ist...

6

23.06.2012, 23:53

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Block::Block() {
    animtimer = 0;
}

void Block::update() {
    animtimer++;
    if(animtimer == 5) {
        S_Block.setTextureRect(sf::IntRect(0, 0, 32, 32));
    }
    
    if(animtimer == 10) {
        S_Block.setTextureRect(sf::IntRect(32, 0, 32, 32));
    }
    
    if(animtimer == 15) {
        S_Block.setTextureRect(sf::IntRect(64, 0, 32, 32));
    }
    
    if(animtimer == 20) {
        S_Block.setTextureRect(sf::IntRect(96, 0, 32, 32));
        animtimer = 0;
    }
}


Ich hab diese Klasse gekürzt. S_Block ist ein Block Sprite. Die Funktion setTextureRect nimmt aus einer Textur ein kleines Feld (1. Parameter: X Position, 2. Parameter: Y Position, 3. Parameter: Breite des Rechtecks, 4. Parameter: Höhe Des Rechtecks).

Du kannst auch direkt getrennte Texturen für die Animation nehmen.

Hoffe es ist verständlich.

7

24.06.2012, 00:53

hat mir ehrlich gesagt nicht geholfen :(

ich habs dann anders versucht, doch klappts einfach nicht...

hier mal der code:


in casteroid

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void CAsteroid::RenderE (float x, float y) {
    m_pSpriteAsteroid->SetPos ( x,  y);
    m_pSpriteAsteroid->Render (m_fAnimPhase);
    

}

void CAsteroid::UpdateE () {  // Animieren

      m_fAnimPhaseE += 15.0f * g_pTimer->GetElapsed ();

     // Prüfen, ob die Animation am Ende angelangt ist, wenn ja dann deaktivieren

  if (m_fAnimPhaseE >= 16.0f)
         m_bIsAliveE = false;

    
}


game.cpp init methode

C-/C++-Quelltext

1
2
3
4
 m_pSpriteExplosion = new CSprite;
    //playersprite zum testen
    m_pSpriteExplosion->Load ("Data/Player.bmp", 11, 64,64);
    m_pSpriteExplosion->SetColorKey (255, 0, 255);


bei der kollisionskontrolle in game.cpp

C-/C++-Quelltext

1
2
3
//ItAsteroid->UpdateE();
ItAsteroid->RenderE(RectAsteroid.x, RectAsteroid.y);
//ItAsteroid->RenderE(RectAsteroid.x, RectAsteroid.y);


keine ahnung wo der fehler liegt, ich vermute ich bin komplett falsch ran gegangen...es passiert nicht :dash:
was muss das denn so schwer sein mit sdl...-.-

8

24.06.2012, 09:45

Ich glaube mal, dass deine Werte zu hoch sind und du es dann nicht beobachten kannst, weil es dann zu schnell abläuft.

Mache es mal so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
void CAsteroid::UpdateE () {  // Animieren

      m_fAnimPhaseE += g_pTimer->GetElapsed ();

     // Prüfen, ob die Animation am Ende angelangt ist, wenn ja dann deaktivieren

  if (m_fAnimPhaseE >= 50.0f)
         m_bIsAliveE = false;

    
}

9

24.06.2012, 12:33

klappt auch nicht. man sieht einfach nichts...

10

24.06.2012, 12:36

Ahh ich habs. Ich denke du rufst die Draw Funktion der Animation nur einmal auf, und zwar nur wenn es kollidiert. Du musst die Funktion immer aufrufen, aber du solltest eine Boolean-Variable einbauen, damit die Animation nicht immer gezeichnet wird.

Werbeanzeige