Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Einen Winkel errechnen!? (https://www.delphipraxis.net/41071-einen-winkel-errechnen.html)

ISAS 25. Feb 2005 15:24

Re: Einen Winkel errechnen!?
 
Zitat:

A = arccos(X) * 180 / pi;
Gibt es bei Arctan(x) einen Unterschied oder folgt darauf auch *180 / pi??

Komme irgendwie nicht so richtig hin, da ich will, dass ein Sprite immer dahin schaut, wo die Maus ist.

sniper_w 25. Feb 2005 15:28

Re: Einen Winkel errechnen!?
 
Zitat:

A = arccos(X) * 180 / pi;
A = arcsin(X) * 180 / pi;
A = arctan(X) * 180 / pi;

ISAS 25. Feb 2005 15:37

Re: Einen Winkel errechnen!?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Es funktioniert trozdem nicht.
Ich geb mal die EXE-File dazu. Dann sieht man den Fehler besser.
Der Code für das lautet nämlich so:

Delphi-Quellcode:
Angle:=trunc((arctan((Aim.Y-Player.Y)/(Aim.X-Player.X)) * 180/pi));
Aim.Y-Player.Y ergibt die Gegenkathete
Aim.X-Player.X ergibt die Ankathete

sniper_w 25. Feb 2005 16:04

Re: Einen Winkel errechnen!?
 
Delphi-Quellcode:
Angle:=trunc((arctan((Aim.Y-Player.Y)/(Aim.X-Player.X)) * 180/pi));
Warum nicht so:
Delphi-Quellcode:
Angle:=Round((arctan((Aim.Y-Player.Y)/(Aim.X-Player.X)) * 180/pi));
Am sonsten, wenn du uns Code posten würdest, könnten wir hilfreicher sein.

ISAS 25. Feb 2005 16:10

Re: Einen Winkel errechnen!?
 
Naja, weil das der COde ist. Somit schaut der Spieler in die Richtung, wo die Maus ist. Sollte er jedenfalls. Ich poste mal den Code, wird aber auch nicht weiterhelfen.

Delphi-Quellcode:
Procedure TPlayer.domove(MoveCount: Integer);
begin

 Angle:=Round(arctan((Aim.Y-Player.Y)/(Aim.X-Player.X)) * 180/pi);

  inherited DoMove(MoveCount);
 
  X := Cos256(Angle)+200;
  Y := Sin256(Angle)+200;

end;
Zwar kann man hier nicht gehen, dass is aber auch unwichtig, da zuerst mal der SPieler in die richtige Richtung schaun muss, was er aber nicht tut

Binärbaum 25. Feb 2005 16:23

Re: Einen Winkel errechnen!?
 
Zitat:

Zitat von ISAS
...
Ich poste mal den Code, wird aber auch nicht weiterhelfen.

Delphi-Quellcode:
Procedure TPlayer.domove(MoveCount: Integer);
begin

 Angle:=Round(arctan((Aim.Y-Player.Y)/(Aim.X-Player.X)) * 180/pi);

  inherited DoMove(MoveCount);
 
  X := Cos256(Angle)+200;
  Y := Sin256(Angle)+200;

end;
Zwar kann man hier nicht gehen, dass is aber auch unwichtig, da zuerst mal der SPieler in die richtige Richtung schaun muss, was er aber nicht tut

Ich weiß zwar nicht genau, was die Funktionen Cos256 und Sin256 berechnen (wenn es Sinus- und Cosinuswerte sind, kann man doch auch sin und cos nehmen, oder besser SinCos), aber ich vermute jetzt mal dass es an den letzten beiden Zeilen liegt:
Delphi-Quellcode:
Procedure TPlayer.domove(MoveCount: Integer);
begin
  Angle:=Round(arctan((Aim.Y-Player.Y)/(Aim.X-Player.X)) * 180/pi);
  inherited DoMove(MoveCount);
 
  X := Cos256(Angle)*200;
  Y := Sin256(Angle)*200;
  {//oder:
   SinCos(Angle, Y, X);
   X:= 200*x;
   Y:= 200*y;}

end;

sniper_w 25. Feb 2005 16:33

Re: Einen Winkel errechnen!?
 
Ich hoffe das hilft:
Delphi-Quellcode:

type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Label2: TLabel;
    Label1: TLabel;
    Label3: TLabel;
    procedure FormPaint(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  center : tpoint;

implementation

uses Math;

{$R *.dfm}

procedure TForm1.FormPaint(Sender: TObject);
begin
 Canvas.FillRect(ClientRect);

 Canvas.MoveTo(0, height div 2);
 Canvas.LineTo(width, height div 2);

 Canvas.MoveTo(width div 2, 0);
 Canvas.LineTo(width div 2, height);

 center := point(width div 2,height - height div 2);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Canvas.Pen.Color := clBlack;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var angle,p : extended;

begin
  angle := 0;
  p := 1;
  FormPaint(self);
  Canvas.MoveTo(width div 2, height div 2);
  Canvas.LineTo(x,y);

  y := Height - y;
  Label1.Caption := 'y-center.Y = '+inttostr(y-center.Y);

  if (x-center.X <>0) then
  begin
   Angle := ArcTan((y-center.Y)/(x-center.X)) * 180 / pi;
   Label3.Caption := 'x-center.X = '+inttostr(x-center.X);

   if (angle<0)and(x-center.X<0) then angle := 180 + angle
        else
   if (x-center.X<0)and(y-center.Y<0) then angle := 180 + angle
        else
   if (y-center.y<0) then angle := 360 + angle;

   Label2.Caption := 'Current angle: '+Floattostr(angle)+ ' degrees.';
  end;
end;

ISAS 25. Feb 2005 17:38

Re: Einen Winkel errechnen!?
 
Danke, hat sehr geholfen. Wusste schon, worans liegt. Nämlich an den 360°, nicht 90°.
Jetzt hab ich nur noch ein Problem. Der richtige Winkel wird angezeigt, doch das Bild dreht sich nicht richtig. Hier ist der Code:

Delphi-Quellcode:
if (Aim.x-Player.X <>0) then
  begin
   Player.Angle := trunc(ArcTan((Aim.y-Player.Y)/(Aim.x-Player.X)) * 180 / pi);
   if (Player.Angle<0)and(Aim.x-Player.X<0) then Player.Angle := 180 + Player.Angle
        else
   if (Aim.x-Player.X<0)and(Aim.y-Player.Y<0) then Player.Angle := 180 + Player.Angle
        else
   if (Aim.y-Player.y<0) then Player.Angle := 360 + Player.Angle;
  end;
  Form1.Label2.Caption:=floattostr((Player.Angle-360)*-1);

  Player.X := Cos256((Player.Angle-360)*-1)+200;
  Player.Y := Sin256((Player.Angle-360)*-1)+200;
Nach dem Label2 das richtige ausgibt, stimmt nur irgendwas mit den letzten 2 Zeilen nicht.. Vielleicht sieht jemand was

Khabarakh 25. Feb 2005 18:52

Re: Einen Winkel errechnen!?
 
Wenn du uns jetzt noch verrätst, was sin256 und cos256 ist :wink: .
Ich verstehe auch dein Problem nicht. Du wolltest, dass der Spieler zum Ziel schaut, wozu veränderst du jetzt dessen Position? Und den Sinn hinter einer Addition oder Subtraktion eines Winkel mit 360° entdecke ich auch nicht (eine Funktion, die den Winkel auf 0..359 bringt, hätte ich noch verstanden).

ISAS 25. Feb 2005 18:59

Re: Einen Winkel errechnen!?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also:
sin256, cos256 hab ich beim suchen gefunden (Sprites drehen). Leider kA was die machn.

Der Spieler soll immer in die Richtung der Maus schaun.

Das ganze ist DelphiX, somit kann man mit Angle den Winkel des Spielers festlegen.

Der Winkel wird ja richtig errechnet. Nur das darstellen funktioniert nicht so ganz. Siehe EXE-File


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:37 Uhr.
Seite 2 von 4     12 34      

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