AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Rotierendes Array

Ein Thema von Igotcha · begonnen am 12. Jul 2004 · letzter Beitrag vom 14. Jul 2004
Antwort Antwort
Seite 1 von 2  1 2      
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#1

Rotierendes Array

  Alt 12. Jul 2004, 14:40
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:
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
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.

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
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#2

Re: Rotierendes Array

  Alt 12. Jul 2004, 14:50
Der uebliche Trick fuehrt ueber den Modulo Operator mod.
Das Array der Tiles sollte ab 0 indiziert sein.

Delphi-Quellcode:
  // Anfangsinitialisierung
  I := 0;

  // in der Schleife
  Inc(I);
  I := I mod 13;
Damit laeuft I immer von 0 bis 12.
  Mit Zitat antworten Zitat
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Rotierendes Array

  Alt 12. Jul 2004, 14:53
Zitat von Robert Marquardt:
Der uebliche Trick fuehrt ueber den Modulo Operator mod.
Das Array der Tiles sollte ab 0 indiziert sein.

Delphi-Quellcode:
  // Anfangsinitialisierung
  I := 0;

  // in der Schleife
  Inc(I);
  I := I mod 13;
Damit laeuft I immer von 0 bis 12.
Ich kann es jetzt leider nicht testen, aber I soll ja eben nicht immer von 0-12 laufen, sondern (Durchlauf bedeutet in diesem Fall, dass ein Tile komplett um 64 Pixel nach unten geschoben wurde):

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).
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#4

Re: Rotierendes Array

  Alt 12. Jul 2004, 19:43
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.
  Mit Zitat antworten Zitat
Benutzerbild von vlees91
vlees91

Registriert seit: 19. Apr 2004
843 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Rotierendes Array

  Alt 12. Jul 2004, 19:47
man könnte es ja so machen:
Delphi-Quellcode:
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!
dreizhenter und Zaehler müssen natürlich vorher deklariert werden(außer, wenn du es in basic machst(warscheinlich auch bei anderen programmiersprachen)).
vlees91
  Mit Zitat antworten Zitat
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Rotierendes Array

  Alt 12. Jul 2004, 20:24
Zitat von vlees91:
man könnte es ja so machen:
Genau so habe ich es in der Zwischenzeit auch realisiert, obwohl ich eigentlich nicht an das Array selbst wollte

Aber jetzt habe ich einen schönen Multilayer-Parallax-Sternen-Hintergrund

Danke nochmals...
  Mit Zitat antworten Zitat
Benutzerbild von vlees91
vlees91

Registriert seit: 19. Apr 2004
843 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Rotierendes Array

  Alt 13. Jul 2004, 14:27
Zitat von Robert Marquardt:
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.
geht meins nicht irgendwie einfacher, oder verstehe ich deins nicht
vlees91
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#8

Re: Rotierendes Array

  Alt 13. Jul 2004, 14:36
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!!!
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Benutzerbild von vlees91
vlees91

Registriert seit: 19. Apr 2004
843 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Rotierendes Array

  Alt 13. Jul 2004, 14:42
stimmt auch wieder
vlees91
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#10

Re: Rotierendes Array

  Alt 13. Jul 2004, 16:11
Das ist ja was ich angeboten habe. I ist der Index bzw Zeiger in das Array.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:45 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