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

TigerClaw25

unregistriert

1

05.04.2013, 10:54

Sprites und Back-buffer

Hallo zusammen,

habe eine Frage zu den Sprites. Eine Funktion im Buch sorgt dafür, dass die Sprites, die animiert werden sollen, in den Back-buffer kopiert werden, um später per SDL_Flip getauscht zu werden. Soweit verstehe ich das.

Jetzt zum Problem: Als Parameter übergebe ich der Funktion SDL_BlitSurface den Quell-Surface bzw den Zeiger auf das eigentliche Sprite, also m_pImage. Das Problem ist nun, dass m_pScreen, also was für den Hintergrund zuständig ist, eventuell bei einer Erweiterung des Spiels auch bewegt werden soll. Muss mann dafür die Funktion neu schreiben oder wie kann ich mir das Vorstzellen?

Momentan bewegt sich der Hintergrund ja nicht, deshalb benötigt man den Back-buffer auch nicht ... aber später möchte ich ein Level erstellen, dass einen beweglichen Hintergrund enthält ...

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

2

05.04.2013, 11:02

Dann passt du einfach den 2. und 4. Parameter an.
Dies sind SDL_Rect's bzw. Pointer auf diese und die geben an, welcher Ausschnitt des Bildes auf welchen Ausschnitt deines Hintergrunds gezeichnet werden.
Wenn sich dein Hintergrund also bewegt, musst du lediglich anpassen, wohin deine Surface gezeichnet wird. Nichts weiter.
Ein nützlicher Link: http://www.libsdl.org/docs/html/sdlblitsurface.html
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

TigerClaw25

unregistriert

3

05.04.2013, 11:20

Ok danke.

Verstehe außerdem nicht, warum der Autpor folgendes schreibt:

C-/C++-Quelltext

1
2
3
4
5
6
7
    // Rect für Animationsphase initialisieren
    m_NumFrames   = NumFrames;
    m_FrameWidth  = FrameWidth;     // werden beim Rendern verwendet
    m_FrameHeight = FrameHeight;
    m_FrameRect.w = FrameWidth; 
    m_FrameRect.h = FrameHeight;
    m_NumFramesX  = m_pImage->w / m_FrameWidth;


Die Zuweisung von "FrameWidth" und "FrameHeight" wird 2x durchgeführt, aber in der darauffolgenden Funktion nur m_FrameWidth z.B. verwendet.

C-/C++-Quelltext

1
2
3
  // Rect berechnen
    m_FrameRect.x = Column * m_FrameWidth;
    m_FrameRect.y = Row * m_FrameHeight;


Kann ja genau so gut auch m_FrameRect.w verwendet ... verstehe ich nicht ...

TigerClaw25

unregistriert

4

07.04.2013, 13:26

Weiss jemanden vielleicht, warum in der framework ein Zeiger SDL_Surface *m_pScreend erzeugt wird und dann dann bei der SDL Initialisien direkt eine Zuweisun stattfindet ala m_pSurface = Set_Video_Mode ...

Wo ist das new abgeblieben oder gibt es bereits auf dem Heap eine Speicherzuweisung durch die Funktion Set Video Mode?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

07.04.2013, 13:29

Die Zuweisung von "FrameWidth" und "FrameHeight" wird 2x durchgeführt, aber in der darauffolgenden Funktion nur m_FrameWidth z.B. verwendet.
(...)
Kann ja genau so gut auch m_FrameRect.w verwendet ... verstehe ich nicht ...
Die Position ändert sich, die Breite nicht. Daher ist genug die Breite einmal zu setzen und nicht immer wieder und wieder.

Wo ist das new abgeblieben oder gibt es bereits auf dem Heap eine Speicherzuweisung durch die Funktion Set Video Mode?
Offensichtlich. "new" lässt sich in Kombination mit einem Funktionsaufruf dort wohl auch nicht sinnvoll verwenden, also erstellt die Funktion offenbar das Surface.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

6

07.04.2013, 13:31

Weiss jemanden vielleicht, warum in der framework ein Zeiger SDL_Surface *m_pScreend erzeugt wird und dann dann bei der SDL Initialisien direkt eine Zuweisun stattfindet ala m_pSurface = Set_Video_Mode ...

Wo ist das new abgeblieben oder gibt es bereits auf dem Heap eine Speicherzuweisung durch die Funktion Set Video Mode?

Ja genau, die Funktion SDL_SetVideoMode allokiert Speicher auf dem Heap für die SDL_Surface und du bekommst einen Zeiger auf diesen allokierten Speicher zurück.

edit:
Bei Fragen hilft es auch ungemein auf dem Wiki zu lesen. Hier der Wiki Eintrag für die Funktion SDL_SetVideoMode: http://sdl.beuc.net/sdl.wiki/SDL_SetVideoMode
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

TigerClaw25

unregistriert

7

07.04.2013, 13:50

Danke fuer die Hilfe. Ich weiss, ich Frage sehr viel, aber ich will auch alles lueckenlos verstehen.

Also wenn eine Funktion einen Zeiger zhurueck gibt, brauche ich keinen Speicher fuer Instanzen zu reservieren .

mir ist irgendwie auch unklar, wann wie reserviert ist. int *zeiger; reserviert noch kein speicher


statisch reservieren bedeutet dann zeiger=&einervariablen

und mit new int; reservierung dynamisch auf dem heap?..

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »TigerClaw25« (07.04.2013, 13:58)


Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

8

07.04.2013, 13:51

Das wurde schon getan, korrekt. Und du musst in diesem Fall sogar die Surface nicht manuell freigeben, dass macht SDL_Quit für dich.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Werbeanzeige