[B2d] Schnelles und einfaches Tilemap Scrolling
Übersicht

![]() |
DerHaseBetreff: [B2d] Schnelles und einfaches Tilemap Scrolling |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hab grad jemanden ein kleines Scrolling Beispiel geschrieben. Vielleicht kann der eine oder andere auch was damit Anfangen. Im Prinzip geht es darum, dass man nur die Tiles malt, die auch wirklich auf dem Bildschrim zu sehn sind. Das ist sehr Resourcen schonend, hab es hier im Forum schon öfters anderst gesehn. Genug der Poesie, hier der Code:
Code: [AUSKLAPPEN] ;Grafikmodus etc. initialisieren
Graphics 640, 480, 0,2 HidePointer ClsColor 100,150,100 ;Kachel erstellen Global kachel = CreateImage(32,32) SetBuffer ImageBuffer(kachel) Color 50,50,200 Rect 0,0,32,32,1 Color 120,120,250 Line 0,0,0,30 Line 0,0,30,0 Color 10,10,100 Line 31,31,31,1 Line 31,31,1,31 SetBuffer BackBuffer() ;Variablen der "Kamere" Global cam_x Global cam_y Global cam_speed = 4 ;Die Tilemap wird hier erstellt Dim tilemap(100,100) For x = 0 To 99 For y = 0 To 99 tilemap(x,y) = 1 Next Next For x = 2 To 97 For y = 2 To 97 tilemap(x,y) = 0 Next Next For x = 6 To 93 For y = 6 To 93 tilemap(x,y) = Rand(0,1) Next Next ;Die Hauptschleife While Not KeyHit(1) Cam_Control() DrawTileMap() Flip:Cls Wend ;Die Sichtbaren Tile werden gezeichnet Function DrawTileMap() cam_x_div = cam_x / 32 cam_y_div = cam_y / 32 ;Malt 21*16 Tiles statt 100*100 Tiles For x = cam_x_div To cam_x_div + 20 For y = cam_y_div To cam_y_div + 15 If tilemap(x,y) = 1 DrawImage kachel,x*32-cam_x,y*32-cam_y End If Next Next End Function Function Cam_Control() ;Die Kamera wird hier mit Pfeiltasten gesteuert, Q und A beeinflussen den Speed If KeyDown(203) Then cam_x = cam_x - cam_speed If KeyDown(205) Then cam_x = cam_x + cam_speed If KeyDown(200) Then cam_y = cam_y - cam_speed If KeyDown(208) Then cam_y = cam_y + cam_speed If KeyHit(16) And cam_speed < 10 Then cam_speed = cam_speed + 1 If KeyHit(30) And cam_speed > 1 Then cam_speed = cam_speed - 1 ;Hier wird verhindert, dass die Kamera ausserhalb der Map gerät If cam_x < 0 Then cam_x = 0 If cam_y < 0 Then cam_y = 0 If cam_x > 2560 Then cam_x = 2560 If cam_y > 2720 Then cam_y = 2720 End Function Das ganze sollte man an einigen Stellen flexibler gestalten, vorallem die Abfrage der Kameraposition, sollte abhängig von der Tilezahl und Tilegrösse sein, aber das kriegt ihr sicher hin. Wenn ihr Anmerkungen oder Ideen zur Technik habt, dann schreibt. |
||
![]() |
Schranz0r |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wär schön wenn du noch eine Pixelgenaue Kollision mit der Dim Map anschneiden könntest. | ||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!HAUPTSACH et kost VIEL!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
![]() |
DerHase |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hier ich hab kurz was zusammengehackt:
Code: [AUSKLAPPEN] ;Grafikmodus etc. initialisieren
Graphics 640, 480, 0,2 HidePointer ClsColor 100,150,100 ;Kachel erstellen Global kachel = CreateImage(32,32) SetBuffer ImageBuffer(kachel) Color 50,50,200 Rect 0,0,32,32,1 Color 120,120,250 Line 0,0,0,30 Line 0,0,30,0 Color 10,10,100 Line 31,31,31,1 Line 31,31,1,31 SetBuffer BackBuffer() Global spieler = CreateImage(32,32) SetBuffer ImageBuffer(spieler) Color 255,255,20 Oval 0,0,20,20,1 SetBuffer BackBuffer() ;Variablen des Spielers Global Spieler_x = 80 Global Spieler_y = 70 ;Die Tilemap wird hier erstellt Dim tilemap(100,100) For x = 0 To 99 For y = 0 To 99 tilemap(x,y) = 1 Next Next For x = 2 To 97 For y = 2 To 97 tilemap(x,y) = 0 Next Next For x = 6 To 93 For y = 6 To 93 tilemap(x,y) = Rand(0,1) Next Next ;Die Hauptschleife While Not KeyHit(1) Spieler_Kontrolle() DrawTileMap() DrawImage spieler, spieler_x, spieler_y Kollision_Position Flip :Cls Wend ;Die Tilemap wird gezeichnet Function DrawTileMap() For x = 0 To 19 For y = 0 To 14 If tilemap(x,y) = 1 DrawImage kachel,x*32,y*32 End If Next Next End Function Function Spieler_Kontrolle() If KeyDown(203) Then spieler_x = spieler_x - 3 If KeyDown(205) Then spieler_x = spieler_x + 3 If KeyDown(200) Then spieler_y = spieler_y - 3 If KeyDown(208) Then spieler_y = spieler_y + 3 End Function ;Diese Funktion zeichnet ein Rotes Quadrat um die Tiles, die auf Kollision geprüft werden müssen Function Kollision_Position() For v = - 1 To 1 For w = -1 To 1 If tilemap(spieler_x/32+v, spieler_y/32+w) = 1 Color 255,0,0 Else Color 0,255,0 End If Rect ((spieler_x / 32)+v) * 32 , ((spieler_y / 32)+w) * 32,32,32,0 Next Next End Function Falls Deine Tiles nicht quadratisch sind, kannst Du Dir >>>DIESE<<< Funktion anschauen. Aber denk dran, für Dein jeweiliges Spiel solltest Du alles auf Deine Bedürfnisse optimieren. Bei den Codes hier geht es eher ums Prinzip ![]() |
||
![]() |
Kryan |
![]() Antworten mit Zitat ![]() |
---|---|---|
ehm.....geht es hier nicht eigentlich um Scrolling?
Verwundert einen bisschen, dass der zweite Code gar kein scrolling unterstützt ![]() |
||
Webspaceanbieter?
Klick hier! Kultige Spieleschmiede? Klick hier! |
![]() |
DerHase |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hab doch nur auf Schranz0rs Frage geantwortet, da wollte ich nicht nen extra Thread aufmachen. Man kann ja beides sehr schnell zusammensetzen. | ||
![]() |
StepTiger |
![]() Antworten mit Zitat ![]() |
---|---|---|
stimmt, der zweite code scrollt nicht ![]() |
||
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer: AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t Gewinner: BP Code Compo #2 Π=3.141592653589793238...<--- und das aus dem kopf ![]() Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser. |
![]() |
BlitzcoderNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
Aber es ist wirklich leicht die zusammenzubasteln | ||
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________ |°°°°°°°°°°°°°°||'""|""\__,_ |______________ ||__ |__|__ |) |(@) |(@)"""**|(@)(@)****|(@) |
![]() |
Kryan |
![]() Antworten mit Zitat ![]() |
---|---|---|
aber kollision hat auch nichts mit scrolling zu tun ![]() |
||
Webspaceanbieter?
Klick hier! Kultige Spieleschmiede? Klick hier! |
![]() |
BlitzcoderNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
Man braucht aber beides Für die meisten Spiele. | ||
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________ |°°°°°°°°°°°°°°||'""|""\__,_ |______________ ||__ |__|__ |) |(@) |(@)"""**|(@)(@)****|(@) |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Off-topic in den Smalltalk oder regelt das per pm.
Beides nützlicche Codeteile, aber Diskussion ist hier fehl am platz. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group