![]() |
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:
Nun: das kann nicht funktionieren. Hat denn irgendjemand eine Idee, wie man das machen könnte?
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; Chris PS: Für den Anfang bitte erstmal nur eine horizontale Reihe der Bilder... |
Moin!
Hab das jetzt einigermaßen hinbekommen:
Delphi-Quellcode:
Allerdings werden die Sterne nicht oben in der Ecke gemalt, sondern irgendwo weiter unten. Was muss ich da ändern?
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; Chris |
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 |
??? Wie meinst du das?? genauer: kannst du mir da vielleicht ein wenig Source geben?
Chris |
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 |
aso, hatte den 2. post erst jetzt gesehen, sry
|
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:
Fertig, dass war es schon. Die Grafik liegt in der Imagelist und
...
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. wird automatisch 'gekachelt'. Gruss, arnoldo P.S. Code auch im Anhang |
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 |
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 ![]() mein etwas ausführlicheres Beispiel (Raumschiff-Demo) an, ich hoffe es hilft Dir weiter... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz