AGB  ·  Datenschutz  ·  Impressum  







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

Kollision Image Shape

Ein Thema von Maurooon · begonnen am 10. Apr 2017 · letzter Beitrag vom 12. Apr 2017
Antwort Antwort
Maurooon

Registriert seit: 7. Dez 2016
70 Beiträge
 
#1

Kollision Image Shape

  Alt 10. Apr 2017, 15:22
Delphi-Version: 5
Hey Leute,

kann mir jemand bei einer Kollisionsabfrage helfen? Es geht um folgendes: Ein Image bewegt sich per Pfeiltasten auf einer Form. Auf dieser Form finden sich aber noch mehrere Shapes, die als Hindernisse zu sehen sind. Wenn man das Image gegen eines dieser Shapes steuert, soll man sich nur noch von diesem Shape wegbewegen können. Ich habe mir bis jetzt folgende Gedanken gemacht:

Als erstes habe ich versucht, einfach eine Variable auf false zu setzen wenn entsprechende Koordinaten übereinstimmen und nur dann im KeyDown Event das Image bewegen zu können. Dann brauche ich aber ja für jedes Shape 4 Variablen, weil man ja wenn man bspw. von links in das Shape reinfährt, sich trotzdem noch nach oben, unten oder links bewegen können soll. Das muss ja eleganter gehen.

Dann habe ich versucht, in einem Timer die jeweilige Kollision abzufragen und mein Image bei Kollision automatisch wieder an den Rand des Shapes zu versetzen, doch ich konnte das Image trotzdem weiterhin durch die Shapes bewegen.

Ich suche also nach einer eleganten Version, ein Image nur dann mit den Pfeiltasten bewegen zu können, wenn es mit keinem der Shapes auf der Form kollidiert. Sollte es jedoch einmal kollidieren, sollte man das Image wieder zurückbewegen können. Damit das noch geschmeidigt aussieht, hab ich mir bisher als Kollisionszone sag ich mal immer einen 2 Pixel breiten Rand um das Shape gedacht. Bewegt man das Image da rein, ist die Bewegung in diese Richtung gesperrt.

Ich hoffe es findet sich hier jemand zurecht und die Zeit, mir bei meinem Problem behilflich zu sein.

LG
"One of the basic rules of the universe is that nothing is perfect. Perfection simply doesn't exist... Without imperfection, neither you nor I would exist." - Stephen Hawking
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#2

AW: Kollision Image Shape

  Alt 10. Apr 2017, 16:46
Wie funktioniert denn deine Steuerung? Sagen wir du drückst 1x die linke Pfeiltaste, bewegt sich das Shape dann einen "Schritt" nach links und das war's oder bewegt es sich so lange nach links bis es an Wand oder Hindernis kommt oder du eine andere Pfeiltaste drückst?
Ralph
  Mit Zitat antworten Zitat
Maurooon

Registriert seit: 7. Dez 2016
70 Beiträge
 
#3

AW: Kollision Image Shape

  Alt 10. Apr 2017, 18:00
Wie funktioniert denn deine Steuerung? Sagen wir du drückst 1x die linke Pfeiltaste, bewegt sich das Shape dann einen "Schritt" nach links und das war's oder bewegt es sich so lange nach links bis es an Wand oder Hindernis kommt oder du eine andere Pfeiltaste drückst?
Es bewegt sich pro Tastendruck um X Pixel in die jeweilige Richtung.
"One of the basic rules of the universe is that nothing is perfect. Perfection simply doesn't exist... Without imperfection, neither you nor I would exist." - Stephen Hawking
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#4

AW: Kollision Image Shape

  Alt 11. Apr 2017, 08:57
Aber dann ist es doch einfach. Nach einem Tastendruck in eine Richtung (sagen wir mal links) prüfts du zunächst, ob das Shape sich überhaupt nach links bewegen kann, oder ob es schon zu nach an einem Hindernis in dieser Richtung ist.
Ist es zu nah, verfällt halt die Bewegung / der Tastendruck.
Ist es nicht zu nah, bewegst du das Shape halt um maximal X Pixel in die gewünschte Richtung. Maximal deshalb, weil du natürlich prüfen musst, ob es nicht schon zuvor in Kollisionsnähe kommt.
Ralph
  Mit Zitat antworten Zitat
Maurooon

Registriert seit: 7. Dez 2016
70 Beiträge
 
#5

AW: Kollision Image Shape

  Alt 11. Apr 2017, 16:18
Das ist mir schon klar, nur ist das Hindernis nur bspw. 10 Pixel breit, das heißt wenn es um das Hindernis drum herum ist, soll es sich ja auch noch bewegen können. Deshalb brauch man ja quasi eine Zone, und dabei geht es mir darum, das elegant und einfach (im Sinne von wenig Quelltext) zu gestalten als mit 4 Variablen pro Hinderniss.
"One of the basic rules of the universe is that nothing is perfect. Perfection simply doesn't exist... Without imperfection, neither you nor I would exist." - Stephen Hawking
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.140 Beiträge
 
Delphi 12 Athens
 
#6

AW: Kollision Image Shape

  Alt 11. Apr 2017, 16:36
Wenn es sich um 10px bewegt, aber das hindernis weniger als 10px breit ist, dann mußt du auch zwischenpositionen prüfen. (im Extremfall eben jedes Pixel)

Und der Rest wurde doch schon gesagt?
* Du berechnest die neue Position
* prüfst ob es eine Kollision geben würde
* und wenn es kollidiert, dann wird das Objekt eben nicht bewegt.

Delphi-Referenz durchsuchenTypes.IntersectRect
Delphi-Referenz durchsuchenTRect.IntersectRect

Delphi-Referenz durchsuchenTypes.PtInRect
Delphi-Referenz durchsuchenTRect.PtInRect bzw. Delphi-Referenz durchsuchenTPoint.PtInRect
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Kollision Image Shape

  Alt 12. Apr 2017, 13:33
Ein kleines Beispiel(ungetestet):
Delphi-Quellcode:
function CanPosChanging(AControl: TControl; const ANewPos: TRect): Boolean;
var
  lControl: TControl;
  lRect: TRect;
begin
  // Überschneidung mit Shape ist unzulässig
  if Assgined(AControl.Parent) then
  begin
    for lControl in AControl.Parent.Controls do
    begin
      if lControl is TShape then
      begin
        if IntersectRect(lRect, lControl.BoundsRect, ANewPos) then
        begin
          Result := False;
          Exit;
        end;
      end;
    end;
  end;
  Result := True;
end;

procedure DoPosChanging(AControl: TControl; const ANewPos: TRect);
begin
  if CanPosChanging(AControl, ANewPos) then
    AControl.BoundsRect := ANewPos;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  dx, dy: Integer;
  lNewPos: TRect;
begin
  dx := 0;
  dy := 0;
  case Key of
    VK_UP: dy := -1;
    VK_DOWN: dy := +1;
    VK_Left: dx := -1;
    VK_RIGHT: dx := +1
  else
    Exit;
  end;
  // Testendruck nicht an anderer Stelle weiter verarbeiten
  Key := 0;

  lNewPos := MyImage.BoundsRect;
  OffsetRect(lNewPos, dx, dy);
  DoPosChanging(MyImage, lNewPos);
end;
  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 02:07 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