![]() |
Delphi Projektarbeit - 2D Autorennen
Hallo,
Meine Gruppe und ich müssen nun im letzten Schuljahr noch eine Projektarbeit in Delphi 7 schreiben. wir haben uns überlegt, ein 2d Autorennen zu erstellen. Momentan hängen wir jedoch an 2 Dingen: a) wie ändern wir die Lenkung so, das beide Autos korrekt fahren können? b) wie teilen wir die Strecke in bestimmte bereiche, die von dem Auto nicht befahren werden können? danke für eure Hilfe! hier der Quelltext:
Code:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm1 = class(TForm) Image1: TImage; Image2: TImage; Image3: TImage; procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); type Trotate = array[0..0] of TRGBQuad; procedure bilddrehen(const Bitmap: TBitmap); var P: PRGBQuad; x,y,b,h : Integer; RowOut: ^Trotate; help: TBitmap; begin Bitmap.PixelFormat := pf32bit; help := TBitmap.Create; try help.PixelFormat := pf32bit; b := bitmap.Height; h := bitmap.Width; help.Width := b; help.height := h; for y := 0 to (h-1) do begin rowOut := help.ScanLine[y]; P := Bitmap.scanline[bitmap.height-1]; inc(p,y); for x := 0 to (b-1) do begin rowout[x] := p^; inc(p,h); end; end; finally bitmap.Assign(help); help.Free; end; end; procedure fahrtost; begin Image2.Left:=Image2.Left+5; end; procedure fahrtwest; begin Image2.Left:=Image2.Left-5; end; procedure fahrtnord; begin Image2.top:=Image2.top-5; end; procedure fahrtsued; begin Image2.top:=Image2.top+5; end; var i:integer; begin //If Key=vk_up then Image3.Left:=Image3.Left+5; //If Key=vk_down then Image3.Left:=Image3.Left-5; //If Key=vk_left then Image3.Top:=Image3.Top+-5 ; //If Key=vk_right then Image3.Top:=Image3.Top+5 ; //If Key=vk_numpad4 then Image2.Top:=Image2.Top+-5 ; //If Key=vk_numpad6 then Image2.Top:=Image2.Top+5 ; If Key=vk_left then begin for i:=1 to 3 do bilddrehen(image2.picture.bitmap); end; If Key=vk_right then begin bilddrehen(image2.picture.bitmap) ; end; If Key=vk_numpad4 then begin for i:=1 to 3 do bilddrehen(image3.picture.bitmap); end; If Key=vk_numpad6 then bilddrehen(image3.picture.bitmap) ; If (GetAsyncKeyState(vk_numpad8)<>0) then Image3.Left:=Image3.Left+5; If (GetAsyncKeyState(vk_numpad2)<>0) then Image3.Left:=Image3.Left-5; If Key=vk_up then fahrtost; If Key=vk_down then fahrtwest; if key=vk_numpad6 then fahrtsued; if key=vk_numpad4 then fahrtnord; end; end. |
AW: Delphi Projektarbeit - 2D Autorennen
Wieviel Zeit habt Ihr dafür?
Wieviele Leute seit Ihr? Das dürfte nämlich angesichts des Quellcodes ganz schön sportlich werden...nix für ungut. Wenn Autorennen, würde ich Euch was anderes vorschlagen: ![]() Das lässt sich wunderbar programmieren. Sherlock |
AW: Delphi Projektarbeit - 2D Autorennen
Der Ansatz zeigt ja, dass es um ein sehr rechtwinkeliges Autorennen geht...
Und die Bewegung auch nur bei einem Tastendruck. Frage A) kann ich nicht beantworten, da ich die Frage nicht verstehe. Zu B.) Von vielen Möglichkeiten würde ich 2 Ansätze anbieten. 1. Ereuge Dir ein Array mit Koordinaten und weise jedem Punkt(X,Y) entweder (sWald,sGras,sSchotter,sStrasse,sStrassenrand) zu. Dann kannst Du vor jeder Bewegung testen auf welchem Untergrund sich dein "Auto" befindet. 2. Male Dir eine Große Bitmap mit festen Farben für Strasse, Schotter usw. Dann kannst du mit Pixel[X,Y] die Farbe abtesten und so rausfinden wo Du beim nächsten Zug bist. Jetzt noch einige Verbesserung: A) Nehme eine Timer für die Bewegung. B) Erzeuge Dir Autos in 45° Winkeln. (Einmal vorher) C) "A" & "D" sowie "Num 1" & "Num 2" drehen jeweils um 45° W/X 8/2 erhöhen die Geschwindigkeit oder Bremsen. D) Erzeuge Dir ein Auto Object mit Position(X,Y),Richtung(a),Geschwindigkeit(v) Mavarik |
AW: Delphi Projektarbeit - 2D Autorennen
Frage A verstehe ich so, das beim altuellen Ansatz nur 1 Auto gesteuert werden kann, der TE aber mindestens 2 Autos unabhängig voneinander steuern will, damit er gegen einen anderen menschlichen Gegner das Rennen antreten kann. Wenn ich da richtig liege, braucht er 4 andere Tasten für den 2. Spieler. Wenn er dagegen nur gegen den Computer spielen will, braucht er keine 2. Steuerung, dann braucht er mehrere Autos, die, mit Timer oder Thread gesteuert unabhängig von der Tastensteuerung fahren.
@Mavarik: Ich verstehe "Autos in 45 Grad Winkeln" nicht. Beim Autorennen starten die Autos parallel stehend am Startpunkt. Wenn die Breite der Fahrstrecke nicht für die Anzahl der Autos ausreicht, dann stehen sie in mehreren Reihen hintereinander, aber auf der Breite der Straße parallel zueinander. Warum dann "Autos in 45 Grad Winkeln? |
AW: Delphi Projektarbeit - 2D Autorennen
Zitat:
Grüße Klaus |
AW: Delphi Projektarbeit - 2D Autorennen
Zitat:
|
AW: Delphi Projektarbeit - 2D Autorennen
Zitat:
Das ist eher etwas rechtwinkeliges... Mavarik |
AW: Delphi Projektarbeit - 2D Autorennen
Hallo Mavarik,
ich meinte die "Kurven" die auch ![]() Dürfen die Auto denn nich 45° Grad/diagonal fahren? Grüße Klaus |
AW: Delphi Projektarbeit - 2D Autorennen
Zitat:
Delphi-Quellcode:
procedure fahrtost;
begin Image2.Left:=Image2.Left+5; end; procedure fahrtwest; begin Image2.Left:=Image2.Left-5; end; procedure fahrtnord; begin Image2.top:=Image2.top-5; end; procedure fahrtsued; begin Image2.top:=Image2.top+5; end; |
AW: Delphi Projektarbeit - 2D Autorennen
Liste der Anhänge anzeigen (Anzahl: 2)
OK! Ich konnte es einfach nicht lassen...
Ist zwar nicht D7 sondern XE5 und FMX und die Kollisionskontrolle und Randkontrolle ich noch nicht drin, aber naja war ja auch nur ein "Proof of Concept" :stupid: Mavarik PS.: Nur zum anschauen...Ohne Tastatureingabe. |
Dieses Thema wurde am "11. Feb 2014, 07:08 Uhr" von "r_kerber" aus dem Forum "Fragen / Anregungen zur DP" in das Forum "Sonstige Fragen zu Delphi" verschoben.
|
AW: Delphi Projektarbeit - 2D Autorennen
Ups... Hat das Programm bei Euch funktioniert?
Fahren die Auto's alles "auf" der Straße? Hab die Version gerade für Mac-OS gelinkt und musste feststellen, dass die CPU-Geschwindigkeit mit in die Position einfließt. Hier muss ich nochmal "nacharbeiten"... Mavarik |
AW: Delphi Projektarbeit - 2D Autorennen
Unter Win7 und Win8 sieht es gut aus.
Kannst Du mal grob umreißen, wie Du das aufgebaut hast? Bild als Hintergrund und wie kontrollierst Du die Strecke und Winkel? |
AW: Delphi Projektarbeit - 2D Autorennen
Hallo,
vielen vielen dank für eure tollen Beiträge. Leider muss ich sagen, dass ich kaum etwas verstanden hab :D. Unser Problem ist, a) wie lasse ich zwei autos gleichzeitig fahren ? geht das mit dem Timer? wenn ja, was macht der Timer denn, bzw. wie muss man ihn programmieren, hatten wir in der Schule nicht. denn im moment kann ja nur immer eine taste gedrückt werden b) wie können wir das spiel so umändern das evtl sogar eine lenkdynamik entsteht, also auch 45° Winkel gefahren werden können & das auto, sobald es sich nach rechts dreht, auch nach unten Gas gibt, weil das tut es bei uns nicht. c) wir haben jetzt ne bitmap vorgezeichnet & die autos auch.stellt das irgendein problem dar? |
AW: Delphi Projektarbeit - 2D Autorennen
Es gibt analog zum
![]() ![]() Bei diesen Events schaltest du einfach für das Auto die entsprechende Aktion
|
AW: Delphi Projektarbeit - 2D Autorennen
Für Spiele und ähnliches ist
![]() Geht z.B. so (im Ereignishandler vom Timer):
Delphi-Quellcode:
// VK_LEFT steht für die Pfeil-Nach-Links-Taste. Solche Konstanten gibt es auch noch für andere Tasten.
if GetAsyncKeyState(VK_LEFT) < 0 then begin // Auto ein Stück nach links bewegen end; |
AW: Delphi Projektarbeit - 2D Autorennen
@EpicProgger5000
So richtig werde ich aus deinen Problemen nicht schlau, und eigentlich wundert es mich nicht, dass du kaum was verstanden hast, denn eigentlich habe ich bisher nicht verstanden was für ein Spiel du programmieren möchtest. Ok, es soll ein 2D Spiel sein. Damit ist vermutlich gemeint, dass es eine Ansicht von oben ist. Ist das so? Denn eigentlich ist das Spiel ![]() Die wichtigste Frage ist aber, soll es ein 2D Spiel wie bei Mavarik? Also ein rundes Feld in dem die Autos ihre Runden drehen, oder eher wie ![]() ![]() Also anhand deiner Fragen würde ich meinen, dass ihr noch Anfänger seit. Das Mavarik Spiel ist nicht wirklich kompliziert, aber man muss zumindest die Grundlagen beherrschen. Meiner Meinung nach sogar etwas einfacher ist C64 Pole Position. Vielleicht ist da mehr zu machen, aber weniger kompliziert (meine Meinung). Deshalb gehe ich davon aus, dass es eher ein Rennspiel wie Speed Racer/Donkey.bas ist. Du solltest es also konkretisieren, dann bekommst du auch bessere Hilfe. Genial von der Idee ist ![]() ![]() Das Ganze ist als Spielidee auch ganz leicht in Delphi umzusetzen, nur statt der Änderung der Schrift kann jede Buchstabe z. B. für ein 8x8 Pixel Bitmap stehen. Der Vorteil, es gibt Zeichen die das Rennauto befahren kann, schwer befahren kann, gar nicht befahren kann. Im Grunde eine Textdatei, sieht aber wie ein Grafik aus. Man kann es aber auch anders machen. Ist nur eine Idee. Aber ohne ein Konzept ist es schwer Tipps zu geben. Wie gesagt, zeichne meinetwegen das Spiel in Pantbrush, aber sag was du genau machen willst. |
AW: Delphi Projektarbeit - 2D Autorennen
Also nochmal ne genauere Problemerläuterung:
-> wir wollen ein Autorennen in Vogelperspektive programmieren. Das soll alles jedoch relativ einfach gehalten werden,da wir nicht sonderlich viel Zeit haben und auch so nicht viel Plan haben. Wir wollen auf jeden Fall a) das zwei Autos gleichzeitg fahren können also man auch zwei Tasten gleichzeiig drücken kann b) das Auto fährt, wenn wir nach rechts lenken immernoch nachrechts weiter, also wir bekommen es nicht hin, dass das Auto nach dem lenken nach unten bzw. in eine andere richtung fährt c) haben wir im paint autos & Strecke vorgezeichnet (ist ja auch bitmap) und wissen jetzt aber nicht, wie man dort ne begrenzung einbaut bzw. programmiert, sodass das auto nicht mehrauf den Straßenrand fährt Könnt ihr uns da helfen? :D danke euch aber bisher |
AW: Delphi Projektarbeit - 2D Autorennen
Nur mal zu Problem b)
Man muss sich die Zustände der Autos merken, d.h. in welche Richtung er im Moment fährt und auch wie schnell. Wird nun eine Taste gedrückt ändert sich halt die Richtung. In der Funktion (wahrscheinlich über einen Timer gesteuert) in der die Autos bewegt werden wird das Auto abhängig von der gespeicherten Geschwindigkeit um N Pixel bewegt und abhängig von der gespeicherten Richtung ändert sich halt die X oder die Y Position um die N Pixel (oder bei 45° halt X und Y um N/Wurzel(2) Pixel? Wär auf jeden Fall eine gute Gelegenheit ein bißchen OOP mit zu lernen. |
AW: Delphi Projektarbeit - 2D Autorennen
Zitat:
Zitat:
Keydown "d" Rechts_Spieler_1 := true;Links_Spieler_1 := false; KeyUp "a" Links_Spieler_1 := false; KeyUp "d" Links_Spieler_1 := false; OnTimer if Links_Spieler_1 = true then Wagen_1 Richtung := Richtung - 45; ... Zitat:
Delphi-Quellcode:
machst.
procedure fahrtost;
begin Image2.Left:=Image2.Left+5; end;
Delphi-Quellcode:
if Wagen_1.Richtung = 0 then
Image2.Top := Image2.Top - 5; // Immer in 5er Schritten ohne unterschiedliche Geschwindigkeit.?!? else If Wagen_1.Richtung = 45 then begin Image2.top := Image2.Top - 5; Image2.Left := Image2.Left + 5; end usw. Zitat:
Delphi-Quellcode:
var
Strecke : Array [0..200,0..100] of Boolean; // für ein Image der Größe 1000x500 begin Strecke[5,7] := true; // hier dar ein Auto fahren Strecke[4,7] := false; // hier nicht. if Strecke[Image2.Left div 5,image2.Top div 5] then Auf_der_Strecke := true else Auf_der_Strecke := false; ... end; Zitat:
Mavarik |
AW: Delphi Projektarbeit - 2D Autorennen
Zitat:
Delphi-Quellcode:
TCar = Record
Position : TPosition; Richtung : Single; Geschwindigkeit : Single; Image : TImage; end;
Delphi-Quellcode:
TAutoDriveList = Record CarNr : byte; Geschwindigkeit : Single; Richtung : Single; // Besser Position dann ist es Hardware unabhängig (z.b. auf Mac) Wann : TDateTime; end;
Delphi-Quellcode:
Procedure TForm46.MoveCar(Nr:Integer); // Form46 lol...PoC
begin Cars[Nr].Position.X := Cars[Nr].Position.X + Sin(Cars[Nr].Richtung*PI/180)*Cars[Nr].Geschwindigkeit; Cars[Nr].Position.Y := Cars[Nr].Position.Y + Cos(Cars[Nr].Richtung*PI/180)*Cars[Nr].Geschwindigkeit; Cars[Nr].Image.Position := Cars[Nr].Position; end;
Delphi-Quellcode:
Quick and Dirty.
procedure TForm46.Timer1Timer(Sender: TObject);
var i : Integer; begin Image5.Canvas.BeginScene; Label6.Text := FloattoStr(Image4.AbsoluteRect.Width) +' x '+FloattoStr(Image4.AbsoluteRect.Height); if Gas then Cars[Stear].Geschwindigkeit := Cars[Stear].Geschwindigkeit + 0.10 // Mehr Gas als Bremse ;-) else if Bremse then Cars[Stear].Geschwindigkeit := Cars[Stear].Geschwindigkeit - 0.05; if Links then begin Cars[Stear].Richtung := Cars[Stear].Richtung + 3; // Winkelgeschwindigkeit noch gemäßt Geschwindigkeit anpassen Cars[Stear].Image.RotationAngle := 90 - Cars[Stear].Richtung; end else if Rechts then begin Cars[Stear].Richtung := Cars[Stear].Richtung - 3; Cars[Stear].Image.RotationAngle := 90 - Cars[Stear].Richtung; end; if AutoDrive then begin // Gespeicherte Daten abspielen ... end; for i:=1 to 4 do begin MoveCar(i); CheckCar(i); // todo end; Image5.Canvas.EndScene; end; Die Daten für die Bewegungen können entweder eingegeben werden per Tastatur, oder aus dem gespeicherten Array abgespielt werden oder per UDP "rein" kommen. Mavarik |
AW: Delphi Projektarbeit - 2D Autorennen
@EpicProgger5000
Also ich bin mir immer noch nicht sicher was du programmieren willst. Inzwischen ist klar, dass es Draufsicht ist. Da gibt es aber immer noch etliche Möglichkeiten. Mavarik scheint zu wissen was du willst, denn er postet schon kräftig Code. Ich nicht. Entweder ist es eine Strecke im Kreis oder die Straße bewegt sich runter. Denn je nachdem was für ein Typ es ist, muss man es unterschiedlich lösen. Also bei dem Tempo wie du die Infos von dir gibts und der Art, dass man alles erfragen muss, wirst du vermutlich Weihnachten alle Infos zusammen haben. |
AW: Delphi Projektarbeit - 2D Autorennen
Zitat:
|
AW: Delphi Projektarbeit - 2D Autorennen
Liste der Anhänge anzeigen (Anzahl: 1)
@Mavarik
Ok, trotzdem, wenn man Fragen hat, dann interagiert man. Man stellt nicht eine Liste von Fragen und wartet bis Lösung kommt. Aber sei es drum. @EpicProgger5000 Ich weiß nicht ob ihr schon so weit seit das Programm von Mavarik nachzuprogen, denn wenn ich mir den Anfangscode ansehe, dann ist das Anfängercode. Auch der beste Koch kocht mit Wasser, also warum komplex machen. Die Frage die sich stellt ist also ob man sich alles per Copy&Paste zusammensucht oder es einfacher macht, dafür aber selbst. Ich würde euch empfehlen sich von der "bilddrehen" Prozedur zu trennen. Standessen würde ich - aufgrund des Kenntnisstandes der Gruppe - es einfacher machen. Zuerst ein Auto designen und davon acht Kopien erstellen, jedes Bild um 45° gedreht. Wie gesagt, auch der beste Koch kocht mit Wasser. Man muß nicht mit einer Bitmap arbeiten. Reduziert das Spiel auf acht Richtungen und erstellt für jede Richtung ein Bild. Dann alles im ImageList und je nach Richtung das passende Bild laden. Das Ergebnis würde dann so aussehen: |
AW: Delphi Projektarbeit - 2D Autorennen
Das wars dann wohl. Typischer Fall von "überhoben".
Sherlock |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz