Autor Beitrag
crackymouse
Hält's aus hier
Beiträge: 11

Win XP Prof.
Delphi 7
BeitragVerfasst: Sa 20.01.07 20:20 
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:

ausblenden 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
//alles löschen
  Brush.Color:= clwhite;
  pen.Color:=clwhite;
  Rectangle(0,0,form1.PaintBox1.Width,form1.PaintBox1.Height);

//essen malen
   Brush.Color:= clred;
   pen.Color:= clred;
   Rectangle(eat.x*15,eat.y*15,eat.x*15+15,eat.y*15+15);

//schlange malen
   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); //HIER KOMMT  DER FEHLER
  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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: Sa 20.01.07 20:34 
Wenn lange die Länge deines Arrays ist, muss die For-Schleife so aussehen:

ausblenden 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); //HIER KOMMT  DER FEHLER
  end;
end;


Weil die Array-Indizes laufen ja von 0 bis Länge-1 :)


MrSaint

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
crackymouse Threadstarter
Hält's aus hier
Beiträge: 11

Win XP Prof.
Delphi 7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 682

Mac OS X Snow Leopard
Xcode 3.1
BeitragVerfasst: So 21.01.07 01:33 
user profile iconcrackymouse hat folgendes geschrieben:

Jetz flackert es zwar immer mehr aber naja, das lässt sich hoffentlich beseitigen.


ausblenden Delphi-Quelltext
1:
2:
3:
.
 DoubleBuffered:= True;
.

in FormCreate könnte helfen.
crackymouse Threadstarter
Hält's aus hier
Beiträge: 11

Win XP Prof.
Delphi 7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1098
Erhaltene Danke: 13

Win7 geg. WInXP oder sogar Win98
Rad2007
BeitragVerfasst: So 21.01.07 16:48 
@user profile iconcrackymouse
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 Threadstarter
Hält's aus hier
Beiträge: 11

Win XP Prof.
Delphi 7
BeitragVerfasst: 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! :)