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



BeitragVerfasst: Mi 17.05.17 19:56 
Hallo,

ich brauche Hilfe bei der Programmierung eines Games in Lazarus, das wir im Informatikunterricht entwickeln sollen.
Ich programmiere hier "Rush Hour", das Spiel, wo man durch das Verschieben von Fahrzeugen ein Taxi/Krankenwagen oder ähnliches aus
dem Spielbereich bugsieren muss. Die grundlegenden Sachen habe ich schon programmiert. Die Fahrzeuge bewegen sich nur auf einer Achse und
bleiben in dem Spielfeld.

Mein Problem ist jetzt, dass man hierfür auch Kollisionen braucht :autsch: , damit die Fahrzeuge sich nicht "überfahren".
Von Kollisionen hab ich leider keine Ahnung und ich muss, wie es sich für eine schulische Ausarbeitung gehört, den Kram auch selber verstehen,
um ihn dann auch selber erklären zu können. :nixweiss:

Es wäre echt nett, wenn mir jmd vielleicht ein paar Denkansätze oder Ideen liefern könnte, die mir dabei helfen. :D
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1376
Erhaltene Danke: 193


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mi 17.05.17 21:16 
Kollisionen sind die Angleichung von Position(skoordinat)en.

Wie wäre es mit dem Veröffentlichen ein wenig Quelltextes, am besten compilierbare Teile des Projektes oder dieses gar komplett?
SkyCracker Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 17.05.17 21:30 
Klar, du kannst den Quellcode gerne haben. Ist vielleicht manchmal etwas umständlich programmiert, aber so war's am Leichtesten für mich alles zu verstehen.
Ich hoffe, dass das alles halbwegs gut zu überblicken ist. ILKW, ITaxi und IAuto sind hierbei die bewegbaren Objekte. Die Buttons sind irrelevant. Die hab ich nur vorrübergehend als Spielrandmarkierungen "missbraucht", solang ich noch kein gutes Spielfeld gefunden/gemacht habe :roll: .

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:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
unit uLevel1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls;

type

  { TFLevel1 }

  TFLevel1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    IAuto3: TImage;
    ILKW1: TImage;
    ILKW2: TImage;
    IAuto1: TImage;
    ILKW3: TImage;
    ILKW4: TImage;
    IAuto2: TImage;
    ITaxi: TImage;
    ISpielfeld: TImage;



    procedure FormCreate(Sender: TObject);
    procedure IAuto1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure IAuto1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer
      );
    procedure IAuto1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure IAuto2MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure IAuto2MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer
      );
    procedure IAuto2MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure IAuto3MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure IAuto3MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer
      );
    procedure IAuto3MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure ILKW1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure ILKW1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer
      );
    procedure ILKW1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure ILKW2MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure ILKW2MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer
      );
    procedure ILKW2MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure ILKW3MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure ILKW3MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer
      );
    procedure ILKW3MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure ILKW4MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure ILKW4MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer
      );
    procedure ILKW4MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure ISpielfeldClick(Sender: TObject);
    procedure ITaxiMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure ITaxiMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer
      );
    procedure ITaxiMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { private declarations }
  public
     MTaxiDown: Boolean;
     MTaxiPos:TPoint;

     MAuto1Down:Boolean;
     MAuto1Pos:TPoint;

     MAuto2Down:Boolean;
     MAuto2Pos:TPoint;

     MAuto3Down:Boolean;
     MAuto3Pos:TPoint;

     MLkw1Down:Boolean;
     MLkw1Pos:TPoint;

     MLkw2Down:Boolean;
     MLkw2Pos:TPoint;

     MLkw3Down:Boolean;
     MLkw3Pos:TPoint;

     MLkw4Down:Boolean;
     MLkw4Pos:TPoint;
  end;

var
  FLevel1: TFLevel1;

implementation

{$R *.lfm}

{ TFLevel1 }


procedure TFLevel1.FormCreate(Sender: TObject);
begin
  If  then begin

  end;
end;


procedure TFLevel1.IAuto1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  MAuto1Down:=true;
  MAuto1Pos:= Point (X,Y);
end;

procedure TFLevel1.IAuto1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if MAuto1Down then begin
    IAuto1.Left:= IAuto1.Left + X;
  end;
  If IAuto1.Left < 50 then begin
    IAuto1.Left:=50
  end;
  If IAuto1.Left > 250 then begin
    IAuto1.Left:=250
  end;
end;

procedure TFLevel1.IAuto1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  MAuto1Down:=false;
end;


procedure TFLevel1.IAuto2MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  MAuto2Down:=true;
  MAuto2Pos:= Point (X,Y);
end;

procedure TFLevel1.IAuto2MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if MAuto2Down then begin
    IAuto2.Top:= IAuto2.Top + Y;
  end;
  If IAuto2.Top < 50 then begin
    IAuto2.Top:=50
  end;
  If IAuto2.Top > 250 then begin
    IAuto2.Top:=250
  end;
end;

procedure TFLevel1.IAuto2MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  MAuto2Down:=false;
end;


procedure TFLevel1.IAuto3MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  MAuto3Down:=true;
  MAuto3Pos:= Point (X,Y);
end;

procedure TFLevel1.IAuto3MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if MAuto3Down then begin
    IAuto3.Top:= IAuto3.Top + Y;
  end;
  If IAuto3.Top < 50 then begin
    IAuto3.Top:=50
  end;
  If IAuto3.Top > 250 then begin
    IAuto3.Top:=250
  end;
end;

procedure TFLevel1.IAuto3MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  MAuto3Down:=false;
end;


procedure TFLevel1.ILKW1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  MLkw1Down:=true;
  MLkw1Pos:= Point (X,Y);
end;

procedure TFLevel1.ILKW1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if MLkw1Down then begin
    ILkw1.Top:= ILkw1.Top + Y;
  end;
  If ILkw1.Top < 50 then begin
    ILkw1.Top:=50
  end;
  If ILkw1.Top > 200 then begin
    ILkw1.Top:=200
  end;
end;

procedure TFLevel1.ILKW1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  MLkw1Down:=false;
end;


procedure TFLevel1.ILKW2MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  MLkw2Down:=true;
  MLkw2Pos:= Point (X,Y);
end;

procedure TFLevel1.ILKW2MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if MLkw2Down then begin
    ILkw2.Top:= ILkw2.Top + Y;
  end;
  If ILkw2.Top < 50 then begin
    ILkw2.Top:=50
  end;
  If ILkw2.Top > 200 then begin
    ILkw2.Top:=200
  end;
end;

procedure TFLevel1.ILKW2MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  MLkw2Down:=false;
end;


procedure TFLevel1.ILKW3MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  MLkw3Down:=true;
  MLkw3Pos:= Point (X,Y);
end;

procedure TFLevel1.ILKW3MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if MLkw3Down then begin
    ILkw3.Left:= ILkw3.Left + X;
  end;
  If ILkw3.Left < 50 then begin
    ILkw3.Left:=50
  end;
  If ILkw3.Left > 200 then begin
    ILkw3.Left:=200
  end;
end;

procedure TFLevel1.ILKW3MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  MLkw3Down:=false;
end;


procedure TFLevel1.ILKW4MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  MLkw4Down:=true;
  MLkw4Pos:= Point (X,Y);
end;

procedure TFLevel1.ILKW4MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if MLkw4Down then begin
    ILkw4.Left:= ILkw4.Left + X;
  end;
  If ILkw4.Left < 50 then begin
    ILkw4.Left:=50
  end;
  If ILkw4.Left > 200 then begin
    ILkw4.Left:=200
  end;
end;

procedure TFLevel1.ILKW4MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  MLkw4Down:=false;
end;

procedure TFLevel1.ISpielfeldClick(Sender: TObject);
begin

end;


procedure TFLevel1.ITaxiMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  MTaxiDown:= true;
  MtaxiPos:=Point(X , Y);

end;

procedure TFLevel1.ITaxiMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if MTaxiDown then begin
    ITaxi.Left:= ITaxi.Left + X;
  end;

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1376
Erhaltene Danke: 193


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mi 17.05.17 22:04 
Naja, so meinte ich da eigentlich nicht, zumindest nicht in erster Linie.

Zunächst einmal ist es eine klitzekleine kleine optische Hilfe, den Quelltext als solchen zu kennzeichnen, d.h., mit entsprechenden Steuerzeichen zu umhüllen. Man findet diese unter "Entwürfe".

Soweit ich diesen Quelltext überschaue, tut er ziemlich wenig. Er korrigiert Spielfeldübertretungen, also positioniert wieder richtig. Evtl. sind auch Fahrzeugverschiebungen enthalten. Mehr kann ich auf die Schnelle nicht erkennen.

Dazu wäre eben das komplette Projekt hilfreicher.


Zuletzt bearbeitet von Delphi-Laie am Mi 17.05.17 23:51, insgesamt 1-mal bearbeitet
SkyCracker Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 17.05.17 22:50 
Erstmal Danke für die Antwort,

das mit der Ordnung merk ich mir für nächste mal. Im Moment ist das so gehalten, weil unser Lehrer das so will und ich es mir damit nicht versauen will.^^

Prinzipiell hast du recht. Es sind im Game erst Positionierungen, Bewegungen und so kleinere Sachen erledigt. So viel wie man halt nach einem halbem Schuljahr selber bewerkstelligen kann. Und es ist wahrscheinlich oft umständlicher gemacht als nötig. :shock:
Funktionieren wird im Game übrigens nur Level 1, da wir erst die "Engine" programmieren und vor allem ausprobieren wollten, bevor wir die auf die Level anwenden. Von daher ist es auch kein grafisches Meisterwerk(Noch nicht) und viel noch notdürftig improvisiert zum Testen.:wink:

Ich hoffe mal, da ist alles dabei, was gebraucht wird.
Einloggen, um Attachments anzusehen!
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1641
Erhaltene Danke: 302

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mi 17.05.17 23:17 
Guten Abend SkyCracker und Willkommen,

es ist ein bisschen "unordentlich" und so viele Mouse-Ereignisse und Variablen wären nicht notwendig.
Es würde übersichtlicher werden, wenn du dir 1-2 eigenständige Methoden überlegst, die die horizontale und/oder vertikale Verschiebung der Fahrzeuge(TImage) regeln.
Diese wird/werden in einem gemeinsamen OnMouseDown/Up/Move Ereignis aufgerufen.

Bezüglich der Kollisionen:
- 2D Kollisionserkennung
- Pixelgenaue Kollision

Für dich wäre die Rechtecks-Kollision interessant. Die ist etwas ungenau, dafür einfach in der Umsetzung und man kann es bis zu einem gewissen Maß optimieren.

_________________
„Wo andere blind der Wahrheit folgen, denk daran ... Nichts ist wahr!" (Assassin's Creed I-II)
SkyCracker Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 18.05.17 07:08 
Hallo Frühlingsrolle,

Danke für die Links. Die sind schon mal sehr hilfreich. Dann probier ich mit euren Vorschlägen mal etwas herum und melde mich hier vielleicht nochmal, wenn ich doch wieder am Verzweifeln bin. Danke für die ganzen hilfreichen Antworten. :D