| Autor |
Beitrag |
AlexN
Hält's aus hier
Beiträge: 4
WIN XP
D6 Pers
|
Verfasst: Mi 21.01.04 21:47
Hallo!
Ich möchte ein Labyrinth Spiel mit Hilfe einer Turtle realisieren. Nun habe ich ein Problem: Die Turtle flitzt über ein Hintergrundbild und ihr Weg wird durch schwarze Wände blockiert (d.h. wenn sie die Farbe schwarz erkennt, geht sie immer wieder einen Schritt nach hinten). Nun will ich aber, dass die Turtle ein neues Hintergrundbild lädt, wenn sie auf die Farbe rot trifft. Dies soll während der gesamten Laufzeit geschehen. Ich habe versucht, dies mit Hilfe des Befehls Get Tick Count zu realisieren, aber es klappt nicht so wirklich. Hier ist der 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: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164:
| unit labyrinth_pascal;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Turtle, ExtDlgs;
type TForm1 = class(TForm) Turtle1: TTurtle; Panel1: TPanel; Panel_hg: TImage; Credits_normal: TImage; Credits_hover: TImage; Level_Anzeige: TImage; Level1: TImage; Level2: TImage; Level3: TImage; Score_Image: TImage; Score_lbl: TLabel; blind: TImage; Start: TImage; procedure FormCreate(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure Credits_normalMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure StartClick(Sender: TObject);
private public procedure pause (Millisek:LongInt); end;
var Form1: TForm1; Score: integer; Abstand: integer; u:real; v:real; Pos1X:integer; Pos1Y:integer; Pos2X:integer; Pos2Y:integer; Pos3X:integer; Pos3Y:integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin Score:=0; Turtle1.TurtleHeight:=(5); Turtle1.PU; Abstand:=15; Level_Anzeige.Picture:=Level1.Picture; Score_lbl.Color:=$6B4318; Panel1.Color:=$6B4318; Form1.Color:=$6B4318; Score_lbl.Caption:=inttostr(Score);
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if key = 38 then begin Turtle1.FD(1); if Turtle1.FoundColor(Abstand,90,clBlack) then Turtle1.BK(1); begin if Abstand<1 then Turtle1.BK(1); end; end
else if key = 40 then begin Turtle1.BK(1); if Turtle1.FoundColor(Abstand,90,clBlack) then Turtle1.BK(2); begin if Abstand<5 then Turtle1.BK(1); end; end
else if key = 39 then begin Turtle1.RT(45); if Turtle1.FoundColor(Abstand,90,clBlack) then Turtle1.BK(2); begin if Abstand<5 then Turtle1.BK(1); end; end
else if key = 37 then begin Turtle1.LT(45); if Turtle1.FoundColor(Abstand,90,clBlack) then Turtle1.BK(2); begin if Abstand<5 then Turtle1.BK(1); end; end
end;
procedure TForm1.Credits_normalMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin Credits_normal.Picture:=Credits_normal.Picture end;
procedure TForm1.StartClick(Sender: TObject); begin Turtle1.LoadPic('laby1_test.bmp'); Pos1X:=-46; Pos1Y:=365; u:=Pos1X; v:=Pos1Y; Turtle1.MoveXY(u,v); Turtle1.LT(90); Start.Visible:=false; Showmessage ('Bewege Dich zum roten Ziel und sammle auf Deinem Weg möglichst viele Punkte!');
end; procedure TForm1.pause(Millisek:LongInt); var Start: LongInt; begin Start := GetTickCount; while Start+Millisek>GetTickCount do begin if Turtle1.FoundColor(Abstand,90,$FF0000) then Turtle1.LoadPic('laby2.bmp'); end;
end;
end. |
Ich bin euch für jede Antwort dankbar.
Alex
|
|
Visum
      
Beiträge: 106
|
Verfasst: Mi 21.01.04 22:43
Hi,
entweder du überprüfst die Farben in einem Timer mit kleinem Intervall oder schneller und einfacher: du prüfst einfach in der selben Prozedur, die auch die Bewegungen prüft, ob du auf ein rotes Feld gekommen bist, denn schließlich kannst du nur ein rotes Feld erreichen, wenn du dich bewegst
Sähe dann (für nach vorne) ungefähr so aus: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| ... if key = 38 then begin Turtle1.FD(1); if Turtle1.FoundColor(Abstand,90,clBlack) then Turtle1.BK(1); begin if Abstand<1 then Turtle1.BK(1); end; if Turtle1.FoundColor(Abstand,90,$FF0000) then Turtle1.LoadPic('laby2.bmp'); end ... |
Gruß v!sum
|
|
AlexN 
Hält's aus hier
Beiträge: 4
WIN XP
D6 Pers
|
Verfasst: Do 22.01.04 13:26
Cool, das funktioniert. Aber irgendwie wird die Turtle beim Durchlaufen des Labyrinths immer langsamer. Kannst du mir nochmal die Variante mit dem Timer als Quelltext hier darstellen?
Danke
AlexN
|
|
Visum
      
Beiträge: 106
|
Verfasst: Do 22.01.04 14:52
Hi,
um das ganze per Timer zu machen setzt du bei einem Timer das Intervall auf z.B. 1, sodass er jede millisekunde prüft, und schreibst dann in das onTimer-Event deinen Code zum überprüfen: Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure TForm1.Timer1Timer(Sender: TObject); begin if Turtle1.FoundColor(Abstand,90,$FF0000) then Turtle1.LoadPic('laby2.bmp'); end; |
Hierbei muss er aber viel mehr unnötige Abfragen durchführen, als nötig, was das ganze eigentlich unnötig langsamer macht.
Warum die Turtle mit der Zeit langsamer wird kann ich so nicht sehen.
gruß v!sum
_________________ Was blubbert kommt in den Teich!
|
|
uruz
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 09.02.04 12:09
reine mutmassung meinerseits, da ich diese "turtle" ned kenne...
bislang habe ich immer nur "gelesen", dass eine Bitmap geladen wird... wenn du die im speicher behaeltst und dann eine neue laedst, wird die Anwendung natuerlich riesig gross im speicher...
ggf. vielleicht den speicher freigeben ?
uruz
|
|
|