Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi DelphiX - Objekte drehen(Autos) (https://www.delphipraxis.net/29151-delphix-objekte-drehen-autos.html)

mimi 4. Sep 2004 17:53


DelphiX - Objekte drehen(Autos)
 
[/delphi]Hallo,
ich möchte ein kleines auto spiel schreiben und habe probleme mit dem drehn des autos:
Delphi-Quellcode:
procedure TGame.KeyCheck(Key:Word);
begin
  if Key = VK_RIGHT then begin
    if Player.zr + 10 <= Lings then
      Player.zr:=Player.zr+10;

//    Player.x:=Player.x-10;
  end;

  if Key = VK_Left then begin

    if Player.zr - 10 >= -Rechts then
      Player.zr:=Player.zr-10;

//    Player.x:=Player.x-10;
  end;

  if Key = VK_UP then begin
    Player.x:=Player.x+10;
  end;

  if Key = VK_Down then begin
    Player.x:=Player.x-10;
  end;

  if key = vk_f1 then stop:=not stop;
 
end;
Const:
Delphi-Quellcode:
const
  lings = 60;
  rechts = 60;
  oben  = 257;
  Unten = 130;
ich habe mir eine kleine grafik lib geschrieben dort habe ich den befehl DrawRoate verwendet:
Delphi-Quellcode:
procedure TDX.DrawRoateImage(Name:String; x,y,a,pi:Integer; cx,cy:Double);
var
  i:Integer;
begin
  i:=DXImageList1.Items.Find(Name).Index;
  DXImageList1.Items[i].DrawRotate(DXDraw1.Surface,x,y,DXImageList1.Items[i].Width,DXImageList1.Items[i].Height,pi,cx,cy,a);
end;
aufrufen tue ich den so:
Delphi-Quellcode:
procedure TGame.Draw;
var
  i:Integer;
begin
  for i:=0 to high(Map) do begin
   GFL.DrawImage(Map[i].Name,Map[i].Tex,Map[i].x,Map[i].y);
  end;

//   GFL.DrawImage('A' + IntToStr(Player.typ) + IntToStr(Player.richtung),0,player.x,Player.y);
  {if stop = False then begin
    if PLayer.zr1 >= 5 then begin
      Player.zr1:=0;
      if player.zr <= 360 then begin
        inc(player.zr);
      end
      else
        player.zr:=player.richtung;
    end
    else
      inc(player.zr1);
  end;}

  GFL.DrawText(IntToStr(PLayer.zr),300,400,16,clYellow,clRed);
  GFL.DrawRoateImage('A' + IntToStr(Player.typ),player.x,player.y,player.zr,0,1,0);
   
end;
der auskometrite teile war nur ein test(und ich weiß nicht ob ich den nochmal später brauche) der dreht einfach nur ein objekt immer und dies langsamm !!


das problem ist jetzt das der dreh winkel zu groß ist und ich würde auch noch gerne die geschwindigkeit einstellen können, wie mache ich dies genau ???

mimi 5. Sep 2004 09:04

Re: DelphiX - Objekte drehen(Autos)
 
so ich habe jetzt mal etwas getestet, was leider auch nicht geht:
Delphi-Quellcode:
 if (Player.richtung >= 260) or (Player.richtung <-260) then Player.richtung:=0;

  if KEY = VK_LEFT then Player.richtung:=Player.richtung-10;
  if KEY = VK_RIGHT then Player.richtung:=Player.richtung+10;

  if KEY = VK_UP then begin
    player.X :=round(player.X + Sin(player.richtung)*1.0);
    player.Y :=round(player.Y + Cos(player.richtung)*1.0);
  end;
warum geht das nicht ??? habe ich aus einem tutor, das round habe ich selbst da hingeschrieben.....

Thebe 5. Sep 2004 22:11

Re: DelphiX - Objekte drehen(Autos)
 
Delphi-Quellcode:
  if (Player.richtung >= 360) then
    Dec(Player.richtung, 360);
  if (Player.richtung < 0) then
    Inc(Player.richtung, 360);

  if KEY = VK_LEFT then Player.richtung:=Player.richtung-10;
  if KEY = VK_RIGHT then Player.richtung:=Player.richtung+10;

  if KEY = VK_UP then begin
    player.X :=round(Player.X+(Sin(player.richtung)*Player.Geschwindigkeit {oder so}));
    player.Y :=round(player.Y+(Cos(player.richtung)*Player.Geschwindigkeit {oder was Du eben hast}));
  end;

So würde ich das machen.


Und es kann angehen das der Drehwinkel nicht in in 360 Grad eingeteilt wird, sondern in 2*PI. Sprich 180° = PI und 360° = 2*PI. Um dann den korrekten Drehwinkel rauszukriegen musst Du rechnen:
Delphi-Quellcode:
winkel := (winkel/180)*PI;
Dann sollte das klappen.

mimi 6. Sep 2004 16:18

Re: DelphiX - Objekte drehen(Autos)
 
das mit den 180 hatte ich auch schon versucht, aber das mit den klammern habe ich nicht, ich teste es gleich, wenn ich wieder zu hause bin !!!

mimi 11. Sep 2004 18:10

Re: DelphiX - Objekte drehen(Autos)
 
deine idee hatte leider nicht funtkioniert!
aber ich habe es hier mit geschaft:
Delphi-Quellcode:
if keys[VK_UP] = True then Player.move:=-4;
  if keys[VK_Down] = True then Player.move:=+4;

  if keys[VK_Left] = True then Player.richtung:=-4;
  if keys[VK_RIGHT] = True then Player.richtung:=+4;

  player.X :=Player.x + player.move * Cos( 2*pi/256*Player.roate+pi/2);
  player.Y :=Player.y + player.move * Sin( 2*pi/256*Player.roate+pi/2);

  Player.roate:=Player.roate + Round(player.richtung);

  GFL.DrawRoateImage('Ship',round(player.x),round(player.y),player.roate,0,0.5,0.5);


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:50 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