Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - snake - Canvas - komischer fehler
crackymouse - Sa 20.01.07 20:20
Titel: snake - Canvas - komischer fehler
HiDiHo,
Wir sollen für die Schule bis Montag nen Spieleklassiker Programieren, hab mich für Snake entschieden was auch erstmal ganz gut Funktioniert...
Wäre da nicht folgender fehler: Nach einiger Zeit, wenn die snake schon etwas länger ist, erscheint irgendwo ein stück schlange (ein kästchen groß). Wenn snake dann isst bekomme ich vom debugger eine zugriffsverletzung
in der Markierten zeilen.
Ich hab einfach nen recordarray mit x u. y werten genommen der dann immer um eins nach vorne gerollt wird sozusagen und wenn snake ein rotes isst vorher um eins verlängert wird. Zeichnen tu ich mittels Canvas(in eine Paintbox) mit folgender prozedur:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| procedure malen(Sender: TObject); var i:integer; begin with form1.PaintBox1.Canvas do begin Brush.Color:= clwhite; pen.Color:=clwhite; Rectangle(0,0,form1.PaintBox1.Width,form1.PaintBox1.Height);
Brush.Color:= clred; pen.Color:= clred; Rectangle(eat.x*15,eat.y*15,eat.x*15+15,eat.y*15+15);
Brush.Color:= clgreen; pen.Color:= clgreen; for i:=0 to lange do begin Rectangle(snake[i].x*15,snake[i].y*15,snake[i].x*15+15,snake[i].y*15+15); end; end; end; |
Woran kann das liegen? ist der array irgendwie zu lang? Mein timer steht auf 100 das is doch nicht zu schnell oder?
Falls jemand ne idee hat her damit, kann auch nen screenshot machen nach bedarf.
Thx im vorraus
lg cracky
MrSaint - Sa 20.01.07 20:34
Wenn lange die Länge deines Arrays ist, muss die For-Schleife so aussehen:
Delphi-Quelltext
1: 2: 3: 4: 5:
| for i:=0 to lange - 1 do begin Rectangle(snake[i].x*15,snake[i].y*15,snake[i].x*15+15,snake[i].y*15+15); end; end; |
Weil die Array-Indizes laufen ja von 0 bis Länge-1 :)
MrSaint
crackymouse - Sa 20.01.07 20:49
DANKE MrSaint!
das wars wirklich!!!!! :?
Da hät ich selbst drauf kommen können irgendwie...
schon komisch das es ne zeitlang so funktioniert hat :wink:
Jetz flackert es zwar immer mehr aber naja, das lässt sich hoffentlich beseitigen.
thx nochmal :D
lg cracky
Dunkel - So 21.01.07 01:33
crackymouse hat folgendes geschrieben: |
Jetz flackert es zwar immer mehr aber naja, das lässt sich hoffentlich beseitigen.
|
Delphi-Quelltext
1: 2: 3:
| . DoubleBuffered:= True; . |
in FormCreate könnte helfen.
crackymouse - So 21.01.07 13:48
Danke Dunkel :)...
...aber das hab ich schon, flimmert trotzdem wenn der array mal länger als sagen wir 14 ist :(
trotzdem thx
lg cracky
Tilo - So 21.01.07 16:48
@
crackymouse
Wie zeichnest Du die Schlange wen sich die Position ändert? Die komplette Schlange? Es würde doch reichen den Kopf zu versetzen, den Schwanz zu löschen und an der alten Stelle des Kopfes ein Körperelement zeichen wenn es sich vom Kopf unterscheidet. So minimierst Du die Anzahl der Zeichnenoperationen und es filmmert weniger.
crackymouse - Mi 24.01.07 18:23
Hi Tilo,
Ich hatte dir eigentlich(dachte ich) geantwortet, komischerweise ist der post irgendwie nich angekommen :( sry...
hol das jetz nach..
Das Problem mit dem Flimmern konnte ich dann doch anders lösen, mit repaint anstadt einer extra prozedur!
hätte nicht gedacht das das nen unterschied macht!
Trotzdem Danke, gute idee! :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!