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

Khodos

Frischling

  • »Khodos« ist der Autor dieses Themas

Beiträge: 45

Wohnort: Kienz

  • Private Nachricht senden

1

02.06.2014, 18:10

[gelöst] SDL 1.2 animieres Bild flackert

Ich hab versucht ein Sprite zu animieren, aber es flackert die ganze Zeit. Was mach ich falsch?

Hier der Quellcode:

Meine Funktion zum Bilder laden:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void setimage (float xpos, float ypos, SDL_Surface *src, SDL_Surface *dst, int curframe)
{
    SDL_Rect framerect;
    SDL_Rect rect;
    rect.x = xpos;
    rect.y = ypos;
    rect.w = 384;
    rect.h = 32;
    framerect.w = 32;
    framerect.h = 32;
    framerect.x = framerect.w * curframe;
    framerect.y = framerect.h * curframe;

    SDL_BlitSurface (src, &framerect, dst, &rect);  //Bild auf screen werfen

} //setimage


Hier ruf ich die funktion auf:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
void CZombie::renderzombie (SDL_Surface *screen)
{
    curframe += 1;

    if (curframe == maxframe)
    {
        curframe = 0;
    }

    setimage (xpos, ypos, zombiesprite, screen, curframe);
}


Ich bedanke mich schomal für die Antworten

MfG Khodos
Aktuelles Projekt: World of Kienz

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Khodos« (03.06.2014, 18:43)


Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

2

02.06.2014, 18:38

Inwiefern "flackert" es? Limitierst du die Framerate (Wiki Seite dazu)?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

02.06.2014, 22:00

Kann es sein, dass du keinen Back-Buffer benutzt und "direkt auf den Bildschirm" zeichnest?

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

4

02.06.2014, 22:12

Sofern er SDL_Flip aufruft, sollte alles in Butter sein. Und das muss er eig. auch, jedenfalls war das afaik die einzige Möglichkeit in SDL 1.2 die Screen Surface in den Buffer zu rendern.
An dieser Stelle meine Empfehlung, sich demnächst mal mit SDL 2.0 auseinanderzusetzen. ;)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

5

03.06.2014, 01:49

Ich vermute, dass er erst die Surface (oder nur einen Teilbereich) cleared und invalidated/flipped/flushed/whatever, dann erst das Bild wieder neu zeichnet und danach entsprechend ein zweites mal invalidated/flipped/flushed/whatever und somit das Zeichnen noch einmal durchführt. Um das nachzuweisen, bedarf es aber mehr Quelltext.
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Khodos

Frischling

  • »Khodos« ist der Autor dieses Themas

Beiträge: 45

Wohnort: Kienz

  • Private Nachricht senden

6

03.06.2014, 18:43

Gelöst

Hab den Fehler gefunden, besser gesagt es waren sogar 2 fehler. An den Buffer lags nicht, das hab ich schon alles beachtet. Meine Probleme waren:

1. Ich hatte den Timer, der die Zeit zwischen den Animationsphasen reguliert, noch nicht in die setimage Funktion eingebaut. Architekt hat mich drauf gebracht, danke.

den 2. Fehler hab ich gleich danach bermerkt: ich habe in der setimage Funktion das framerect.y jedes mal mit dem curframe neu berechnet, da mein sprite aber nur eine Ebene hatte gabs die Position gar nicht und es hat nichts gerendert, meine Sprites sind also verschwunden. Richtig hätte es heißen müssen framerect.y = 0;


Ich finds toll, dass hier so viele hilfsbreite Leute sind, als Dankeschön werde ich euch in den Credits von meinem zukünftigen Spiel verweigen, wenn ihr wollt!
Aktuelles Projekt: World of Kienz

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

7

03.06.2014, 18:49

Freut mich zu hören. Für dein nächstes Spiel lege ich dir dennoch die SDL 2.0 ans Herz. :)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Werbeanzeige