Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Merken, ob ein Objekt auf den Koordinaten ist (https://www.delphipraxis.net/144740-merken-ob-ein-objekt-auf-den-koordinaten-ist.html)

Delphi-Narr 15. Dez 2009 14:41


Merken, ob ein Objekt auf den Koordinaten ist
 
Hallo, ich möchte ein Programm schreiben, in welchem man eine "Kugel" steuert. Dies soll mit bewegten Shapes passieren.
Ich brauche eigentlich "nur" eine Funktion, die merkt, ob sich zwei Objekte überschneiden und mir dies irgendwie mitteilt. Gibt es da etwas vordefiniertes?

Sollte so in der Art sein:

Delphi-Quellcode:
...

var vUeberschneiden:Boolean:
begin
    vUeberschneiden:=Ueberschneiden(Name Objekt 1; Name Objekt 2);
    //Verarbeitung des Ergebnisses
end;

function TForm1.Ueberschneiden(Name Objekt 1; Name Objekt 2):Boolean;
...
...
...
Liebe Grüße

Alaitoc 15. Dez 2009 14:52

Re: Merken, ob ein Objekt auf den Koordinaten ist
 
Würde mich wundern wenn es da etwas vordefiniertes gibt...

Ganz am Ende dieses Themas http://www.delphipraxis.net/internal...t.php?t=161695 wird auf ein recht hilfreiches Tutorial gewiesen was sich allgemein mit Kollisionabfragen etc beschäftigt.

Sehr hilfreich wie ich finde :)

MfG Alaitoc

Delphi-Narr 15. Dez 2009 15:03

Re: Merken, ob ein Objekt auf den Koordinaten ist
 
Hm, danke. Aber die Kugeln, von denen da die Rede ist, sind alle auf einer berechneten Linie zu finden, sodass man schon vorher weiß, ob es kolidiert. Ich habe mehrere Objekte, doch nur eines wird bewegt und kann kolidieren. Also sind diese mehrfach Kolisionen schon einmal ausgeschlossen. Außerdem sollen keine physikalischen Gesetze beachtet werden. Man guckt praktisch von "oben" auf das Spielfeld drauf, es gibt also kein "unten". Die Schwerkraft fällt somit auch weg. Die Kugel muss auch nicht abprallen, sondern einfach nur aufgehalten werden. Also wenn sich die beiden Shapes berühren, breche den Rest ab, wenn in Richtung des Shapes gesteuert wird (man muss ja wieder von der Wand wegkönnen)...

Also ist diese physikalische Lösung mit sehr vielen Variablen nichts für mich...

Trotzdem danke, ist für andere Sachen bestimmt mal hilfreich :thumb:

Tyrael Y. 15. Dez 2009 15:10

Re: Merken, ob ein Objekt auf den Koordinaten ist
 
Pythagoras ist dein Freund.

a² + b² = c²

Wenn zwei Punkte den Abstand Null zueinander haben dann haben sie kollidiert, soll heißen

Delphi-Quellcode:
var kollision: boolean;
...
 kollosion := Sqrt(Power(X2-X1, 2) + Power(Y2-Y1, 2)) = 0;
...
X und Y sind die Koordinatenbestanteile.

Delphi-Narr 15. Dez 2009 15:53

Re: Merken, ob ein Objekt auf den Koordinaten ist
 
Hm, kannst du das mal etwas erläutern. Versteh ich nicht so ganz... :gruebel:

p80286 15. Dez 2009 16:11

Re: Merken, ob ein Objekt auf den Koordinaten ist
 
@Tyrael Y.
Meinst Du nicht, das ist mit Kanonen auf Spatzen geschossen?
Delphi-Quellcode:
kollision:=((x1-x2)=0) and ((y1-y2)=0)
sollte es eigentlich auch tun.

@Delphi-Narr
Die Kollisionserkennung sollte dann recht einfach sein, wenn ein Spielfeld existiert, auf dem die Objekte eingetragen werden. D.h. es existiert eine "globale Variable" auf die jedes Objekt Zugriff hat, und wo jede Position eingetragen wird. Wenn ein Objekt dann auf eine belegte Stelle zugreifen will, dann knallt's halt.

Gruß
K-H

Uwe Raabe 15. Dez 2009 16:59

Re: Merken, ob ein Objekt auf den Koordinaten ist
 
Also erstmal sollte man dies

Delphi-Quellcode:
kollosion := Sqrt(Power(X2-X1, 2) + Power(Y2-Y1, 2)) = 0;
durch das ersetzen

Delphi-Quellcode:
kollosion := Sqrt(Sqr(X2-X1) + Sqr(Y2-Y1)) = 0;
oder wenn man Math einbindet, dadurch

Delphi-Quellcode:
kollosion := Hypot(X2-X1, Y2-Y1) = 0;
Aber eigentlich hat ja die Kugel einen Radius R und somit ist der Abstand der Kugel (X, Y) von einem Punkt (a, b):

Delphi-Quellcode:
abstand := Hypot(x - a, y - b) - R;
Will man nun erkennen, ob eine Kugel mit einem anderen Objekt kollidiert, braucht den Punkt des Objekts, dessen Abstand zur Kugel am kleinsten ist, und der ist ziemlich abhängig von der Form des Objekts. Am einfachsten geht es mit zwei Kugeln, dann ist der Abstand der Kugeln gleich dem Abstand der Mittelpunkte abzüglich der beiden Radien. Bei allen anderen Objektformen muss man neu nachdenken.

Delphi-Narr 15. Dez 2009 18:26

Re: Merken, ob ein Objekt auf den Koordinaten ist
 
Da meine Objekte bis auf die eine Kugel fest sitzen, könnte ich bei Programmstart eine Liste erstellen, die alle belegten Koordinaten speichert. Wenn man nun die Kugel bewegt, dann wird geprüft, ob die neuen Koordinaten belegt sind und wenn schon, wird die Kugel auf die letzte Position gesetzt.
Das wäre ja möglich, doch müsste ich wirklich jedes Objekt damit verbinden... Ging das alles auch irgendwie unabhängig von Namen?

Das Spiel soll ähnlich sein wie Labyrinth. Ich will 2 Listen haben: Erste Liste: Position der Löcher und zweite Liste Position der Balken. Jetzt soll das Programm am Anfang alle Shapes mit der Form Kreis an die Funktion Datenbank1 abgeben und die macht dann eine verschachtelte Schleife:

Delphi-Quellcode:
if Shape.shape=stRectangle then
begin
for i:=0 to Shape.left+shape.width-shape.left do
  begin
    for h:=0 to Shape.top+shape.heigth-shape.top do
        begin
          //Schreibe Koordinaten in die Liste Balken
        end;
  end;
end
else if Shape.shape=stCircle then
  begin
       if Shape.name="Ball" then exit; //Verhindert, dass der Ball selber in die Liste kommt
       for h:=0 to Shape.top+shape.heigth-shape.top do
        begin
          //Schreibe Koordinaten in die Liste Löcher
        end;
  end;
Da ich aber später noch eine Art "Mapeditor" erstellen will, mit dem man Position und Größe der einzelnen Shapes festlegen kann und eigentlich beliebig viele hinzufügen könnte, kann ich das nicht mit jedem Shape einzeln machen...

Tyrael Y. 16. Dez 2009 10:05

Re: Merken, ob ein Objekt auf den Koordinaten ist
 
@Uwe Raabe

Natürlich ist dies eleganter.
Delphi-Quellcode:
kollosion := Hypot(X2-X1, Y2-Y1) = 0;
Ich wollte aber dem Threadersteller Pythagoras nicht "verschleiern" deshalb Power, damit der den Bezug sieht.
Beides ist aber Pythagoras und bei meinem sieht man den Bezug.

@Delphi-Narr
Du musst dir die Namen auch nicht merken.
Speichere deine Objekte in einer TList und gehe sie vor jedem neu Zeichnen durch und schaue, ob sie sich berühren.

Delphi-Narr 16. Dez 2009 20:23

Re: Merken, ob ein Objekt auf den Koordinaten ist
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe jetzt zwei Programme geschrieben. Einen MapEditor und das eigentliche Spiel.
Wen es interessiert, ich hab beide mal hochgeladen, eine Beispielmap ist auch dabei...
Das Das Dateisystem bitte nicht verändern, kommt sonst zu Problemen mit dem Mapeditor...

Gebt doch mal bitte eine Rückmeldung!
Liebe Grüße!

Edit:

Hier mal eine Anleitung für den Editor:

Also im Fenster Editor die Objekte auswählen, Start und Ziel durch Klicken auf das Fenster Map einfügen.
Die anderen Objekte durch ziehen (wie bei Paint) einfügen, man muss immer mit der Ecke oben links anfangen. Wenn man ein Loch auswählt, dann kann man auch einfach nur klicken (wie bei Start/Ziel) und es wird ein Standardloch erstellt. Dann einen Dateinamen eingeben und speichern. Ist später im Ordner "Maps" im Spielordner.

Im Spiel: Steuerung durch Pfeiltasten, am Anfang muss man einmal auf das Fenster klicken, damit es aktiviert wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:16 Uhr.
Seite 1 von 2  1 2      

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