![]() |
Rotierendes Array
Hallo zusammen,
im Rahmen der Programmierung eines Spiels (nicht mit Delphi) stoße ich auf ein Problem, welches mir wirklich Kopfzerbrechen bereitet. Realisiert werden soll ein von oben nach unten scrollender Sternenhintergrund. Dazu habe ich mir 4 "Tiles" á 64x64 Punkte erstellt, die dann bei einer 1024x768 Auflösung in 12 Zeilen zu 16 Spalten in einem Array liegen. Aus programmtechnischer Sicht benötige ich natürlich eine 13. Zeile im oberen nicht-sichtbaren Bereich, der ja reingescrollt wird. Nehmen wir mal diesen Code, um das BGMAP-Array zu füllen:
Code:
FOR iY=0 TO 12
FOR iX=0 to 15 BGMAP(iX,iY)=RND(3) NEXT iX NEXT iY So, jetzt gibt es die "Game-Loop", die den Hintergrund forwährend scrollt:
Code:
Damit werden die Tiles kontinuierlich auf dem Screen gezeichnet und anschließend wird der Y-Wert zum Pasten um 1 Pixel erhöht, bis die nicht-sichtbare Reihe von oben vollständig im Screen ist (nach 64 Pixeln) - funktioniert auch soweit.
DO
FOR iY=0 TO 12 FOR iX=0 to 15 PASTE IMAGE BGMAP(iX,iY),(iX*64),(iY*64)+iStarScroll NEXT iX NEXT iY INC iStarScroll IF iStarScroll>64 iStarScroll=0 ENDIF SYNC LOOP Jetzt kommt aber das Problem: Sobald ein Umlauf von 64 Pixeln erfolgt ist, muss ich die unten rausgescrollte Zeile natürlich wieder oben anfügen und da hakt es im Moment... Zur Verdeutlichung, wie es sein müsste (die angegebenen Werte beziehen sich auf den Y-Wert im Array BGMAP - momentan noch iY): 1. Durchlauf 0,1,2,3,4,5,6,7,8,9,10,11,12 2. Durchlauf 12,0,1,2,3,4,5,6,7,8,9,10,11 3. Durchlauf 11,12,0,1,2,3,4,5,6,7,8,9,10 usw. Da ich das Array selbst nicht anfassen möchte, suche ich einen Weg, dieses im Code zu realisieren, also irgendwie mathematisch ein "rotieren" des Arrays in der Schleife abzubilden. Gruß Igotcha |
Re: Rotierendes Array
Der uebliche Trick fuehrt ueber den Modulo Operator mod.
Das Array der Tiles sollte ab 0 indiziert sein.
Delphi-Quellcode:
Damit laeuft I immer von 0 bis 12.
// Anfangsinitialisierung
I := 0; // in der Schleife Inc(I); I := I mod 13; |
Re: Rotierendes Array
Zitat:
1. Durchlauf 0,1,2,3,4,5,6,7,8,9,10,11,12 2. Durchlauf 12,0,1,2,3,4,5,6,7,8,9,10,11 3. Durchlauf 11,12,0,1,2,3,4,5,6,7,8,9,10 usw. und nach dem 13. Durchlauf wieder bei "0" anfangen (wie im 1. Durchlauf). |
Re: Rotierendes Array
Ah du laeufst rueckwaerts. 12x die Inc + mod Operation durchfuehren. Das ist ein Umlauf.
Nach jedem Umlauf um eins zuruecksetzen. Das geht nicht mit mod, sondern das muss man mit if I < 0 then I := 12; machen. Jetzt einfach den naechsten Umlauf. |
Re: Rotierendes Array
man könnte es ja so machen:
Delphi-Quellcode:
dreizhenter und Zaehler müssen natürlich vorher deklariert werden(außer, wenn du es in basic machst(warscheinlich auch bei anderen programmiersprachen)).
dreizehnter:=I[13];
for Zaehler:=0 to 13 do begin //muss nicht unbedingt if Zaehler<13 then I[Zaehler]:=I[Zaehler+1] //alle eins aufrücken! hopp hopp hopp else I[Zaehler{also 13}]:=dreizehnter; end; //wenn oben begin weg, dann auch das hier weg! |
Re: Rotierendes Array
Zitat:
Aber jetzt habe ich einen schönen Multilayer-Parallax-Sternen-Hintergrund :hello: Danke nochmals... |
Re: Rotierendes Array
Zitat:
|
Re: Rotierendes Array
Also eins versteh ich auch nicht!
Warum bewegt ihr die Daten im Array??? 0,1,2,3,4,5,6,7,8,9,10,12 Würde ich so immer beibehalten. Nur einen Zeiger definieren der mir zeigt, welches Element derzeit das erste ist. Von diesem Element würde ich dann immer die Daten darstellen. ==> Wesentlich schneller als das Array umzukopieren!!! |
Re: Rotierendes Array
stimmt auch wieder
|
Re: Rotierendes Array
Das ist ja was ich angeboten habe. I ist der Index bzw Zeiger in das Array.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09: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