Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [DelphiX] Ruckelproblem wegen zu hoher Grafikqualität (https://www.delphipraxis.net/75638-%5Bdelphix%5D-ruckelproblem-wegen-zu-hoher-grafikqualitaet.html)

Nils_13 22. Aug 2006 20:50


[DelphiX] Ruckelproblem wegen zu hoher Grafikqualität
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

wenn bei DelphiX die Grafikqualität zu hoch ist (GTA2-Niveau), dann ruckelt es, wenn der Timer eine Bewegung zu rendern hat. Hat jemand von euch eine Idee, wie man eine Straße mit einer eigentlich schlechteren Grafikqualität dennoch gut aussehen lassen kann ? Im Anhang wird gezeigt, bei welcher Grafik es ruckelt.

igel457 22. Aug 2006 20:55

Re: [DelphiX] Ruckelproblem wegen zu hoher Grafikqualität
 
Ich kann mir nicht vorstellen, dass es von diesem Bitmap beginnt zu ruckeln.

Wie wäre es mit etwas Code?

//EDIT:
Was ist an dieser Grafik so "hoch-qualitativ" als an anderen? Ist das 32Bit?

Nils_13 23. Aug 2006 08:42

Re: [DelphiX] Ruckelproblem wegen zu hoher Grafikqualität
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wenn ich die Grafik mit Paint erstellen würde, würde es laufen. Hier der Code:
Delphi-Quellcode:
TCar = class(TImageSpriteEx)
  private
    speed: Single;
  public
    constructor Create(AParent: TSprite); override;
    procedure DoMove(MoveCount: Integer); override;
  end;

var
  frmMain : TfrmMain;
  Car    : TCar;

implementation

{$R *.DFM}

constructor TCar.Create(AParent: TSprite);
begin
  inherited Create(AParent);
  Speed := 0;
end;

procedure TCar.DoMove(MoveCount: Integer);
begin
  inherited DoMove(MoveCount);

  if (isLeft in frmMain.DXInput.States) and (speed <> 0) then
    if speed < 0 then
      Angle := angle + 1
    else
      Angle := angle - 1;

  if (isRight in frmMain.DXInput.States) and (speed <> 0) then
    if speed < 0 then
      Angle := angle - 1
    else
      Angle := angle + 1;

  if isUp in frmMain.DXInput.States then
  begin
    if speed < 7 then
      speed := speed + 0.05;
  end;

  if isDown in frmMain.DXInput.States then
  begin
    if speed < 7 then
      speed := speed - 0.05;
  end;

  X := X + cos256(Angle) * speed;
  if (x <= 0)(* or (x + width >= frmMain.DXDraw.Width)*) then
  begin
    x := x - cos256(Angle) * speed;
    speed := 0;
  end;

  Y := Y + sin256(Angle) * speed;
  if (y <= 0) or (y + height >= frmMain.DXDraw.height) then
  begin
    y := y - sin256(Angle) * speed;
    speed := 0;
  end;
end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  DXMap.LoadMap('map\maps\map2.dxm');

  Car := TCar.Create(DXSpriteEngine.Engine);
  with Car do
  begin
    Image := frmMain.DXImageList.Items.Find('Car');
    X := 150;
    Y := 380;
    Z := 0;
    Width := Car.Image.Width;
    Height := Car.Image.Height;
  end;
end;

// Interval=0
procedure TfrmMain.DXTimerTimer(Sender: TObject; LagCount: Integer);
begin
  DXInput.Update;
  DXSpriteEngine.Move(1);
  DXDraw.Surface.Fill(RGB(13, 180, 50));
  DXDraw.Surface.Fill(clBlack);
  with DXDraw.Surface.Canvas do
  begin
    Brush.Style := bsClear;
    Font.Size := 12;
    Font.Color := clRed;
    TextOut(0,0, 'FPS: ' + IntToStr(LagCount));
    Release;
  end;
  SpriteEngineMap.Draw;
  DXSpriteEngine.Draw;
  DXDraw.Flip;
end;

procedure TfrmMain.FormDestroy(Sender: TObject);
begin
  if not (DXMap = nil) then
  begin
    DXMap.Free;
  end;
  if not (DXDraw = nil) then
  begin
    DXDraw.Free;
  end;
end;
Falls du die DXMap noch nicht hast, findest du sie im Anhang. Du musst aber DelphiX deinstallieren und dann diese Version neuinstallieren, wenn du direkt das map-Package installieren willst, bekommst du eine AV.

JasonDX 23. Aug 2006 10:30

Re: [DelphiX] Ruckelproblem wegen zu hoher Grafikqualität
 
Zitat:

Zitat von Nils_13
Delphi-Quellcode:
procedure TfrmMain.DXTimerTimer(Sender: TObject; LagCount: Integer);
begin
  DXInput.Update;
  DXSpriteEngine.Move(1);
  DXDraw.Surface.Fill(RGB(13, 180, 50));
  DXDraw.Surface.Fill(clBlack);
  with DXDraw.Surface.Canvas do
  begin
    Brush.Style := bsClear;
    Font.Size := 12;
    Font.Color := clRed;
    TextOut(0,0, 'FPS: ' + IntToStr(LagCount));
    Release;
  end;
  SpriteEngineMap.Draw;
  DXSpriteEngine.Draw;
  DXDraw.Flip;
end;

d'oh
Du vermischst DirectX und GDI. Wenn du mit DirectX(/DelphiX) arbeitest, vergiss, dasses soetwas wie den Canvas ueberhaupt gibt.
DXDraw sollte eigentlich eigene Methoden zum Zeichnen von Text mitbringen, in meinen Augen wirkt das Schreiben auf den Canvas wie ne gezogene Handbremse ;)

greetz
Mike

pacman1986 23. Aug 2006 12:21

Re: [DelphiX] Ruckelproblem wegen zu hoher Grafikqualität
 
ich hatte dieses Ruckel Problem auch aber bei einer 30 mb großen Grafik. Ich hab das gelöst indem ich das in den Arbeitsspeicher geschrieben habe.
Wenn du die Bilder in der DXImagelist hast kannst du dann wenn du auf das bild in der liste klickst (OI) SystemMemory auf true setzen

Nils_13 23. Aug 2006 15:53

Re: [DelphiX] Ruckelproblem wegen zu hoher Grafikqualität
 
SystemMemory stand schon auf True. Mikes Lösung ist dir richtige, es ruckelt nur noch leicht. Danke!


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