AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Merken, ob ein Objekt auf den Koordinaten ist

Ein Thema von Delphi-Narr · begonnen am 15. Dez 2009 · letzter Beitrag vom 21. Feb 2020
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#1

Merken, ob ein Objekt auf den Koordinaten ist

  Alt 15. Dez 2009, 14:41
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
  Mit Zitat antworten Zitat
Alaitoc

Registriert seit: 24. Okt 2008
263 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Merken, ob ein Objekt auf den Koordinaten ist

  Alt 15. Dez 2009, 14:52
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
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Merken, ob ein Objekt auf den Koordinaten ist

  Alt 15. Dez 2009, 15:03
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
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Merken, ob ein Objekt auf den Koordinaten ist

  Alt 15. Dez 2009, 15:10
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.
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Merken, ob ein Objekt auf den Koordinaten ist

  Alt 15. Dez 2009, 15:53
Hm, kannst du das mal etwas erläutern. Versteh ich nicht so ganz...
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

Re: Merken, ob ein Objekt auf den Koordinaten ist

  Alt 15. Dez 2009, 16:11
@Tyrael Y.
Meinst Du nicht, das ist mit Kanonen auf Spatzen geschossen?
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.009 Beiträge
 
Delphi 12 Athens
 
#7

Re: Merken, ob ein Objekt auf den Koordinaten ist

  Alt 15. Dez 2009, 16:59
Also erstmal sollte man dies

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

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

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):

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.
Uwe Raabe
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Merken, ob ein Objekt auf den Koordinaten ist

  Alt 15. Dez 2009, 18:26
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...
  Mit Zitat antworten Zitat
Tyrael Y.

Registriert seit: 28. Jul 2003
Ort: Stuttgart
1.093 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Merken, ob ein Objekt auf den Koordinaten ist

  Alt 16. Dez 2009, 10:05
@Uwe Raabe

Natürlich ist dies eleganter.
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.
Levent Yildirim
Erzeugung von Icons aus Bildern:IconLev
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Merken, ob ein Objekt auf den Koordinaten ist

  Alt 16. Dez 2009, 20:23
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.
Angehängte Dateien
Dateityp: zip labyrinth_142.zip (339,6 KB, 12x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 14:40 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