Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi DelphiX: Sternenhimmel (https://www.delphipraxis.net/3378-delphix-sternenhimmel.html)

CalganX 9. Mär 2003 12:58


DelphiX: Sternenhimmel
 
Hi,
ich habe folgendes Problem: ich möchte, dass sich ein Sternenhimmel immer weiter nach links bewegt. Dieser Himmel ist eine einfache Grafik in einer DXImageList. Ich habe das ganze mal versucht, aber jämmerlich gescheitert (Division by zero; was auch klar ist). Folgendes in einem DXTimer:
Delphi-Quellcode:
var i: integer;
begin
  dec(counter);
  DXDraw1.Surface.Fill(0);
  for i:=1 to DXDraw1.SurfaceWidth div (128 + counter) do begin
    DXImageList1.Items[1].Draw(DXDraw1.Surface, i*(128 + counter), 0, 0);
  end;
  DrawShip(oldX, oldY);
end;
Nun: das kann nicht funktionieren. Hat denn irgendjemand eine Idee, wie man das machen könnte?

Chris

PS: Für den Anfang bitte erstmal nur eine horizontale Reihe der Bilder...

CalganX 9. Mär 2003 15:07

Moin!
Hab das jetzt einigermaßen hinbekommen:
Delphi-Quellcode:
procedure drawStars(mv: integer = 0);
var
  i, j: integer;
begin
  with FrmMain do begin
    for i:=1 to DXDraw1.SurfaceWidth div 128 do begin
      for j:=1 to DXDraw1.SurfaceHeight div 107 do begin
        DXImageList1.Items[1].Draw(DXDraw1.Surface, i*128 + counter, j*107, 0);
      end;
    end;
  end;
end;
Allerdings werden die Sterne nicht oben in der Ecke gemalt, sondern irgendwo weiter unten. Was muss ich da ändern?

Chris

Haegar 9. Mär 2003 15:08

kannste nicht 2 objekte mit gleichem bild nehmen, und diese dann hintereinander setzen, und wenn das erste objekt aus linken rand läüft, dann wieder nach ganz rechts setzen, und immer so weiter.

gruss haegar

CalganX 9. Mär 2003 15:13

??? Wie meinst du das?? genauer: kannst du mir da vielleicht ein wenig Source geben?

Chris

Haegar 9. Mär 2003 15:20

naja das mit dem source is sone sache ;)),. bin ja selber noch neuling in DelphiX, aber ich versuchs nochmal dir das zu erklären.
also du nimmst 2 objekte. diese haben als bild deinen sternenhimmel. die grösse entspricht genau dem bildschirmausschnitt, in dem es sich bewegt.
nun lässte du das 1.objekt von rechts nach links laufen! irgenwann ist dann der linke rand des objektes genau am linken rand des bildschirms. da das auch für den rechten rand zutrifft, musst du nun das 2. objekt gleich hintendran bewegen, damit keine lücken entstehen. jetzt käuft das alles weiter, und wenn nun der rechte rand des 1. objektes am linken rand des bildschirmes ist,dann setzt du es wieder an die anfangsposition, und es kann erneut von rechts nach links laufen.

so besser
wenn nicht, dann könnte ich versuchen dir das annem kleinen beispielprogramm zu zeigen.

gruss haegar

Haegar 9. Mär 2003 15:23

aso, hatte den 2. post erst jetzt gesehen, sry

arnoldo 16. Mär 2003 13:03

Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Chakotay1308,

also eine recht flüssige Bewegung erreichst Du unter DelphiX wenn Du
die SpriteEngine benutzt. Am Besten mit den Hintergrundsprites.

Hier ein paar Zeilen:

Code:
...
TBack = class(TBackgroundsprite)
public
 procedure DoMove(MoveCount: Integer);override;
end;

var
  MainForm: TMainForm;
  hg:tback;


implementation

{$R *.dfm}

procedure tback.DoMove(MoveCount: Integer);
begin
 inherited;
 x:=x-3;//die sterne werden pro frame um 3 pixel bewegt
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
 //Hintergrund wird geladen
 hg:=tback.Create(dxspriteengine1.Engine);
 hg.SetMapSize(1,1); //spielt bei hg.tile=true keine Rolle
 hg.Image:=DXImageList1.Items.Find('kachel'); //Die einzelne Grafik
 hg.Tile:=true; //Kacheleffekt
 hg.Z:=0;
end;

//Der Timer
procedure TMainForm.time(Sender: TObject; LagCount: Integer);
begin
 if not DXDraw1.CanDraw then Exit;
 dxspriteengine1.Move(0); // Sprites werden bewegt
 dxspriteengine1.Draw;   // und gezeichnet
 DXDraw1.Flip;           // Grafik wird ausgegeben
end;

end.
Fertig, dass war es schon. Die Grafik liegt in der Imagelist und
wird automatisch 'gekachelt'.

Gruss, arnoldo

P.S. Code auch im Anhang

CalganX 16. Mär 2003 13:23

Hi,
danke! Das funktioniert prima! Allerdings gibt es einen kleinen Schönheitsfehler: die Sprite liegt irgendwie über dem Schiff. Ich denke aber, dass ich den Fehler schon gefunden habe...

Chris

arnoldo 16. Mär 2003 14:58

Der 'Fehler' liegt am Z-Wert ('Höhenwert') der Sprites, setze
einfach hg.z:=-2 -> dann müsste es klappen.

Apropos Sprites, schau Dir mal im Thread Vorbei fliegendr Hintergrund
mein etwas ausführlicheres Beispiel (Raumschiff-Demo) an,
ich hoffe es hilft Dir weiter...


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