[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 wurden

    gruss
    frank

    EDIT:
    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 wird

    genau wie haben 5 unterschiedliche steine
    blocker, player1, player2, corner, empty
    und ein enum hatten wir auch 😃

    wir 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 jahr

    bis 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 lassen

    vielen danke für die hilfe
    gruss
    frank


Anmelden zum Antworten