Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi 2-D Adventure programmieren (https://www.delphipraxis.net/99156-2-d-adventure-programmieren.html)

SirThornberry 9. Sep 2007 13:56

Re: 2-D Adventure programmieren
 
dein vorhaben ist mit canvas ohne probleme möglich. auch ohne Flackern und mit ordentlicher Performance.

MarquiseDeSade 29. Nov 2007 19:25

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:
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}
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.

Gruß
Tobias :stupid:

Neutral General 29. Nov 2007 19:31

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

MarquiseDeSade 29. Nov 2007 19:44

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

DeddyH 29. Nov 2007 19:49

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.

MarquiseDeSade 29. Nov 2007 19:58

Re: 2-D Adventure programmieren
 
Da ich noch ein ziemlicher Neuling bin, könntest du mir ein kleines Beispiel geben, welches diese Funktion veranschaulicht ??

DeddyH 29. Nov 2007 20:06

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;

MarquiseDeSade 29. Nov 2007 20:18

Re: 2-D Adventure programmieren
 
Danke Dir :-D

Nun werd ich mal ein bissl rumbasteln und versuchen, es in mein Programm einzubauen... :???:

gruß
tobias

MarquiseDeSade 29. Nov 2007 23:23

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

Progman 29. Nov 2007 23:48

Re: 2-D Adventure programmieren
 
Ich hab mal paar Functions ausgegraben, die einem bei solchen Sachen recht nützlich sind:
Delphi-Quellcode:
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;
Gruß :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:33 Uhr.
Seite 2 von 2     12   

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