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

20.07.2009, 07:56

animaton im spiel

wie mache ich eine animation im spiel?
ich habs so versucht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    F2C::Sprite sk1; //sprite object

    F2C::Bitmap* bk1 = new F2C::Bitmap;
    bk1->LoadFile("k2.png");
    sk1.setBitmap(bgras);
        delete bk1;
//set Coord.

    sk1.x = 350;
    sk1.y = 200;
//***********************************************************************

    F2C::Sprite sk2; //sprite object

    F2C::Bitmap* bk2 = new F2C::Bitmap;
    bk2->LoadFile("k3.png");
    sk2.setBitmap(bk2);
        delete bk2;
//set Coord.

    sk2.x = 350;
    sk2.y = 200;


das war jetzt erst das laden der bilder
ich lasse etwas unwichtiges weg und...

C-/C++-Quelltext

1
2
3
            sk1.render();
            F2C::Window::getInstance()->Sleep(0.001f);
            sk2.render();

...das sollte dann zur ausgabe von den bildern kommen.
leider wird nur das letzte also k2 angezeigt.
was soll ich machen?

2

20.07.2009, 09:07

Ist klar, dass nur das letzte Bild angezeigt wird.

Du müsstest den Faktor Zeit in deine Logik einbeziehen, anstatt mit dem Sleep zu arbeiten.
fka tm

3

20.07.2009, 10:43

ja ok aber ich hab das mit der zeit noch nie gemacht und weis auch nicht wie das geht...

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

20.07.2009, 11:23

Den Zeitfaktor musst du z.B beim bewegen von Bildern einbeziehen.
Zum Beispiel möchtest du jede Sekunde ein Bild um 10 Pixel nach rechts verschieben. Da deine Spielschlaufe aber jedes Frame updatet, muss du nur um den Bruchteil verschieben, wie das Frame von einer Sekunde gebraucht hat.

Wenn du 100 Frames in der Sekunde hast, dann musst du das Bild in jedem Frame lediglich um 0.1 Pixel verschieben. ( 10 / 100 ).

Aber das hat ja eigenltich nichts mit deinem Problem zu tun..

Wenn du die Koordinaten der Bilder anschaust, dann sind die doch gleich. Dann ist es klar, dass das zweite gerenderte das erste Überdeckt, oder nicht? ;)

5

20.07.2009, 11:35

ja schon nachdem ich das ausprobiert hab is das ja auch so aber die sollten sich ja sozusagen abwechselnd überrendern...

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

20.07.2009, 13:40

Dann darst du die aber nicht beide gleichzeitig rendern, sondern eines nach dem anderen..

C-/C++-Quelltext

1
2
3
4
if ( gameTime <= 1.0f ) // gameTime musst du halt irgendwo her holen

 sk1.render();
else 
  sk2.render();


So wird nach 1 Sekunde das zweite Bild gerendert. Üblicherweise wird zwar eher eine Animationszeit mitgezählt, und da wird dann halt je nach Wert das Bild ausgewählt.

In etwa so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
F2C::Sprite frames[10]; //Animation aus 10 sprites

float animationState = 0.0f; 

// laden der sprites und setzen der Position usw.


...

// in jedem Frame

animationState += elapsedTime; // elapsedTime ist die Zeit, die seit dem letzen Frame vergangen ist


int actSprite= static_cast<int> ( animationState );
frames[ actSprite].render (); // aktuelles frame rendern


if ( actSprite== 9 )
   animationState = 0.0f; // wieder zurücksetzen damit es eine Schleife gibt

kiba

Alter Hase

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

7

20.07.2009, 14:49

Man kann auch ein Bild mit den ganzen Frames machen(also alle Frames in einer reihe) und einfach nur den Anzeigebereich bestimmen.

C-/C++-Quelltext

1
2
3
4
5
6
void animation(F2C::Sprite& sprite,F2C::uint maxframes){
   sprite.src_rect.width = sprite.getTexWidth()/maxframes;
   sprite.src_rect.x += sprite.getTexWidth()/maxframes;
   if(sprite.src_rect.x >= sprite.getTexWidth())
      sprite.src_rect.x = 0;
}

8

20.07.2009, 18:34

ok thx werd hoffentlich diesmal damit klarkommen

Werbeanzeige