![]() |
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:
Liebe Grüße
...
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; ... ... ... |
Re: Merken, ob ein Objekt auf den Koordinaten ist
Würde mich wundern wenn es da etwas vordefiniertes gibt...
Ganz am Ende dieses Themas ![]() Sehr hilfreich wie ich finde :) MfG Alaitoc |
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: |
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:
X und Y sind die Koordinatenbestanteile.
var kollision: boolean;
... kollosion := Sqrt(Power(X2-X1, 2) + Power(Y2-Y1, 2)) = 0; ... |
Re: Merken, ob ein Objekt auf den Koordinaten ist
Hm, kannst du das mal etwas erläutern. Versteh ich nicht so ganz... :gruebel:
|
Re: Merken, ob ein Objekt auf den Koordinaten ist
@Tyrael Y.
Meinst Du nicht, das ist mit Kanonen auf Spatzen geschossen?
Delphi-Quellcode:
sollte es eigentlich auch tun.
kollision:=((x1-x2)=0) and ((y1-y2)=0)
@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 |
Re: Merken, ob ein Objekt auf den Koordinaten ist
Also erstmal sollte man dies
Delphi-Quellcode:
durch das ersetzen
kollosion := Sqrt(Power(X2-X1, 2) + Power(Y2-Y1, 2)) = 0;
Delphi-Quellcode:
oder wenn man Math einbindet, dadurch
kollosion := Sqrt(Sqr(X2-X1) + Sqr(Y2-Y1)) = 0;
Delphi-Quellcode:
Aber eigentlich hat ja die Kugel einen Radius R und somit ist der Abstand der Kugel (X, Y) von einem Punkt (a, b):
kollosion := Hypot(X2-X1, Y2-Y1) = 0;
Delphi-Quellcode:
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.
abstand := Hypot(x - a, y - b) - R;
|
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:
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...
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; |
Re: Merken, ob ein Objekt auf den Koordinaten ist
@Uwe Raabe
Natürlich ist dies eleganter.
Delphi-Quellcode:
Ich wollte aber dem Threadersteller Pythagoras nicht "verschleiern" deshalb Power, damit der den Bezug sieht.
kollosion := Hypot(X2-X1, Y2-Y1) = 0;
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. |
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 05:22 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-2025 by Thomas Breitkreuz