Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Andorra 2d Billardspiel in 2d (https://www.delphipraxis.net/153275-andorra-2d-billardspiel-2d.html)

Memnarch 7. Jul 2011 13:48

AW: Andorra 2d Billardspiel in 2d
 
mh..hab zuhause noch ne unit Math3D liegen, die stammt aus nem Tutorial(hab ich von c++ nach Delphi geported) und beinhaltet Klassen für das erstellen und berechnen von Matrizen. Wenn du einfach den Z-wert gleich lässt bei den 3DVectoren, solltest du die so nutzen können. Vorteil ist halt das alles bereits vorhanden ist ;)

Bei bedarf lad ichs hoch.

MFG
Memnarch

Noobmaster 7. Jul 2011 14:13

AW: Andorra 2d Billardspiel in 2d
 
Vielen vielen Dank für dein Angebot. Beinahe hätte ich es auch wirklich in Anspruch nehmen müssen :-).
Habe jetzt nach stundenlangem Kopfzerbrechen - ganz versteckt - eine anscheinend funktionierende Lösung gefunden:
Delphi-Quellcode:
              //Hilfsvektoren:
              VekNormale     := TVek2d.Create;
              VekNeueRichtung := TVek2d.Create;

              //Normale zur Bande bestimmen = Spiegelachse
              VekNormale.x := cos(arctan(m[j]));
              VekNormale.y := sin(arctan(m[j]));

              //Neue Richtung:
              VekNeueRichtung.x := Richtung.x - 2*(Richtung.x*VekNormale.x + Richtung.y*VekNormale.y) * VekNormale.x;
              VekNeueRichtung.y := Richtung.y - 2*(Richtung.x*VekNormale.x + Richtung.y*VekNormale.y) * VekNormale.y;
              Richtung.x := -VekNeueRichtung.x;
              Richtung.y := -VekNeueRichtung.y;

              FreeAndNil(VekNormale);
              FreeAndNil(VekNeueRichtung);
Wie gesagt, anscheinend funktioniert er und das meiste versteh ich sogar :-D.
Wenn ich mein Projekt fertig gestellt habe, dann poste ich vielleicht mal ein Tutorial dazu, da das Programmieren eines eigenen Billardspiels offensichtlich sehr beliebt ist.

Memnarch 7. Jul 2011 14:18

AW: Andorra 2d Billardspiel in 2d
 
Ich hoffe du machst da noch methoden wie VecToAngle oder RotateVector ;)

Bin mal auf das spiel gespannt :)


MFG
Memnarch

Sinderion 7. Jul 2011 16:27

AW: Andorra 2d Billardspiel in 2d
 
Endlich gefunden, wusste doch dass ich so was auch schon mal programmiert habe:

Ist allerdings etwas umständlich gemacht, da es ursprünglich für Polygone gedacht war und anschließend auf einzelne Linien reduziert wurde (das ganze orientiert sich entfernt am Separating Axis Theorem)
Code ist zwar nicht wunderbar, sollte aber funktionieren.

Funktionen:
E liefert den Einheitsvektor
Invert den Normalvektor
Norm den Betrag(=Länge)

Delphi-Quellcode:
function TBall.LineIntersect(const A:TLine):boolean;
var axis,aa,b,vquer:TVector;
p_poly:array[0..1]of extended;
p_circle,M11,M22,M12,M21,pmin,pmax,winkel:extended;
begin
  result := false;
  //Projektion berechnen
  axis := E(Invert(A.Coords[1] - A.Coords[0]));
  p_poly[0] := axis * A.Coords[0];
  p_circle := axis * M;
  //keine Überschneidung wenn ...
  if abs(p_circle - p_poly[0]) > r then exit;

  //Projektion berechnen, zweite Achse
  axis := E(A.Coords[1] - A.Coords[0]);
  p_poly[0] := axis * A.Coords[0];
  p_poly[1] := axis * A.Coords[1];
  p_circle := axis * M;
  pmin := min(p_poly[0], p_poly[1]) - r;
  pmax := max(p_poly[0], p_poly[1]) + r;

  //keine Überschneidung wenn ...
  if not((pmin <= p_circle)and(p_circle <= pmax)) then begin
    result := false;
    exit;
  end;

  result := true;
  //ansonsten Kollision ...
  //Drehmatrix berechnen
  //v anpassen
  //zurückdrehen
  b := A.Coords[1] - A.Coords[0];

  aa.x := 1;
  aa.y := 0;

  winkel := aa * b / Norm(aa) / Norm(b);

  M11 := winkel; M21 := sqrt(1 - sqr(winkel));
  M12 := -M21;  M22 := M11;

  vquer.x := v.x * M11 + v.y * M21;
  vquer.y := v.x * M12 + v.y * M22;

  vquer.y := -1 * vquer.y;

//-Matrix mehr oder weniger ...., alpha = -alpha;
  M21 := -M21;
  M12 := -M12;

  v.x := vquer.x * M11 + vquer.y * M21;
  v.y := vquer.x * M12 + vquer.y * M22;
end;

Noobmaster 8. Jul 2011 09:17

AW: Andorra 2d Billardspiel in 2d
 
Danke nochmal für alle Antworten :-)
Zumindest nach vorläufigen Tests funktioniert die Bandenkollision nun. Letzte Anpassungen im Detail (die eher mit der Kollisionsbestimmung zu tun haben) fehlen noch, aber das ist nur noch Bastelarbeit. Dann kommt das Lochen (sehr einfach gestaltet) und dann der Rahmen des Spiels. Das wird mich jetzt eine Weile beschäftigen ;-)

Und wenn ich das alles habe und es funktioniert, dann versuche ich mich zumindest einmal an Effetwirkung (dann werde ich auch die Funktionen VecToAngle etc. schreiben müssen).

Ich hoffe, ich komme durch, ohne euch nochmal belästigen zu müssen :-).

Euer,

Noobmaster


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:02 Uhr.
Seite 4 von 4   « Erste     234   

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