Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Image darf nicht durch Image bewegt werden! (https://www.delphipraxis.net/109188-image-darf-nicht-durch-image-bewegt-werden.html)

progremizer 25. Feb 2008 21:12


Image darf nicht durch Image bewegt werden!
 
Hallo, ich schreibe zurzeit an einem kleinen Jump and Run spiel. Dabei habe ich eine Figur als Image in das ich nacheinander verschiedene Bilder lade, sodass es aussieht als ob die Figur läuft. Das funktioniert auch soweit super. Nun kommt mein Problem. Die Image-Figur darf nicht durch hinternisse laufen, die auch Image sind. z.b. wenn ne kiste im weg steht darf die figur nicht einfach durch die Kiste laufen. Mit welcher Bedingung leg ich fest dass ein bestimmtes Image nicht durch ein anderes Image darf??

Über schnelle Hilfe würde ich mich sehr freuen.

MfG progremizer

gordon freeman 25. Feb 2008 21:47

Re: Image darf nicht durch Image bewegt werden!
 
Du hast die Left / Top - Werte von dem "Bewegungs-Image", du hast auch die Left- Top- Werte von deinem "Hindernis-Image", außerdem die Height und Width von beiden. Mit diesen Werten kannst du dir super eine Kollisionsabfrage basteln.
Schreib erstmal was und wenn du dann noch Probleme hast, helfen wir auch gerne weiter!

Green 27. Feb 2008 21:54

Re: Image darf nicht durch Image bewegt werden!
 
So ein Zufall das ich gerade einen Kollisionsmanager schreibe:


Als CollisionManager.pas speichern:
Delphi-Quellcode:
unit CollisionManager;

interface

type
  TCollisionManager = class(TObject)
    private
      cmA: TQuad;
      cmB: TQuad;
      function getA: TQuad;
      function getB: TQuad;
      procedure setA(pA: TQuad);
      procedure setB(pB: TQuad);
    public
      property PointA: TQuad read getA write setA;
      property PointB: TQuad read getB write setB;
      function Collision: boolean;
      function Over2Points(x1, y1, x2, y2, x: double): double;
  end;

implementation

  function TCollisionManager.getA;
  begin
    Result := cmA;
  end;

  function TCollisionManager.getB;
  begin  
    Result := cmB;
  end;
 
  procedure TCollisionManager.setA(pA: TQuad);
  begin
    cmA := pA;
  end;

  procedure TCollisionManager.setB(pB: TQuad);
  begin
    cmB := pB;
  end;

  function TCollisionManager.Collision: boolean;
  begin
    Result := false;
    if (cmA.LU.x <= cmB.LU.x + cmB.width) and (cmA.LU.x + cmA.width >= cmB.LU.x) then    //X-Achsen Kollision
      if (cmA.LU.y <= cmB.LU.y + cmB.height) and (cmA.LU.y + cmA.height >= cmB.LU.y) then //Y-Achsen Kollision
        Result := true                                                                    //X+Y Achesn Kollision = Kollision
  end;

  function TCollisionManager.Over2Points(x1, y1, x2, y2, x: double): double;
  begin
    Result := ((y1-y2)*x + x1*y2 - x2*y1) / (x1 - x2);
  end;

end.
Noch eine Zweite Datei "MyTypes.pas" im gleichen Verzeichnis anlegen:
Delphi-Quellcode:
unit MyTypes;

interface

uses Windows, Graphics;

type
  T2DimPoint = packed record
    x: double;
    y: double;
  end;
  TQuad = packed record
    LU: T2DimPoint;
    Width: double;
    Height: double;
  end;
implementation

end.
Und jetzt die neue Form die du machst:
Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, CollisionManager, MyTypes;

type
  TForm2 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    Image2: TImage;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;
  CollisionManager: TCollisionManager;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
var
  tempQuad: TQuad;
begin
    TempQuad.Lu.x := Image1.Top;          //XWert links Unten
    TempQuad.Lu.y := Image1.Left;                  //YWert Links Unten
    TempQuad.width := Image1.Width;
    TempQuad.height:= Image1.Height;

    CollisionManager.PointA := TempQuad;

    TempQuad.Lu.x := Image2.Top;          //XWert links Unten
    TempQuad.Lu.y := Image2.Left;                  //YWert Links Unten
    TempQuad.width := Image2.Width;
    TempQuad.height:= Image2.Height;
   
    CollisionManager.PointB := TempQuad;

    if CollisionManager.Collision then showmessage('Kollision!');
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  CollisionManager := TCollisionManager.Create;
end;

end.
In Uses werden MyTypes und CollisionManager includet, dann im Formcreate wird eine neue CollisionManager iNstanz erzeugt.
Dann setzt du die Punkte mit einem Temporären Quad in den Manager ein und fragst ihn obs ne Kollision ist.
Fertig!

lG Green

progremizer 1. Mär 2008 13:19

Re: Image darf nicht durch Image bewegt werden!
 
Zitat:

Du hast die Left / Top - Werte von dem "Bewegungs-Image", du hast auch die Left- Top- Werte von deinem "Hindernis-Image", außerdem die Height und Width von beiden. Mit diesen Werten kannst du dir super eine Kollisionsabfrage basteln.
Schreib erstmal was und wenn du dann noch Probleme hast, helfen wir auch gerne weiter!
ja, sowas hatte ich mir auch schon gedacht. Hab auch nen bissel schon was dazu geschrieben. Dabei habe ich noch folgendes Problem: Wie kann ich die Position des Spielfigur-Image abfragen? Ich hatte es mit

a, b : integer;

a := image1.Top;
b := image1.Left;

versucht. ging aber iwie net.

Green 1. Mär 2008 14:51

Re: Image darf nicht durch Image bewegt werden!
 
Was heisst "das ging nicht"
genau so gehts, oder sollte es gehen.
Was steht denn am Ende in a und b?

progremizer 2. Mär 2008 17:26

Re: Image darf nicht durch Image bewegt werden!
 
kk, läuft xD

hatte nen blöden tippfehler gemacht gehabt :D

thx für eure hilfe....

dominikkv 2. Mär 2008 17:55

Re: Image darf nicht durch Image bewegt werden!
 
Warum so umständlich über eine Klasse?
Delphi-Quellcode:
function IsCollision(obj1, obj2: TControl): Boolean;
begin
  if Assigned(obj1) and Assigned(obj2) then
    Result := (obj1.Left <= obj2.Left + obj2.Width) and (obj1.Left + obj1.Width >= obj2.Left)
          and (obj1.Top <= obj2.Top + obj2.Height) and (obj1.Top + obj2.Height >= obj2.Top);
end;
aufrufen einfach so:
Delphi-Quellcode:
if IsCollision(Image1, Shape2) then
  bla;


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz