Tilemap Scrolling
Übersicht

denialBetreff: Tilemap Scrolling |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Jo das hab ich ja gemacht.
Danke Jan_, habs hinbekommen ![]() |
||
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wie schnell ist das eigentlich mit Origin? ![]() 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 ![]() |
||
denial |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Macht rein gar keinen Unterschied:Code: [AUSKLAPPEN] Delay 1000
Ich habe zwei absolut gleiche Werte 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 ![]() 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
Da bringen ja die riesigen Schleifen alleine den Prozessor auf Betriebstemperatur for x=0 to 1500 if sichtbar darwimage tile(map(x,y)),x*32,y*32 next next ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hatte eigentlich die Origin-Methode gemeint ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
Oh, bin ich wieder einen schritt zuweit gegangen? | ||
between angels and insects |
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ist auch nicht verkehrt im den 'rechten Weg' zu zeigen ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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
Bei mir ist Multipliaktion 1 ms schneller und Division 1 ms langsamer. Also nicht wert darüber nachzudenken 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 ![]() ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hm Ok ![]() Dann ist Blitz wohl schon sehr gut optimiert, heisst ja nicht umsonst Blitz ![]() |
||
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group