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

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

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

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
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.491 Beiträge
 
Delphi 12 Athens
 
#3

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 09:13 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