AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi "Kollidieren" von drei Objekten verhindern
Thema durchsuchen
Ansicht
Themen-Optionen

"Kollidieren" von drei Objekten verhindern

Ein Thema von Luis · begonnen am 26. Dez 2018 · letzter Beitrag vom 2. Jan 2019
Antwort Antwort
Luis

Registriert seit: 26. Dez 2018
7 Beiträge
 
#1

"Kollidieren" von drei Objekten verhindern

  Alt 26. Dez 2018, 16:40
Delphi-Version: 5
Hallo ihr Lieben,

ich "muss" im Rahmen eines Schulprojektes ein kleines Spiel in Delphi programmieren und stoße dort an eine Hürde. Habe viele Möglichkeiten probiert ohne jeglichen Erfolg, weswegen ich nun anderweitig Hilfe benötige.
Im groben soll ein Spieler Kisten zu ihrem vorgegebenen Platz schieben. Mit zwei Kisten konnte ich auch noch ausdrücken, dass diese nie ineinander "verschmelzen" (also die gleichen Koordinaten haben), bei dreien scheitere ich daran. Ich werde einmal meinen letzten Lösungsversuch euch mitteilen:
Delphi-Quellcode:
 if player.top = k1.Top then
 if player.Left =k1.left then
 begin
 if k1.Top-50 =k2.Top then
 if k1.Left = k2.Left then
 k1.Top:=k1.Top
 else
 if k1.Top-50 =k3.Top then
 if k1.Left = k3.Left then
 k1.top:=k1.Top
 else
  k1.Top:=k1.Top-50;
  end;
Hier geht es um die Bewegung nach oben von der Kiste 1, also k1.


Und einmal meine "richtige" Lösung von dem Problem bei zwei Kisten:

Delphi-Quellcode:
 if player.top = k1.Top then
 if player.left = k1.left then
 if k1.Top-50 <> k2.Top then
 k1.Top:= k1.top-50
 else
 if k1.left <> k2.left then
 k1.Top:= k1.top-50
 else
 k1.Top:=k1.Top;
Danke schon einmal für eure Hilfe!
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.352 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: "Kollidieren" von drei Objekten verhindern

  Alt 26. Dez 2018, 17:53
Hi,

nur mal so als grundlegenden Ansatz:

So ist die Vergleichsfunktion in eine Funktion verpackt, die man dann immer wieder verwenden kann.

Später werden alle Objekte miteinander geprüft oder ein spezielles gegen alle anderen.

Der Code ist natürlich nur symbolisch.
Aber hilft Dir das etwas weiter?

Delphi-Quellcode:
function IntersectObject(O1, O2: TObjectIregendwas): Boolean;
begin
  Result := ... True or False ...;
end;

  ...
  for I := 0 to Objects.Count - 2 do
  begin
    iO := Objects[I];
    for J := Succ(I) to Objects.Count - 1 do
    begin
      jO := Objects[J];
      if IntersectObject(iO, jO) then
        Beep;
    end;
  end;

  TestO := Objects[Irgendeins];
  for I := 0 to Objects.Count - 1 do
  begin
    iO := Objects[I];
    if (TestO <> iO) then
    begin
      if IntersectObject(TestO, iO) then
        Beep;
    end;
  end;
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Luis

Registriert seit: 26. Dez 2018
7 Beiträge
 
#3

AW: "Kollidieren" von drei Objekten verhindern

  Alt 26. Dez 2018, 19:08
Ich muss ehrlich gestehen viele Sachen in diesem Quellcode kann ich (noch) nicht ganz nachvollziehen, aber das ist nicht deine Aufgabe. Werde mich in die Aspekte, die ich nicht nachvollziehen kann jetzt rein lesen und hoffe es dann zu verstehen. Mein simples Schul-Delphi wird für das Problem anscheinend einfach nicht ausreichen. Danke dir!
  Mit Zitat antworten Zitat
Luis

Registriert seit: 26. Dez 2018
7 Beiträge
 
#4

AW: "Kollidieren" von drei Objekten verhindern

  Alt 26. Dez 2018, 19:44
Ok ist jetzt bisschen doof, aber nach fast einer Stunde bin ich noch immer am selben Punkt, weil ich einfach nichts finde. Könntest du u.U. erläutern wie man z.B. objects.count verstehen muss? Also auf Deutsch ich verstehe das Grundprinzip, aber manche Sachen sind doch Neuland für mich.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.352 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: "Kollidieren" von drei Objekten verhindern

  Alt 26. Dez 2018, 20:30
Ich bin davon ausgegangen, dass Du einen Vergleich im Griff hast (habe das aber nicht weiter nachvollzogen).

Entsprechend habe ich das Problem so verstanden, dass Du auch weitere Kisten prüfen willst.
Dazu musst Du diese in einer Liste speichern und alle Einträge dann abarbeiten (statt einem Vergleich halt nacheinander alle vergleichen).

Die Vergleichslogik selbst kannst Du dazu am besten in eine eigene Funktion auslagern.


Zu Deinem Code würde ich empfehlen, den immer ordentlich einzurücken:
Delphi-Quellcode:
 if player.top = k1.Top then
   if player.left = k1.left then
     if k1.Top-50 <> k2.Top then
       k1.Top:= k1.top-50
     else
       if k1.left <> k2.left then
         k1.Top:= k1.top-50
       else
         k1.Top:=k1.Top;
Dann erkennt man, dass alle Prüfungen nur erfolgen, wenn player.top = k1.top ist.


So richtig verstehe ich nicht, was Du da machst.
Auf jeden Fall müsstest Du wohl Deine Kisten in einer Liste speichern und die Einträge nacheinander bearbeiten.

Sorry, falls ich Dich ganz falsch verstanden haben sollte.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Luis

Registriert seit: 26. Dez 2018
7 Beiträge
 
#6

AW: "Kollidieren" von drei Objekten verhindern

  Alt 26. Dez 2018, 20:42
Ich glaube, wir haben uns wirklich falsch verstanden. Ich möchte einen Spieler haben, welcher die Kisten (k1 und k2) bewegt, wenn er auf das "Feld" (also die gl Koordinaten wie eine Kiste hat) von diesen Kisten geht. Deswegen player.top = k1.top (und left). Nun soll sich eine Kiste nicht bewegen (und somit auch nicht der Spieler, aber das ist hier jetzt nicht so wichtig), wenn sie nach der Bewegung auf dem selben Feld wie eine andere Kiste wäre. Am Ende funktioniert also mein Quellcode für dieses Problem bei einer Kiste. Wahrscheinlich war die Lösung aber nicht die beste, weil ich es für alle Richtungen schreiben muss, das stimmt.

Nun möchte ich das selbe wie für zwei Kisten mit drei Kisten umsetzen und dort reichen mir (wahrscheinlich) diese Mittel nicht aus, weswegen ich ja nun nach Hilfe frage.
  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 01:37 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 by Thomas Breitkreuz