![]() |
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 |
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! |
Re: Image darf nicht durch Image bewegt werden!
So ein Zufall das ich gerade einen Kollisionsmanager schreibe:
Als CollisionManager.pas speichern:
Delphi-Quellcode:
Noch eine Zweite Datei "MyTypes.pas" im gleichen Verzeichnis anlegen:
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.
Delphi-Quellcode:
Und jetzt die neue Form die du machst:
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.
Delphi-Quellcode:
In Uses werden MyTypes und CollisionManager includet, dann im Formcreate wird eine neue CollisionManager iNstanz erzeugt.
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. Dann setzt du die Punkte mit einem Temporären Quad in den Manager ein und fragst ihn obs ne Kollision ist. Fertig! lG Green |
Re: Image darf nicht durch Image bewegt werden!
Zitat:
a, b : integer; a := image1.Top; b := image1.Left; versucht. ging aber iwie net. |
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? |
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.... |
Re: Image darf nicht durch Image bewegt werden!
Warum so umständlich über eine Klasse?
Delphi-Quellcode:
aufrufen einfach so:
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;
Delphi-Quellcode:
if IsCollision(Image1, Shape2) then
bla; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:47 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