Tilemap Scrolling

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

denial

Betreff: Tilemap Scrolling

BeitragDo, Aug 05, 2004 15:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Smile

Ich steh irgendwie momentan total auf'm Schlauch.
Ich will in eine Spielfigur über eine 2D-Tilemap bewegen. Diese Figur soll immer in der Mitte stehen, und bei Bewegung soll sich die Tilemap eben verschieben, sodass der Eindruck ensteht, der Spieler bewegt sich vorwärts...

Kein Problem, ich musste die Tilemap eben nur via Origin entsprechend X/Y Achse mit zwei Variablen (x_scroll,y_scroll) verschieben. Was aber, wenn ich den Spieler an einer bestimmten Startposition in der Tilemap stehen haben will? Einfach die beiden Startkoordinaten des Spielers an x_scroll und y_scroll leiten hat nicht funktioniert.... Dann wird alles total verschoben angezeigt oO

Kennt zu sowas jemand ein Beispielcode? Oder hat jemand 'n Tipp?

Danke

Jan_

Ehemaliger Admin

BeitragDo, Aug 05, 2004 15:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, ich nehme mal an, du willst sowas:

Code: [AUSKLAPPEN]
x_scroll=(-Graphicswidth/2)+PlayerX+(imagewidth(Spieler_Bild)/2)
Y_scroll=(-Graphicsheight/2)+PlayerY+(imageheight(Spieler_Bild)/2)


So, wurde nicht getestet
between angels and insects

Keimax

BeitragDo, Aug 05, 2004 20:49
Antworten mit Zitat
Benutzer-Profile anzeigen
wie?
der spieler steht doch immer an der selben stelle.
du musst die x und y achse deiner map ändern.
?
cu
XP3000, FX6600, 1024DDR, BB2d @ W2k,
- > Diesen Text bitte nicht beachten <-
 

denial

BeitragDo, Aug 05, 2004 21:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo das hab ich ja gemacht.
Danke Jan_, habs hinbekommen Smile

Jolinah

BeitragDo, Aug 05, 2004 21:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie schnell ist das eigentlich mit Origin? Wink

Ich hab bis jetzt immer eigenen Code verwendet.
Hab darauf geachtet das nie allzu grosse Zahlen entstehen können.
So hab ich 2 Scrollwerte pro Achse genommen und immer nur um die Tilebreite gescrollt. Wenn die Tilebreite erreicht ist hab ich dann den zweiten Scrollwert um 1 erhöht und den ersten Wert wieder zurückgesetzt.
Und die Tiles hab ich dann halt immer (X-Scrollwert2) * Tilebreite - Scrollwert1 gezeichnet.

Jetzt wollt ich gleich mal fragen ob das überhaupt nötig ist, ob es keine Rolle spielt wenn der Scrollwert ne recht grosse Zahl wird usw.
Mich würde zudem interessieren wie das die GB Spielentwickler machen falls das jemand weiss Wink
 

denial

BeitragDo, Aug 05, 2004 22:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich denke dass die größe der Zahl egal sein wird. Bei Origin wird der Startpunkt aller Zeichnungen versetzt - ob das nun eben 20 Pixel oder 100 sind, wird wohl nichts ausmachen.

Hubsi

BeitragDo, Aug 05, 2004 22:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Origin halte ich bei kleinen Maps durchaus für praktisch, aber ab einer gewissen Größe kann es den Rechner in die Knie zwingen wenn immer die ganze Map gemalt wird. Die Bereiche ausserhalb des Schirms werden zwar von der Graka ignoriert, hab ich mir mal sagen lassen (k. A. ob es wirklich stimmt), trotzdem wird der Prozessor damit unnütz beschäftigt Wink
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Jolinah

BeitragFr, Aug 06, 2004 2:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Also spielts eigentlich ja keine Rolle ob der Wert bis an die Integer Grenze kommt.

Nur finde ich ist es dann viel komplexer zu berechnen was überhaupt auf dem Bildschirm gezeichnet werden muss. Wenn ich nach dem vorgehe wie ich es oben geschrieben habe fallen die Divisionsrechnungen weg.
Es bleiben nur noch Addition oder Subtraktion womit die CPU weniger Probleme hat. Auf das wollte ich eigentlich hinaus wo ich nach der Geschwindigkeit gefragt habe.

Hubsi

BeitragFr, Aug 06, 2004 8:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Macht rein gar keinen Unterschied:Code: [AUSKLAPPEN]
Delay 1000
time1=MilliSecs()
For i=1 To 100000
wert=1-wert
Next
time1=MilliSecs()-time1

wert=2147483647
time2=MilliSecs()
For i=1 To 100000
wert=wert-1
Next
time2=MilliSecs()-time2
Print time1
Print time2
WaitKey()
End
Ich habe zwei absolut gleiche Werte Wink
Aber wenn die Map so groß ist das Du an die Grenzwerte der Integer kommst ist Origin doch auch fehl am Platz? Hier mal wie sich das in meinem Kopf darstellt: (vielleicht verstehe ich auch was falsch)Code: [AUSKLAPPEN]
for y=0 to 1000
 for x=0 to 1500
  if sichtbar darwimage tile(map(x,y)),x*32,y*32
 next
next
Da bringen ja die riesigen Schleifen alleine den Prozessor auf Betriebstemperatur Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Jan_

Ehemaliger Admin

BeitragFr, Aug 06, 2004 8:46
Antworten mit Zitat
Benutzer-Profile anzeigen
nope, ich sehe das so!

Code: [AUSKLAPPEN]
for x=(X_Screen_Pos/Tilegröße) to (X_Screen_Pos/Tilegröße)+Graphicswidth/Tilegröße
 for y=(y_Screen_Pos/Tilegröße) to (y_Screen_Pos/Tilegröße)+Graphicsheight/Tilegröße
  darwimage tile(map(x,y)),x*32,y*32
 next
next
between angels and insects
  • Zuletzt bearbeitet von Jan_ am Fr, Aug 06, 2004 9:31, insgesamt einmal bearbeitet

Hubsi

BeitragFr, Aug 06, 2004 9:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hatte eigentlich die Origin-Methode gemeint Wink Deinen Code noch etwas aus- und umgebaut ist ja die optimierte Methode eine Map zu scrollen.
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Jan_

Ehemaliger Admin

BeitragFr, Aug 06, 2004 9:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh, bin ich wieder einen schritt zuweit gegangen?
between angels and insects

Hubsi

BeitragFr, Aug 06, 2004 9:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist auch nicht verkehrt im den 'rechten Weg' zu zeigen Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

TheShadow

Moderator

BeitragFr, Aug 06, 2004 12:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei meiner Mapengine wird Origin nur für "Splitscreen" genutzt - man könnte also einen 2-Spieler-Modus machen oder andere Ansichten... Das Scrollen selbst wird immer manuell errechnet!
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

Jolinah

BeitragFr, Aug 06, 2004 12:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja ich habs bisher auch immer selber errechnet. Die Origin Methode finde ich zwar nicht schlecht. Aber so einen Befehl gibts sicher nicht in jeder Sprache Wink

Wie gesagt wollte ich eigentlich eher auf nen Geschwindigkeitsvergleich hinaus.

Das Beispiel von Jan zeigt doch sehr schön das man zum Berechnen von dem was angezeigt werden soll Divisionen braucht.

Und soviel ich weiss sind Divisionen und Multiplikationen langsamer als
Addition und Subtraktion.

Ich habs bis jetzt so gemacht:

Edit: (Sorry für die vielen edit's, habs nur optimiert)
Code: [AUSKLAPPEN]

;Tilebreite = 64
;Auflösung = 1024x768, 16 Tiles in x, 12 Tiles in y

Scroll_px = 0   ;Pixel Scroll Wert, geht immer bis Tilebreite
Scroll_x = 0     ;Tile Scroll Wert, scrollt um ein ganzes Tile

For y = 0 to 11
  For x = 0 to 15
    DrawImage tiles(x + Scroll_x,y),x * 64 - Scroll_px,y * 64
  Next
Next


Dann macht man die Schleife eigentlich immer nur von 0 bis Anzahl Tiles pro Screen minus 1.

Und zeichnet dann das Tile + Scroll_x an die Position x * Tilebreite - Pixelscroll

Weiss nicht ob das wirklich nen Speed Vorteil bringt, aber ich denke es ist schon besser als so viele Divisionen.
  • Zuletzt bearbeitet von Jolinah am Fr, Aug 06, 2004 13:05, insgesamt 2-mal bearbeitet

Hubsi

BeitragFr, Aug 06, 2004 12:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Jolinah hat Folgendes geschrieben:
Und soviel ich weiss sind Divisionen und Multiplikationen langsamer als Addition und Subtraktion.
Habs gerade mal getestet:Code: [AUSKLAPPEN]
Delay 1000
time1=MilliSecs()
For i=1 To 100000
wert=1-wert
Next
time1=MilliSecs()-time1

wert=2147483647
time2=MilliSecs()
For i=1 To 100000
wert=wert-1
Next
time2=MilliSecs()-time2

time3=MilliSecs()
For i=1 To 100000
wert=33*44
Next
time3=MilliSecs()-time3

time4=MilliSecs()
For i=1 To 100000
wert=66/33
Next
time4=MilliSecs()-time4

Print time1
Print time2
Print time3
Print time4
WaitKey()
End
Bei mir ist Multipliaktion 1 ms schneller und Division 1 ms langsamer. Also nicht wert darüber nachzudenken Wink Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Jolinah

BeitragFr, Aug 06, 2004 12:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm Ok Wink

Dann ist Blitz wohl schon sehr gut optimiert, heisst ja nicht umsonst Blitz Smile

Jan_

Ehemaliger Admin

BeitragFr, Aug 06, 2004 13:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Joa, ist klar, das da noch was zu optimieren geht.

Code: [AUSKLAPPEN]
Max_X=Graphicswidth/Tilegröße
Max_Y=Graphicsheight/Tilegröße
Repeat

Real_X=X_Screen_Pos/Tilegröße
Real_Y=y_Screen_Pos/Tilegröße
for x=Real_X to REal_X+Max_X
 for y=RealY to REal_Y+Max_Y
  darwimage tile(map(x,y)),x*32+X_Screen-Real_X,y*32+Y_Screen-Real_Y
 next
next
until keyhit(1)



Und, mit den Pixelweiße gehen und allen, da kommen schon noch paar veränderungen, wodurch noch paar divisionen gesparrt werden können.
between angels and insects

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group