AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Image darf nicht durch Image bewegt werden!
Thema durchsuchen
Ansicht
Themen-Optionen

Image darf nicht durch Image bewegt werden!

Ein Thema von progremizer · begonnen am 25. Feb 2008 · letzter Beitrag vom 2. Mär 2008
Antwort Antwort
progremizer

Registriert seit: 25. Feb 2008
3 Beiträge
 
#1

Image darf nicht durch Image bewegt werden!

  Alt 25. Feb 2008, 21:12
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
  Mit Zitat antworten Zitat
Benutzerbild von gordon freeman
gordon freeman

Registriert seit: 28. Jun 2003
Ort: Gelsenkirchen
337 Beiträge
 
Delphi 2005 Personal
 
#2

Re: Image darf nicht durch Image bewegt werden!

  Alt 25. Feb 2008, 21:47
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!
  Mit Zitat antworten Zitat
Green

Registriert seit: 11. Jun 2006
156 Beiträge
 
#3

Re: Image darf nicht durch Image bewegt werden!

  Alt 27. Feb 2008, 21:54
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
  Mit Zitat antworten Zitat
progremizer

Registriert seit: 25. Feb 2008
3 Beiträge
 
#4

Re: Image darf nicht durch Image bewegt werden!

  Alt 1. Mär 2008, 13:19
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.
  Mit Zitat antworten Zitat
Green

Registriert seit: 11. Jun 2006
156 Beiträge
 
#5

Re: Image darf nicht durch Image bewegt werden!

  Alt 1. Mär 2008, 14:51
Was heisst "das ging nicht"
genau so gehts, oder sollte es gehen.
Was steht denn am Ende in a und b?
  Mit Zitat antworten Zitat
progremizer

Registriert seit: 25. Feb 2008
3 Beiträge
 
#6

Re: Image darf nicht durch Image bewegt werden!

  Alt 2. Mär 2008, 17:26
kk, läuft xD

hatte nen blöden tippfehler gemacht gehabt

thx für eure hilfe....
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Image darf nicht durch Image bewegt werden!

  Alt 2. Mär 2008, 17:55
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;
Dominik
Wer anderen eine Grube gräbt, hat ein Gruben-Grab-Gerät!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:35 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