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

19.01.2013, 01:40

Schwierigkeiten bim kompletten entleeren eines Fensters mit der SDL

Hallo,

ich habe mich selbst mal an einem Projekt TicTacTOe gesetzt und bin auch ganz gut vorangekommen. Das SPiel steht schon.
Es gibt jedoch ein rein grafisches Problem, was mit der SDL zu tun hat. Wenn ein SPieler gewonnen hat ist das Feld ja voll mit Kreisen und Xen. Außerdem einem Hintergrund und das natürlich alles in einem Fenster.
Jetzt möchte ich, dass das alles verschwindet und ein schwarzer Hintergrund hervorkommt, auf dem steht: "Player 1 wins".
Mein Code sieht dabei wie folgt aus:


Quellcode

1
2
SDL_FillRect(screen,&screen->clip_rect,SDL_MapRGB(screen->format,0xFF,0xFF,0xFF));
SDL_BlitSurface(win1,NULL,screen,&offset);



Das sollte ja dafür sorgen, dass der Bildschirm komplett weiß wird. Aber es wird lediglich der Hintergrund gelöscht, die Kreuze und Kreise bleiben sichtbar.
Weiß jemand, wie ich wirklich den kompletten Hintergrund wieder weiß kriegen kann.
Danke im Voraus :)

2

19.01.2013, 02:16

Hallo

Vileicht zeichenst du deine Symbole in jedem frame neu (render metode).

Grüsse.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

3

19.01.2013, 07:27

Wie zeichnest du denn die "Kreuze und Kreise"?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

4

19.01.2013, 14:51

Danke SPitzohr, das ist richtig. Ich zeichne tatsächlich meine Kreise mit jedem Frame neu. Es gibt eine Klasse Field, die das spielfeld und deren Ereignisse überwacht und das Spielfeld
jeden Fram neu rendert mit der dazu passenden funktion render();

Tja, das heisst ich muss aus dem Loop raus oder einen neuen internen Loop erzeugen. mhm, muss ich mir mal gedanken machen.

@architekt:

Ich hab die Kreise gnz normal erstellt:

Quellcode

1
SDL_BlitSurface(kreis,&clip,screen,&offset);


Also sprich kreis und Kreuz mit Paint gemalt und dann reingeholt per IMG_Load();

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

5

19.01.2013, 15:24

Nein, du musst keine neue Loop aufmachen.
Lies mal hier die Tutorials durch: http://lazyfoo.net/SDL_tutorials/index.php
Speziell interessant dürfte gerade das hier sein: http://lazyfoo.net/SDL_tutorials/lesson01/index2.php
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

6

19.01.2013, 15:29

Das habe ich ja längst getan Architekt bin bereits bei tutorial 10 oder so, mir ist auch gerade aufgefallen, dass es einfacher geht ;).
Die interne Logik meines TIctacToedingens ist ein array mit werten, wenn die werte jetzt PLAYERONE oder PLAYERTWO sind dann malt das Spielfeld halt einen Kreis oder ein Kreuz.
Ich muss einfach nur das ganze Array auf 0 setzen, dann wird nicht gemalt.
Von daher, eine einfache Geschichte eigentlich.
Aber danke für den Tipp und die Seite mit den Tutorials ist echt spitze.

G. grombo

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

7

19.01.2013, 15:54

Ansonsten gäbe es noch if und else. Du könntest eine Variable anlegen die speichert ob das Spiel beendet ist oder nicht. Wenn das Spiel nicht beendet ist, wird das Spielfeld angezeigt und man kann Kreuze und Kreise setzen. Ist das Spiel beendet, wird der jeweils passende Screen angezeigt.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

8

19.01.2013, 17:46

Danke an alle, das SPiel sit jetzt fertig. Der entscheidene hinweis war eigentlich, dass ich das Feld neuinitialisieren muss. Und zack schon hats funktioniert.

Werbeanzeige