[B2d] Schnelles und einfaches Tilemap Scrolling

Übersicht BlitzBasic Codearchiv

Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.

DerHase

Betreff: [B2d] Schnelles und einfaches Tilemap Scrolling

BeitragDi, Apr 11, 2006 1:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Sep 28, 2006 10:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Wär schön wenn du noch eine Pixelgenaue Kollision mit der Dim Map anschneiden könntest.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!HAUPTSACH et kost VIEL!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

DerHase

BeitragDo, Sep 28, 2006 12:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile

Kryan

BeitragDo, Sep 28, 2006 18:56
Antworten mit Zitat
Benutzer-Profile anzeigen
ehm.....geht es hier nicht eigentlich um Scrolling?

Verwundert einen bisschen, dass der zweite Code gar kein scrolling unterstützt Sad
Webspaceanbieter?
Klick hier!
Kultige Spieleschmiede?
Klick hier!

DerHase

BeitragDo, Sep 28, 2006 19:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab doch nur auf Schranz0rs Frage geantwortet, da wollte ich nicht nen extra Thread aufmachen. Man kann ja beides sehr schnell zusammensetzen.

StepTiger

BeitragDo, Sep 28, 2006 19:03
Antworten mit Zitat
Benutzer-Profile anzeigen
stimmt, der zweite code scrollt nicht Smile
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 Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

Blitzcoder

Newsposter

BeitragDo, Sep 28, 2006 19:10
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Sep 28, 2006 19:25
Antworten mit Zitat
Benutzer-Profile anzeigen
aber kollision hat auch nichts mit scrolling zu tun Wink
Webspaceanbieter?
Klick hier!
Kultige Spieleschmiede?
Klick hier!

Blitzcoder

Newsposter

BeitragDo, Sep 28, 2006 19:52
Antworten mit Zitat
Benutzer-Profile anzeigen
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
________________
|°°°°°°°°°°°°°°||'""|""\__,_
|______________ ||__ |__|__ |)
|(@) |(@)"""**|(@)(@)****|(@)

BladeRunner

Moderator

BeitragDo, Sep 28, 2006 20:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group