[Hilfe]Gemalte Kreise auf Paintbox bei inaktiven Fenster wieder gelöscht



  • Frankstar schrieb:

    und dann hab ich bei Quad->paintbox->OnPaint die methode FromCreate ausgewählt

    Da, wo du das jetzt eingetragen hast, nimmst du den Text wieder raus. Dann doppelklickst du in dieses Eingabefeld. Dann muesste eine neue Funktion erstellt werden. In diese schreibst du den ganzen Zeichenkram.
    MfG Aoeke

    <edit>Das was ich geschrieben habe, trifft natuerlich nur zu, wenn du mit 'ausgewaehlt' das im Objektinspektor meinst.</edit>



  • ganz ehrlich ich bin zu blöd die methode OnPaint zu finden
    ich sitzt wohl scho nzu lange davor

    sorry das du dich heut abend noch mit so einer leuchte abgeben musst 😞

    EDIT:

    ohh hab erst jetzt Aoeke gelesen, danke jetzt hab ich die methode offen



  • hmm jetzt hat sich nicht viel verändert
    ich hab jetzt in OnPaint die hintergundzeichnung drin
    allerings wenn ich jetzt das fenster bei gedrückter masutaste verschiebe
    bleiben die kreis drauf, wenn ich über den rand fahre verschwinden sie wieder
    oder wenn ich ein anderes fenster öffne

    es ist ja so der hintergrund muss ja eigentlich nur 1x gemalet werden
    nämlich beim spielstart, d.h. doch ich muss die kreise die ich zeichne in die onPaint methode aber das geht ja mnciht weil die funktion doch immer explizit
    aufgerufen wird.

    wird echt langsam zu spät 😞

    aber vielen dank an euch beide das ihr mir noch zu später stunde hilft!!



  • Frankstar schrieb:

    [...] es ist ja so der hintergrund muss ja eigentlich nur 1x gemalet werden nämlich beim spielstart [...]

    Nein eben nicht. Denn wenn ein anderes Fenster deins ueberlappt, dann musst du den Hintergrund nochmal neu zeichnen. Also das muss in die OnPaint Methode.

    MfG Aoeke



  • 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