![]() |
Re: 2-D Adventure programmieren
dein vorhaben ist mit canvas ohne probleme möglich. auch ohne Flackern und mit ordentlicher Performance.
|
Re: 2-D Adventure programmieren
Hallo :)
Das Adventure nimmt allmählich Form an, auch wenn sicherlich einige Sachen sehr umständlich programmiert worden sind :???: Aber Übung macht ja bekanntlich den Meister. Nun zu einem neuen Problem..... Ich lasse zwei gelbe Kreise folgendermaßen durch das Erdgeschoss meiner "map" laufen:
Delphi-Quellcode:
Nun würde ich gern eine Kollisionskontrolle benutzen, damit die zwei Kreise nicht überall langlaufen können. Ihr müsst euch das so vorstellen, dass ich die Draufsicht einer Schule (Erdgeschoss) mit Canvas gezeichnet habe und nun nicht will, dass die Spielfigur die Wände (Rectangles) übermalt. Sprich, wie realisiere ich es, dass die Spielfigur nicht über ein angegebenen Rechteck "drüber" laufen kann.
rocedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); begin{of procedure} with Image1.Canvas do begin{of controls} case Key of VK_LEFT: begin pen.color:=cl3DLight; brush.color:=cl3DLight; ellipse(Grosx1,Grosy1,Grosx2,Grosy2); ellipse(Kleinx1,Kleiny1,Kleinx2,Kleiny2); Grosx1:=Grosx1-5; Grosx2:=Grosx2-5; Kleinx1:=Kleinx1-5; Kleinx2:=Kleinx2-5; pen.color:=clblack; brush.color:=clyellow; ellipse(Grosx1,Grosy1,Grosx2,Grosy2); ellipse(Kleinx1,Kleiny1,Kleinx2,Kleiny2); Key := 0; end; VK_RIGHT: begin pen.color:=cl3DLight; brush.color:=cl3DLight; ellipse(Grosx1,Grosy1,Grosx2,Grosy2); ellipse(Kleinx1,Kleiny1,Kleinx2,Kleiny2); Grosx1:=Grosx1+5; Grosx2:=Grosx2+5; Kleinx1:=Kleinx1+5; Kleinx2:=Kleinx2+5; pen.color:=clblack; brush.color:=clyellow; ellipse(Grosx1,Grosy1,Grosx2,Grosy2); ellipse(Kleinx1,Kleiny1,Kleinx2,Kleiny2); Key := 0; end; VK_UP: begin pen.color:=cl3DLight; brush.color:=cl3DLight; ellipse(Grosx1,Grosy1,Grosx2,Grosy2); ellipse(Kleinx1,Kleiny1,Kleinx2,Kleiny2); Grosy1:=Grosy1-5; Grosy2:=Grosy2-5; Kleiny1:=Kleiny1-5; Kleiny2:=Kleiny2-5; pen.color:=clblack; brush.color:=clyellow; ellipse(Grosx1,Grosy1,Grosx2,Grosy2); ellipse(Kleinx1,Kleiny1,Kleinx2,Kleiny2); Key := 0; end; VK_DOWN: begin pen.color:=cl3DLight; brush.color:=cl3DLight; ellipse(Grosx1,Grosy1,Grosx2,Grosy2); ellipse(Kleinx1,Kleiny1,Kleinx2,Kleiny2); Grosy1:=Grosy1+5; Grosy2:=Grosy2+5; Kleiny1:=Kleiny1+5; Kleiny2:=Kleiny2+5; pen.color:=clblack; brush.color:=clyellow; ellipse(Grosx1,Grosy1,Grosx2,Grosy2); ellipse(Kleinx1,Kleiny1,Kleinx2,Kleiny2); Key := 0; end;{of controls} end;{of procedure} Gruß Tobias :stupid: |
Re: 2-D Adventure programmieren
Hi,
Aufgrund von mangelnder Zeit (muss jetzt gleich weg) kann ich dir keine Antwort auf deine aktuelle Frage geben aber ich finde es ehrlichgesagt einfacher so Sachen mit Andorra2D oder DelphiX zu machen. Natürlich ist es mit Canvas möglich aber einfacher ist es meiner Meinung nach mit einer dieser beiden Engines. Denn da wird dir z.B. auch dieses Kollisionsproblem weitgehenst abgenommen ;) Gruß Neutral General |
Re: 2-D Adventure programmieren
Huhu :o
Danke für deine rasche Antwort, allerdings war es so geplant, erstmal mit Canvas alles zu realisieren. Hier wurde im Thread ja schon öfters diese Möglichkeit erwähnt, allerdings wollte ich mich zu Anfang dieses Projekts nicht noch lange in Andorra und Co einlesen. Vielleicht hat ja noch jemand anderes eine Idee.... :P |
Re: 2-D Adventure programmieren
Auf die Schnelle fällt mir ein, dass Du die Eckpunkte mit PtInRect daraufhin überprüfen könntest, ob sie im Rechteck des Hindernisses liegen.
|
Re: 2-D Adventure programmieren
Da ich noch ein ziemlicher Neuling bin, könntest du mir ein kleines Beispiel geben, welches diese Funktion veranschaulicht ??
|
Re: 2-D Adventure programmieren
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var R: TRect; //das Hindernis Test: TRect; //die Spielfigur procedure ShowStatus; begin //ich vergleiche nur mal die linke obere Ecke if PtInRect(R,Test.TopLeft) then ShowMessage('Kollision') else ShowMessage('Freie Bahn'); end; begin //das Hindernis mal an Position 10,10 mit Höhe und Breite 90 definieren R := Rect(10,10,100,100); //2 Beispiele Test := Rect(10,101,100,200); ShowStatus; Test := Rect(10,90,100,190); ShowStatus; end; |
Re: 2-D Adventure programmieren
Danke Dir :-D
Nun werd ich mal ein bissl rumbasteln und versuchen, es in mein Programm einzubauen... :???: gruß tobias |
Re: 2-D Adventure programmieren
Liste der Anhänge anzeigen (Anzahl: 2)
Mh, irgendwie komme ich nicht so recht weiter :cry:
Ich hänge mal den Code dran, und wer mag, schaut sich das mal an :roll: Ich würde gern realisieren, dass der Kreis nicht in ein vorgegebenes Rechteck wandern kann.... Tobias |
Re: 2-D Adventure programmieren
Ich hab mal paar Functions ausgegraben, die einem bei solchen Sachen recht nützlich sind:
Delphi-Quellcode:
Gruß :)
function PointInRect(const Point: TPoint; const Rect: TRect): Boolean;
begin Result := (Point.X >= Rect.Left) and (Point.X <= Rect.Right) and (Point.Y >= Rect.Top) and (Point.Y <= Rect.Bottom); end; function RectInRect(const Rect1, Rect2: TRect): Boolean; begin Result := (Rect1.Left >= Rect2.Left) and (Rect1.Right <= Rect2.Right) and (Rect1.Top >= Rect2.Top) and (Rect1.Bottom <= Rect2.Bottom); end; function OverlapRect(const Rect1, Rect2: TRect): Boolean; begin Result := (Rect1.Left < Rect2.Right) and (Rect1.Right > Rect2.Left) and (Rect1.Top < Rect2.Bottom) and (Rect1.Bottom > Rect2.Top); end; function PointInCircle(PPos,CPos: TPoint; R: integer): Boolean; begin Result := (PPos.X - CPos.X)*(PPos.X - CPos.X)+(PPos.Y - CPos.Y)*(PPos.Y - CPos.Y)<= R*R; end; function CircleInCircle(C1Pos,C2Pos: TPoint; R1,R2:Integer): Boolean; begin Result := (C1Pos.X - C2Pos.X)*(C1Pos.X - C2Pos.X)+(C1Pos.Y - C2Pos.Y)*(C1Pos.Y - C2Pos.Y) <= (R1+R2)*(R1+R2); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:33 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 by Thomas Breitkreuz