[Hilfe]Gemalte Kreise auf Paintbox bei inaktiven Fenster wieder gelöscht
-
ok hab wie gesagt die Mal Funktion in die OnPaint Methode geschreiben
allerdings hab ich jetzt immernoch das problem dass bei eine klick auf die paintbox auf dem hintergrund der gemalt wurde ein kreis draufgemalt wird und wenn jetzt ein fenster darauf überlappt is der gemalte kreis wieder verschwunden.
das bedeutet ja was du sagst das wenn ein anderes fenster auf dem quad fenster überlappt dann wird der hintergrund durch die onpaint neu gezeichnet das impliziert aber das die kreise die auf dem hintergund gemalt wurden wieder übermalt werden. aber wie verhinder ich genau das...ich möchte ja sehen welche steine schon wo gesetzt wurdengruss
frankEDIT:
Ich hab hier mal nen Link auf dem is ein Screenshot davon zu sehen
dann isses verständlicher
http://www.quad.de.tc
-
Gut. Jetzt weiss ich worums geht.
Ich wuerde da wie folgt rangehen:
Du hast dein Feld. In diesem Feld gibt es eine bestimmte Anzahl von "Steinen" auf der X und Y Achse. Hier sind es jeweils elf.
Diese koennen, so wie ich das sehe, 5 verschiedene "Arten" annehmen.
( Eckstein, normal, blau, rot, weiss )
Fuer das gesamte Spielfeld wuerde ich mir jetzt ein zweidemensionales Array anlegen. Als Typ wuerde ich eine eigene struct ( SFeldStein ) nehmen. Dann wuerde das wie folgt aussehen.enum TYP { tEcke, tNormal, tRot, tBlau, tWeiss }; typedef struct { TYP Typ, } SFeldStein; SFeldStein[AnzahlX][AnzahlY];
Wobei 'AnzahlX' und 'AnzahlY' die Anzahl der Steine auf der X- und Y-Achse sind.
Im Spielverlauf aenderst du halt immer den Typen des gewuenschten Steins. In dem OnPaint Ereignis der PaintBox wuerde ich das jetzt wie folgt zeichnen./* [...] * Hintergrund zeichnen * [...] */ for( int x = 0; x < AnzahlX; x++ ) { for( int y = 0; y < AnzahlY; y++ ) { /* [...] * x- und y-Position des aktuellen Steins ausrechnen * [...] */ // Was fuer ein Stein ist zu zeichnen? switch( Steine[x][y].Typ ) { case tEcke: // Ecke zeichnen break; case tNormal: // Normalen Stein zeichnen break; case tRot: // roten Stein zeichnen break; case tBlau: // blauen Stein zeichnen break; case tWeiss: // weissen Stein zeichnen break; default: break; } } }
Also das waere meine Idee zur Loesung des Problems.
Vielleicht hilft es ja..
MfG Aoeke
-
zunächst möchte ich mich bedanken
ist nicht immer üblichen in foren dass so schnell
immer auf einen beitrag geantwortet wirdgenau wie haben 5 unterschiedliche steine
blocker, player1, player2, corner, empty
und ein enum hatten wir auchwir haben auch eine funktion drawPiece die genauso aufgebaut ist wie bei deiner lösung - mit cases.
Nur überprüfen wir nicht was für eine farbe der stein hat sondern man kann sich die farbe selbst wählen(itemindex).und intern arebieten wir nicht mit der farbe sondern mit dem typ piectype1 oder piectype2 dür die dementsprechenden spieler.ich hab wir du vorgeschlagen hast das zeichen der kreise jetzt auch in die onpaint methode reingehaun allerdings wird dann immer genau nur der zuletzt gesetzte stein angezeigt
-
"Speicherst" du die bereits gesetzten Steine auch irgendwie ab? Wenn ja wie?
Bei meiner "Idee" war es ja das mit dem Array. Wie macht ihr das?
MfG Aoeke
-
Ja wir speichern in eine 2D-Matrix vom Typ piecetype (enum)
wir haben eine add methode die überprüft ob die stelle "empty" ist oder "corner" falls er true zurürckgibt wird die Position xy und der Steintyp
gespeichert
-
Hm... Wie sieht die Schleife aus, mit der ihr die Steine zeichnet?
MfG Aoeke
-
ist eigentlich keine schleife
ist ein case
ich übergebe der funktion drawPieces(int,int,int)posx posy und player1.getColor() <-- liefert die farbe des dementsprechenden spielers)
int weil ich den am anfang durch switch(..->itemindex) abfrage
in der is wieder ein case mit der ich wieder zahl zu einer farbe mache (clWhite z.b.)
und dann kommt schon
Quad->paintbox->Canvas->Ellipse(x*40, y*40, x*40+40, y*40+40);das wars
-
Naja, wenn das keine Schleife ist, ist klar, dass er bloss einen Kreis zeichnet. Du musst dir die Positionen aller schon vorhandenen Kreise "merken" und in einer Schleife einen nach den anderen an der "gemerkten" Position zeichnen. So in der Art halt, wie ich es mit dem Array hatte.
MfG Aoeke
-
hmm das problem is nur das da einpaar funktionen noch daranhängen
beispielsweise checksqaure die schaut ob ein quadrat gefunden wurde
ich werd mir das noch genauer überlegen..muss aber langsam los
ich danke dir fürs erst für deine hilfe, wünsch dir einen guten rutsch
ins neue jahrbis nächste jahr
gruss
frank
-
Nagut. Dann denk drueber nach. Wuensch dir auch einen guten Rutsch.
MfG Aoeke
-
ich habs jetzt hinbekommen
habs auch verstanden... die onpaint is nur dafür da dass falls das fenster bewegt oder überlappt wird sich neu zeichnet.
d.h. meine normalen Malaktionen können unverändert bleiben nur wenn ich eben das fenster überlappe muss ich auf meine matrix zugreifen und wieder alles zeichnen lassenvielen danke für die hilfe
gruss
frank