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

Daedra22

Treue Seele

  • »Daedra22« ist der Autor dieses Themas

Beiträge: 115

Wohnort: Osten

Beruf: Student Informationstechnik

  • Private Nachricht senden

1

25.05.2013, 14:52

SDL Grafik ein-, aus- und wieder einblenden, evt. mithilfe Transparenz oder FreeSurface

Hallo wie der Titel schon sagt hab ich folgendes Problem.

Ich programmiere ein TicTacToe spiel, nun soll der Spieler welcher dran ist an der Seite, abhängig von einer Variable( bool Spieler= false); mit einem Kreuz oder einem Kreis angezeigt werden,

Nach einer Eingabe wechselt nun die Variable, mit dem Wechsel der Variable soll nun an der Seite aus dem Kreuz/Kreis ein Kreis/Kreuz erscheinen, wobei die Position des neuen Kreuzes/Kreises identisch ist.
Nun schaffe ich es jedoch nicht, dass das kreuz erscheint ohne, dass der kreis verschwindet, da die grafiken transparente hintergründe haben, überlappen sie sich, nun habe ich versucht das eine surface mit FillRect mit der transparenzfarbe zu füllen, das problem ist aber, falls ich also

-- Kreuz-- Kreis(Kreuz wird rot. bzw. transparenz) -- Kreuz(kreuz ist immernoch transparent)(Kreis wird auch rot also transparent)-- Kreis(transparent, man sieht nichts)-- Kreuz(transparent)-- Kreis( transparent)

also wechselt das ganze nur einmal und es wird nur noch Kreis angezeigt, auch eine neudeklaration der variablen (Fill_Rect und danach halt Kreis=SDL_LoadBMP) führt dazu, dass der ColorKeycode nicht wahrgenommen wird, dh die grafik wechselt zwar aber der vorher transparente hintergrund ist wieder rot, auch wenn ich ihn wieder manuell davor mit setColorKey auf transparent stelle, was mich sehr verwundert.

Vllt bin ich zu engstirnig und zerdenke es zu sehr, geht es nicht einfacher ich mein ich blende eine grafik ein, dann wieder aus, und wieder ein, dass ist alles was ich brauche

danke für eure Zeit,

ich finde es sehr gut, dass sich leute engagieren um hobby"programmierern" unter die arme zu greifen :)
Who are you? - I am a game designer.
No you are not! - I am a game designer.
What kind of a designer ? - I am a game designer.
You mean you play games ? - I am a game designer.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

2

25.05.2013, 15:08

Warum unterbindest du nicht einfach das zeichnen/blitten vom Kreis/Kreuz und zeichnest stattdessen das Kreuz/Kreis?

C-/C++-Quelltext

1
2
3
4
if (var)
    SDL_BlitSurface(Kreuz, screen, ..., ...);
else
    SDL_BlitSurface(Kreis, screen, ..., ...);

?
Oder missverstehe ich das Problem?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Daedra22

Treue Seele

  • »Daedra22« ist der Autor dieses Themas

Beiträge: 115

Wohnort: Osten

Beruf: Student Informationstechnik

  • Private Nachricht senden

3

25.05.2013, 16:06

teilweise, aber ich will das die grafik wechselt, also kreis, kreuz, kreis, kreuz, ein und aus und einblenden, das ist das generelle problem, je nach variable ich bekomm nur das ausblenden und wieder einblenden nicht hin .. das was du gepostet hast hab ich ja gemacht aber dann überschneiden sich ja die grafiken
Who are you? - I am a game designer.
No you are not! - I am a game designer.
What kind of a designer ? - I am a game designer.
You mean you play games ? - I am a game designer.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

4

25.05.2013, 16:13

Dann fülle die screen Surface zwischen dem Wechseln mit Weiß oder was auch immer und blitte erst dann die Grafik. ;)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
void switchTo() {
    Uint32 color = SDL_MapRGB(screen->format, 255, 255, 255); /// Farbe weiß
    SDL_FillRect(screen, NULL, color);
    if (var)
        SDL_BlitSurface(Kreuz, screen, ..., ...);
    else
        SDL_BlitSurface(Kreis, screen, ..., ...);
}
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Daedra22

Treue Seele

  • »Daedra22« ist der Autor dieses Themas

Beiträge: 115

Wohnort: Osten

Beruf: Student Informationstechnik

  • Private Nachricht senden

5

25.05.2013, 16:37

aber wird dann nicht der bildschirm schwarz ? ich mein ich hab doch ne grafik die drunter ist, das tic tac toe feld, welches darunter liegt, wird das dann nicht schwarz oder wie meinst du das ?
Who are you? - I am a game designer.
No you are not! - I am a game designer.
What kind of a designer ? - I am a game designer.
You mean you play games ? - I am a game designer.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

6

25.05.2013, 16:40

Ja wird es. Aber SDL_FillRect hat einen entsprechenden Parameter, mit dem du das Rechteck, dass überzeichnet werden soll, aussuchen kannst.
Bspw. Kreuz->clip_rect bote sich da an AFAIK: http://www.libsdl.org/docs/html/sdlsurface.html
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Daedra22

Treue Seele

  • »Daedra22« ist der Autor dieses Themas

Beiträge: 115

Wohnort: Osten

Beruf: Student Informationstechnik

  • Private Nachricht senden

7

27.05.2013, 10:08

ah ok ich habs hinbekommen, vielen dank, hab mir ein weißes rechteck erstellt und das zwischen dem anzeigen immer an der stelle blitten lassen sodass die grafiken sich nicht überlappen,

Ich hoffe aber, dass es nicht zu irgendwelchen memoryleaks oder leistungseinbußen kommt, weil ich ja die grafiken einfach übereinander klatsche.

Danke erst einmal dir Architekt für deine Hilfe, wenn ich weitere probleme habe, hoffe ich weiterhin auf dein schlaues köpfchen ^^
Who are you? - I am a game designer.
No you are not! - I am a game designer.
What kind of a designer ? - I am a game designer.
You mean you play games ? - I am a game designer.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

8

27.05.2013, 10:11

Sofern du die SDL_Surfaces nicht jedesmal in der Schleife erstellst, sollte das kein Problem sein. Ansonsten poste doch mal den betreffenden Code Ausschnitt. ;)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Daedra22

Treue Seele

  • »Daedra22« ist der Autor dieses Themas

Beiträge: 115

Wohnort: Osten

Beruf: Student Informationstechnik

  • Private Nachricht senden

9

27.05.2013, 11:05

while(run==true)
{
//SDL_BlitSurface(feld,NULL,screen,NULL);
while(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_MOUSEBUTTONDOWN:
{show=true;
x=event.motion.x;
y=event.motion.y;

} break;

case SDL_QUIT:
{
run=false;
}
break;
}

if(Reihe==true)
{
SDL_FillRect(screen,&Viereck,color);
SDL_BlitSurface(kreuz2,NULL,screen,&SpielerR);
}



if(Reihe==false)
{
SDL_FillRect(screen,&Viereck,color);
SDL_BlitSurface(kreis2,NULL,screen,&SpielerR);
}


}
} ( sind in ner while schleife, aber mit einer if abfrage kontrolliert)
Who are you? - I am a game designer.
No you are not! - I am a game designer.
What kind of a designer ? - I am a game designer.
You mean you play games ? - I am a game designer.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

10

27.05.2013, 11:56

Benutz nächstes mal bitte die entsprechenden Highlight BBCodes.
Und du scheinst die SDL_Surface's vor der while Schleife anzulegen und womöglich auch danach wieder freizugeben. Damit wäre dann alles paletti.

edit:
Sowas wie
while(run==true)
und
if(Reihe==true)
sowie
if(Reihe==false)

läst sich entsprechend einfacher ausdrücken:
while(run==true) => while(run)

if(Reihe==true) => if(Reihe)

if(Reihe==false) => if(!Reihe)

Aber das nur als kleiner Tipp. ;)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Werbeanzeige