benötige Hilfe für mein Schachspiel[gelöst]

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

ClayC

Betreff: benötige Hilfe für mein Schachspiel[gelöst]

BeitragDi, Feb 17, 2009 11:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Ich hab ein Prob:

Nachdem ich bei meinem Spiel einen legalen Zug gemacht habe wird der Figurentyp(der erste Bauerweiß ist z.B. 11 der schwarze König -6) in ein 2-dimensionales Array geschrieben und danach wird das ganze Schachfeld neu gezeichnet das erfolgt über die Funktion Redraw

Code: [AUSKLAPPEN]
Function Redraw:Int (schacharray:Int[,])
Local Figurtypredraw:Int
Local XZwischenwertredraw:Int
Local YZwischenwertredraw:Int
Local XZahlvariable:Int
Local YZahlvariable:Int
Local Schachbrett:TImage = LoadImage("Schachbrett.png")

Cls
DrawImage Schachbrett:TImage, 40, 40 Flip

For XZahlvariable = 0 To 8
   For YZahlvariable = 0 To 8
         
      XZwischenwertredraw = XZahlvariable * 60
      YZwischenwertredraw = 540 - (60 * YZahlvariable)
      
      Figurtypredraw = schacharray[XZahlvariable, YZahlvariable]

         If Figurtypredraw = 21
            DrawImage Turmw, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
            
         End If
         
         If Figurtypredraw = -21
            DrawImage Turms, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
         End If
         
         If Figurtypredraw = 22
            DrawImage Turmw, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
            
         End If
         
         If Figurtypredraw = -22
            DrawImage Turms, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
         End If
         
         If Figurtypredraw = 31
            DrawImage Pferdw, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
            
         End If
         
         If Figurtypredraw = -31
            DrawImage Pferds, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
         End If
         
         If Figurtypredraw = 32
            DrawImage Pferdw, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
            
         End If
         
         If Figurtypredraw = -32
            DrawImage Pferds, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
         End If
         
         If Figurtypredraw = 41
            DrawImage Springerw, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
            
         End If
         
         If Figurtypredraw = -41
            DrawImage Springers, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
         End If
         
         If Figurtypredraw = 42
            DrawImage Springerw, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
            
         End If
         
         If Figurtypredraw = -42
            DrawImage Springers, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
         End If
         
         If Figurtypredraw = 5
            DrawImage Damew, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
            
         End If
         
         If Figurtypredraw = -5
            DrawImage Dames, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
         End If
         
         If Figurtypredraw = 6
            DrawImage Kingw, Int XZwischenwertredraw, Int YZwischenwertredraw Flip            
         End If
         
         If Figurtypredraw = -6
            DrawImage Kings, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
         End If
      
         If Figurtypredraw = 11
            DrawImage Bauerw, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
         End If
         
         If Figurtypredraw = 12
            DrawImage Bauerw, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
         End If
         
         If Figurtypredraw = 13
            DrawImage Bauerw, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
         End If
         
         If Figurtypredraw = 14
            DrawImage Bauerw, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
         End If
         
         If Figurtypredraw = 15
            DrawImage Bauerw, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
         End If
         
         If Figurtypredraw = 16
            DrawImage Bauerw, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
         End If
         If Figurtypredraw = 17
            DrawImage Bauerw, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
         End If
         If Figurtypredraw = 18
            DrawImage Bauerw, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
         End If
         
         If Figurtypredraw = -11
            DrawImage Bauers, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
         End If
         
         If Figurtypredraw = -12
            DrawImage Bauers, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
         End If
         
         If Figurtypredraw = -13
            DrawImage Bauers, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
         End If
         
         If Figurtypredraw = -14
            DrawImage Bauers, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
         End If
         
         If Figurtypredraw = -15
            DrawImage Bauers, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
         End If
         
         If Figurtypredraw = -16
            DrawImage Bauers, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
         End If
         If Figurtypredraw = -17
            DrawImage Bauers, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
         End If
         If Figurtypredraw = -18
            DrawImage Bauers, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
         End If
   Next
Next

End Function


Diese funktioniert soweit das Problem ist wenn ich das Spiel minimiere oder ein anderes Fenster hab ich immer irgendwelche Schnipsel oder "Fensterfetzen" von dem vorhin geöffnetetn, ist klar weil die Funktion nicht aufgerufen wird.
user posted image

user posted image

so sieht das dann aus...

Dann dachte ich mir ich mach das mit einem Timer somit wird die Funktion Redraw schnell hintereinander aufgerufen das Ergebnis war dass alle Grafiken geflackert haben ich schätz mal das liegt daran das die Funktion Redraw zu langsam ist oder?

Vl hat wer Vorschläge das ganze anders zu machen oder Tipps/Tricks um das auf dem Weg zu lösen

Danke schonmal für Hilfe
  • Zuletzt bearbeitet von ClayC am Do, Feb 19, 2009 20:41, insgesamt einmal bearbeitet

BladeRunner

Moderator

BeitragDi, Feb 17, 2009 11:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast nach jedem drawbefehl ein Flip, das ist schonmal voll daneben.
Der gängige Weg ist
cls
draw
draw
draw
flip
- also erst flip wenn alles eingezeichnet wurde, und nur ein flip in der Mainloop. Dann endet auch das Geflacker.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

ClayC

BeitragDi, Feb 17, 2009 11:38
Antworten mit Zitat
Benutzer-Profile anzeigen
BladeRunner hat Folgendes geschrieben:
Du hast nach jedem drawbefehl ein Flip, das ist schonmal voll daneben.
Der gängige Weg ist
cls
draw
draw
draw
flip
- also erst flip wenn alles eingezeichnet wurde, und nur ein flip in der Mainloop. Dann endet auch das Geflacker.


Ja auf die Idee hätt ich auch selber kommen können weil ich das sonst eh so gemacht hab. kA warum ich das in der Funktion so gemacht hab^^

aber das hatt mein Problem nicht gelöst, flackert noch immer...
 

Ava

Gast

BeitragDi, Feb 17, 2009 12:11
Antworten mit Zitat
Insgesamt ein sehr merkwürdiger Aufbau... Confused
Warum diese Verzögerung mit dem nur gelegentlichen Zeichnen? - okay, es ist nicht notwendig, aber würde es denn schaden? Rolling Eyes Ich vermute, dass Deine Darstellungsfehler mit dem Flip(-1) (entspricht der Standardeinstellung) zu tun haben könnten. Probier es mal mit einem Flip(True) (ggf. auch mal mit einem Flip(False), irgendwie unterscheidet sich das je nach Vollbild/Fenstermodus *gaga*). Kann aber auch sein, das VSync im Fenstermodus gar nicht funzed Question *überleg*. Naja, jedenfalls denke ich, Dein Problem liegt irgendwo hier! ^^
 

ClayC

BeitragDi, Feb 17, 2009 12:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ava hat Folgendes geschrieben:
Insgesamt ein sehr merkwürdiger Aufbau... Confused
Warum diese Verzögerung mit dem nur gelegentlichen Zeichnen? - okay, es ist nicht notwendig, aber würde es denn schaden?


was meinst du damit?

das mit Flip hab ich ausprobiert wenn ich Flip(1) mache zeichnet er es zwar auf eine andere Weise aber nur noch langsamer und damit mit mehr Flackern, und Standart ist -1

Xeres

Moderator

BeitragDi, Feb 17, 2009 12:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Könnte das mit der GUI zu tun haben? (MaxGUI?) Unregelmäßige Events -> Flackern?
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

ClayC

BeitragDi, Feb 17, 2009 12:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja ich habs mit der Maxgui gemacht, was meinst du mit Events?
Sollte eigentlich egal sein, wenn ich nämlich die Redraw-Funktion in der Timer Funktion aufrufe flackert es auch und das ist dann komplett unabhängig von der GUI
Code: [AUSKLAPPEN]

Function Timer()
Local Timer:TTimer

Timer = CreateTimer(10)

Repeat
   Print "Ticks=" + WaitTimer(Timer)
   Redraw(schachfeld)
Forever

End Function


so sieht die Timer Funktion aus die ich nur zum ausprobieren aus der Hilfe hab...
 

ClayC

BeitragDo, Feb 19, 2009 12:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem mit den "Fensterresten" wurde über Eventhooks gelöst. Very Happy

Aber wegen dem Flackern hab ich noch nichts herausgefunden

Ratchet

BeitragDo, Feb 19, 2009 14:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicht dass es an deiner Grafikkarte oder den Treibern liegt?
Hast du schon mal das Beispiel welches bei BM dabei ist probiert? Flackert es dort auch?
Eventuell mal mit SetGraphicsDriver DirectX/OpenGL ausprobieren.
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro]
 

ClayC

BeitragDo, Feb 19, 2009 15:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ratchet hat Folgendes geschrieben:
Nicht dass es an deiner Grafikkarte oder den Treibern liegt?
Hast du schon mal das Beispiel welches bei BM dabei ist probiert? Flackert es dort auch?
Eventuell mal mit SetGraphicsDriver DirectX/OpenGL ausprobieren.


An meinem PC liegt es nicht habs auf anderen ausprobiert da flackerts auch.
Welches Bsp meinst du, also zu welchem Thema?

Das mit SetDraphicsDriver werd ich heut noch ausprobiern

Ratchet

BeitragDo, Feb 19, 2009 16:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Dieses Beispiel: ...\BlitzMax\samples\maxgui\glcube.bmx

EDIT: Äh, warum lädst du das Schachbrett Image jedesmal neu wenn du die Funktion aufrufst?
Code: [AUSKLAPPEN]
Function Redraw:Int (schacharray:Int[,])
...
Local Schachbrett:TImage = LoadImage("Schachbrett.png")
...
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro]
 

ClayC

BeitragDo, Feb 19, 2009 17:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Cube-Beispiel flackert nicht, am Treiber liegt es auch nicht und weil ich in der Zeile über dem "drawimage schachbrett" cls stehen habe zeichne ich es immer neu, nur um das mal zu klären.

Hab mir die Funktion nochmal näher angeschaut und hab ganz vergessen zu sagen dass NUR die Figuren flackern, also das Schachfeld flackert nicht und viel Logik braucht man dann nicht um zu erkennen dass das Problem an den Schleifen liegt. Also ich vermute dass die irgendwie zu langsam sind, kann das sein?

Code: [AUSKLAPPEN]
For XZahlvariable = 0 To 8
   For YZahlvariable = 0 To 8


Code: [AUSKLAPPEN]
   If Figurtypredraw = 21


Hat wer eine Idee das ganze zu verschnellern also ich hoffe die Funktion ist klar, 21 ist der turm und mittles den for werden die felder im array "durchsucht" und wenn dort im array 21 steht wird auf diese stelle der turm gezeichnet.
Code: [AUSKLAPPEN]

XZwischenwertredraw = XZahlvariable * 60
      YZwischenwertredraw = 540 - (60 * YZahlvariable)


mit denen zwei Zeilen werden die Pixel für den Drawimage-Befehl berechnet

Also meiner Meinung nach ist die Funktion zu langsam aber keine Ahnung was man dagegen machen kann.

Eine Frage hab ich noch zum Flip-Befehl:
In der Hilfe zu Flip steht "If sync is -1 and the current graphics object was NOT created with the Graphics command, then the flip will occur on the next vertical blank. "
was ist mit vertical blank gemeint ich dachte an nicht verwendete Pixel bin mir aber nicht sicher bzw. verstehe den Sinn nicht.

Xeres

Moderator

BeitragDo, Feb 19, 2009 18:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Das...
Code: [AUSKLAPPEN]
Figurtypredraw = schacharray[XZahlvariable, YZahlvariable]

If Figurtypredraw = 21
   DrawImage Turmw, Int XZwischenwertredraw, Int YZwischenwertredraw Flip
End If

lässt sich verkürzen zu
Code: [AUSKLAPPEN]
Select schacharray[XZahlvariable, YZahlvariable]
   Case 21; DrawImage(Turmw, XZwischenwertredraw, YZwischenwertredraw)
      [...]
End Selec

Die beiden Verschachtelten Schleifen sind in keinem Fall zu langsam, wenn man keine groben Fehler macht.
- Alles vor beginn der Hauptschleife Laden.
- CLS 1x bevor der neue Frame gezeichnet wird, Flip 1x nachdem alles gezeichnet wurde...
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

amon

BeitragDo, Feb 19, 2009 19:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
DrawImage Schachbrett:TImage, 40, 40 Flip


Ist das Flip dort ein Tipfehler oder wirklich noch immer drinnen?
 

ClayC

BeitragDo, Feb 19, 2009 20:15
Antworten mit Zitat
Benutzer-Profile anzeigen
amon hat Folgendes geschrieben:
Code: [AUSKLAPPEN]
DrawImage Schachbrett:TImage, 40, 40 Flip


Ist das Flip dort ein Tipfehler oder wirklich noch immer drinnen?


nein das ist schon lange weg

aktueller code:
Code: [AUSKLAPPEN]
Function Redraw:Int (schacharray:Int[,])
   Local XZwischenwertredraw:Int
   Local YZwischenwertredraw:Int
   Local XZahlvariable:Int
   Local YZahlvariable:Int

   Playertoggle(WerIstDran)
   Cls
   
   DrawImage Schachbrett:TImage, 0, 0

   For XZahlvariable = 0 To 8
      For YZahlvariable = 0 To 8
         
         XZwischenwertredraw = (60 * XZahlvariable) - 40
         YZwischenwertredraw = 500 - (60 * YZahlvariable)
         
         Select schacharray[XZahlvariable, YZahlvariable]
         
            Case 21 DrawImage Turmw, XZwischenwertredraw, YZwischenwertredraw
               Case - 21 DrawImage Turms, XZwischenwertredraw, YZwischenwertredraw
            Case 22 DrawImage Turmw, XZwischenwertredraw, YZwischenwertredraw
            Case - 22 DrawImage Turms, XZwischenwertredraw, YZwischenwertredraw
            
            Case 31 DrawImage Pferdw, XZwischenwertredraw, YZwischenwertredraw
            Case - 31 DrawImage Pferds, XZwischenwertredraw, YZwischenwertredraw
            Case 32 DrawImage Pferdw, XZwischenwertredraw, YZwischenwertredraw
            Case - 32 DrawImage Pferds, XZwischenwertredraw, YZwischenwertredraw
         
            Case 41 DrawImage Lauferw, Int XZwischenwertredraw, Int YZwischenwertredraw
            Case - 41 DrawImage Laufers, Int XZwischenwertredraw, Int YZwischenwertredraw
            Case 42 DrawImage Lauferw, Int XZwischenwertredraw, Int YZwischenwertredraw
            Case - 42 DrawImage Laufers, Int XZwischenwertredraw, Int YZwischenwertredraw
         
            Case 5 DrawImage Damew, Int XZwischenwertredraw, Int YZwischenwertredraw
            Case - 5 DrawImage Dames, Int XZwischenwertredraw, Int YZwischenwertredraw
         
            Case 6 DrawImage Kingw, Int XZwischenwertredraw, Int YZwischenwertredraw
            Case - 6 DrawImage Kings, Int XZwischenwertredraw, Int YZwischenwertredraw
            
            Case 11 DrawImage Bauerw, Int XZwischenwertredraw, Int YZwischenwertredraw
            Case 12 DrawImage Bauerw, Int XZwischenwertredraw, Int YZwischenwertredraw
            Case 13 DrawImage Bauerw, Int XZwischenwertredraw, Int YZwischenwertredraw
            Case 14 DrawImage Bauerw, Int XZwischenwertredraw, Int YZwischenwertredraw
            Case 15 DrawImage Bauerw, Int XZwischenwertredraw, Int YZwischenwertredraw
            Case 16 DrawImage Bauerw, Int XZwischenwertredraw, Int YZwischenwertredraw
            Case 17 DrawImage Bauerw, Int XZwischenwertredraw, Int YZwischenwertredraw
            Case 18 DrawImage Bauerw, Int XZwischenwertredraw, Int YZwischenwertredraw
            
            Case - 11 DrawImage Bauers, Int XZwischenwertredraw, Int YZwischenwertredraw
            Case - 12 DrawImage Bauers, Int XZwischenwertredraw, Int YZwischenwertredraw
            Case - 13 DrawImage Bauers, Int XZwischenwertredraw, Int YZwischenwertredraw
            Case - 14 DrawImage Bauers, Int XZwischenwertredraw, Int YZwischenwertredraw
            Case - 15 DrawImage Bauers, Int XZwischenwertredraw, Int YZwischenwertredraw
            Case - 16 DrawImage Bauers, Int XZwischenwertredraw, Int YZwischenwertredraw
            Case - 17 DrawImage Bauers, Int XZwischenwertredraw, Int YZwischenwertredraw
            Case - 18 DrawImage Bauers, Int XZwischenwertredraw, Int YZwischenwertredraw
         
            End Select
         Flip
      Next
   Next   
End Function


ich habs schon mal mit einer select-case gemacht und zur sicherheit jetzt gleich nochmal aber das Ergebnis ist das gleiche Sad

Edit: Die Bilder werden alle außerhalb der Hauptschleife geladen und dieser Cls, also in dieser Funktion, ist bis auf einen anderen der nur durch die GUI ausgelöst werden kann der einzige

Xeres

Moderator

BeitragDo, Feb 19, 2009 20:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Flip hat nichts innerhalb der verschachtelten schleife zu suchen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

ClayC

BeitragDo, Feb 19, 2009 20:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Xeres hat Folgendes geschrieben:
Flip hat nichts innerhalb der verschachtelten schleife zu suchen.


uiuiui das wars super danke Xeres!

und natürlich auch vielen dank an all die anderen die sich meinem problem angenommen haben

Xeres

Moderator

BeitragDo, Feb 19, 2009 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
...was dir BladeRunner schon im 1. Post mitgeteilt hatte Exclamation
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

ClayC

BeitragFr, Feb 20, 2009 12:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Xeres hat Folgendes geschrieben:
...was dir BladeRunner schon im 1. Post mitgeteilt hatte Exclamation


Eigentlich schon... Rolling Eyes

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group