Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Kollisionsabfrage bei Supermario-Klon (https://www.delphipraxis.net/69212-kollisionsabfrage-bei-supermario-klon.html)

Helarion 11. Mai 2006 19:25


Kollisionsabfrage bei Supermario-Klon
 
Erstmal Hallo an alle! (weils mein erster Post hier ist :mrgreen: )

..und jetzt zum Geschäft.
Wie der Titel schon sagt geht es um Kollisionsabfrage.

Die Fakten:

- spiel ist mit Image Dateien realisiert
- Marios'-Klon läuft und hüpft einwandfrei (per left/top des Images)
- Gegner laufen per random(als .img) von links nach rechts
- es gibts ein paar Images die Hindernisse, bzw. "bekltterbare" Objekte sein sollen

Das Problem:

Mein Mario hüpft an den Gegnern und Hindernissen nur so vorbei und meine "Mario/Gegner-ist-tot" funktion wird nicht ausgelöst. Stellt sich die Frage wie ich dies mit ".left" und ".top" so benutzen kann das die sich gegenseitig erkennen und meine "tot" funktion ausgelöst werden kann oder er auf den Hindernissen stehen bleibt.

Bitte sagt mir nicht ich soll die SUchfunktion, etc. nutzen. Da bin ich eben schon drin verloren gegeangen...

Würde mich über Codeschnipsel, Links zu Kollisionsabfrage Turorials (die auf mein Problem mit den Images zutreffen) und alles was euch sonst hierzu hilfreich erscheint freuen!

Danke schon mal im vorraus :| :lol:

pacman1986 11. Mai 2006 19:48

Re: Kollisionsabfrage bei Supermario-Klon
 
Erstma Willkommen in der dp :dp:

danch würde ich dir erstma DelphiX empfehlen oder sonstige Kompos dazu. wenn du aber bei deiner alten sache bleiben willst geb ich dir mal den tipp die breite und höhe dazu zu addieren.

was ich meine :
Delphi-Quellcode:
If (gegner.left>spieler.left)
   and (gegner.left<(spieler.left+Spieler.width))
   and (gegner.top<spieler.top)
   and (gegner.top>(spieler.top+spieler.height))
       then tot;
oder so in der art

Aber nimm lieber DelphiX ^^

Hawkeye219 11. Mai 2006 21:11

Re: Kollisionsabfrage bei Supermario-Klon
 
Hallo Helarion,

vielleicht möchtest du die Funktion Delphi-Referenz durchsuchenIntersectRect aus der Unit Types für die Kollisionsabfrage nutzen. Damit vermeidest du Fehler in komplizierten IF-Abfragen.

Gruß Hawkeye

Helarion 12. Mai 2006 09:32

Re: Kollisionsabfrage bei Supermario-Klon
 
Das mit If-Abgfragen hatte ich auch schon. Muss man aber wie Hawkeye richtig erkannt hat gut aufpassen was man macht, besonders bei mehreren Gegnern. Wie ich mit der DirectX Veariante umgehen kann hab ich keine Ahnung, ergo nicht mal sog. DelphiX (oder ist das in Delphi 7 - Ent. ennthalten?).
Gibt es DelphiX irgendwo als free-/shareware?

IntersectRect könnte das sein was ich brauch, sieht so aus als müsst ich mir das wissen über die funktionsfähigkeit davon aber auch erst aneignen. Kann man(n) in der Intersect auch Images einbauen? Und wie?

MfG Hel

SirThornberry 12. Mai 2006 09:46

Re: Kollisionsabfrage bei Supermario-Klon
 
IntersectRect verlangt koordinaten. du musst also von den 2 Images wo du testen willst ob sie kollidieren die koordinaten übergeben:
Delphi-Quellcode:
var LRectUeberlappung,
    LRect1,
    LRect2            : TRect;
    LSindKollidiert  : Boolean;
begin
  LRect1 := Rect(Image1.Left, Image1.Top, Image1.Width, Image1.Height);
  LRect2 := Rect(Image2.Left, Image2.Top, Image2.Width, Image2.Height);
  LSindKollidiert := IntersectRect(LRectUeberlappung, LRect1, LRect2);

Helarion 12. Mai 2006 10:09

Re: Kollisionsabfrage bei Supermario-Klon
 
Juchhu! :thumb:
Danke euch allen, besonderst SirThornberry. Hab ein bisschen gebastelt und die 0-8-15-Variante scheint soweit zu funzen.
Wenn ich das auch noch mit mehreren Gegnern zum laufen bring ist das Game so gut wie fertig... :-D

Hawkeye219 12. Mai 2006 10:39

Re: Kollisionsabfrage bei Supermario-Klon
 
Zitat:

Zitat von SirThornberry
IntersectRect verlangt koordinaten. du musst also von den 2 Images wo du testen willst ob sie kollidieren die koordinaten übergeben

Genau, man muß Koordinaten übergeben:

Delphi-Quellcode:
with Image1 do
  LRect1 := Rect(Left, Top, Left + Width, Top + Height);
with Image2 do
  LRect2 := Rect(Left, Top, Left + Width, Top + Height);
Gruß Hawkeye

SirThornberry 12. Mai 2006 10:44

Re: Kollisionsabfrage bei Supermario-Klon
 
Oh man, ich hatte es fast befürchtet. :oops: Leider wird man bei sowas aus der OH meist nicht schlau und bei einigen anderen Funktionen wird Buttom und Right manchmal als Höhen- und Breitenangabe interpretiert.

@Helarion: Um das ganze für mehrere Gegner zu realisieren pack es einfach in eine Funktion und ruf die Funktion für jeden Gegner(TImage) auf. Die Funktion also einfach per schleife mit jedem aufrufen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:26 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