Autor Beitrag
AlexN
Hält's aus hier
Beiträge: 4

WIN XP
D6 Pers
BeitragVerfasst: 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:

ausblenden volle Höhe 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:
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
    { Private-Deklarationen }
  public
  procedure pause (Millisek:LongInt);
    { Public-Deklarationen }
  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; // Anfangs Score auf Null setzen
Turtle1.TurtleHeight:=(5);  // Turtle Hoehe anpassen
Turtle1.PU;                 // Pen nach oben, sonst zeichnet er
Abstand:=15;
Level_Anzeige.Picture:=Level1.Picture; // Erstes Level Picture (Level1) in Level_Anzeige laden
Score_lbl.Color:=$6B4318; // Score Label Farbe dem Hintergrund anpassen /umgekehrte RGB Schreibweise
Panel1.Color:=$6B4318; // Panel Hintergrundfarbe dem Panel Bild angleichen
Form1.Color:=$6B4318; // Form Hintergrundfarbe festlegen
Score_lbl.Caption:=inttostr(Score);





end;


procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 if key = 38 then //falls Nach-Oben Taste gedrückt wird, geh nach vorne
 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 // falls Nach-Unten Taste gedrückt wird, geh nach hinten
 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 // falls Nach-Links Taste gedrückt wird, drehe nach links
 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 // falls Nach-Rechts Taste gedrückt wird, drehe nach rechts
 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 // Wenn über Credits gefahren wird, hover Bild anzeigen
end;

procedure TForm1.StartClick(Sender: TObject);
begin
Turtle1.LoadPic('laby1_test.bmp'); // Erstes Level Bild laden
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106



BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
...
if key = 38 then //falls Nach-Oben Taste gedrückt wird, geh nach vorne 
 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 Threadstarter
Hält's aus hier
Beiträge: 4

WIN XP
D6 Pers
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106



BeitragVerfasst: 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:
ausblenden 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



BeitragVerfasst: 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