Frei scroll und zoombare Tile_engine

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

 

krux

Betreff: Frei scroll und zoombare Tile_engine

BeitragMi, März 28, 2007 17:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Haupsächlich geht es hier um die Darstellung rasterorientierter Level die mit mehreren Kameras aus unterschiedlichen Perspektiven dargestellt werden können.

Aktuelle Version: 5
es werden nur Tiles gezeichnet, die wirklich auf dem Bild sind

im Data-ordner braucht man damit das Programm auch läuft noch folgende Bilddateien:
tiles.png:user posted image
teil.png: user posted image

ScrollEngine.bmx:
Code: [AUSKLAPPEN]
'ScrollEngine
SuperStrict

Type camera
   Global surfaces:TList = New Tlist
   Field posx#,posy#,zoom#
   Field VPx%,VPy%,VPwidth%,VPheight% 'Viewport
   
   Method update()
      SetViewport VPx,VPy,VPwidth,VPheight
      

      Local i%,j%,x#,y#,s:surface
      SetBlend MASKBLEND
      
      SetScale zoom,zoom
      
      For s = EachIn surfaces
         SetBlend MASKBLEND
         SetRotation 0

         Local tmp# = VPwidth/(s.TILEWIDTH*zoom)/2
         Local tmp2# = VPheight/(s.TILEWIDTH*zoom)/2
         For i% = posx*s.xspeed - tmp  To  posx*s.xspeed + tmp
            For j = posy*s.yspeed - tmp2 To posy*s.yspeed + tmp2
               If i>=0 And i<s.map.dimensions()[0] And j>=0 And j<s.map.dimensions()[1]
                  x#=(i-posx*s.xspeed)*s.TILEWIDTH*zoom+VPwidth/2+VPx
                  y#=(j-posy*s.yspeed)*s.TILEWIDTH*zoom+VPheight/2+VPy
                  DrawImage s.tiles,x,y,s.map[i,j]
               EndIf
            Next
         Next
         
         SetBlend ALPHABLEND
         
         Local v:visible
         For v = EachIn s.visibles
            Local x#,y#
            SetRotation v.rot
            'DrawImage v.image,(v.posx-posx)*s.TILEWIDTH*zoom*s.xspeed+VPwidth/2+VPx,(v.posy-posy)*s.TILEWIDTH*zoom*s.yspeed+VPheight/2+VPy
            x=(v.posx/s.xspeed-posx)*s.TILEWIDTH*zoom*s.xspeed+VPwidth/2+VPx
            y=(v.posy/s.yspeed-posy)*s.TILEWIDTH*zoom*s.yspeed+VPheight/2+VPy
            DrawImage v.image,x,y
         Next
      Next
   EndMethod
   
   Method ceterVisible(v:visible)
      posx=v.posx/v.s.xspeed
      posy=v.posy/v.s.yspeed
   End Method
   
   'Konstruktor
   Function create:camera(posx#,posy#,VPx%,VPy%,VPwidth%,VPheight%,zoom#=1)
      Local c:camera = New camera
      c.posx     = posx
      c.posy     = posy
      c.VPx      = VPx
      c.VPy      = VPy
      c.VPwidth  = VPwidth
      c.VPheight = VPheight
      c.zoom     = zoom
      Return c
   EndFunction
EndType

Type Surface
   Field visibles:Tlist = New TList
   Field tiles:TImage
   Field tilewidth%
   Field map:Byte[,]
   Field xspeed#
   Field yspeed#
   Function create:surface(tiles:TImage,tilewidth%,dat:Byte[,],xspeed#,yspeed#)
      Local s:Surface=New Surface
      s.tiles=tiles
      s.tilewidth=tilewidth
      s.map=dat
      s.xspeed=xspeed
      s.yspeed=yspeed
      Return s
   End Function
End Type
   
Type visible
   'Global liste:TList = New TList
   Field posx#,posy#,rot#
   Field image:TImage
   Field link:TLink
   Field s:surface
   
   Function createVisible:visible(s:surface,image:TImage,posx#=0,posy#=0,rot#=0)
      Local v:visible = New visible
      v.posx = posx
      v.posy = posy
      v.rot  = rot
      v.image= image
      v.s    = s
      'v.link = ListAddLast s.visibles,v
      v.link = s.visibles.AddLast(v)
      Return v
   End Function
   
   Rem
   Method New()
      liste.addlast(Self)
   End Method
   EndRem
   
   Method kill()
      RemoveLink(link)
   End Method
End Type

main.bmx
Code: [AUSKLAPPEN]
SuperStrict

Import "ScrollEngine.bmx"

Const BILDBREITE% = 1024
Const BILDHOEHE%  = 768

Local map1:Byte[50,50]
Local map2:Byte[40,40]
Local map3:Byte[30,30]
Local FRAMES% = 15
Local TILEWIDTH% = 100
Local tiles:TImage = LoadAnimImage("./data/tiles.png",TILEWIDTH,TILEWIDTH,0,FRAMES)

'Zufallskartengenerierung (nicht sonderlich kreativ ich weiß)
Local i%
Local j%
For i=0 Until map1.dimensions()[0]
   For j%=0 Until map1.dimensions()[1]
      map1[i,j]=Rand(0,FRAMES-1)
   Next
Next
For i=0 Until map2.dimensions()[0]
   For j%=0 Until map2.dimensions()[1]
      map2[i,j]=Rand(0,FRAMES-1)
   Next
Next
For i=0 Until map3.dimensions()[0]
   For j%=0 Until map3.dimensions()[1]
      map3[i,j]=Rand(0,FRAMES-1)
   Next
Next

'Erstellung aller drei ebenen (Die letzten zwei Zahlen geben die Größe im Verhältnis zu ersten ebene an, x und y Richtung)
Local s1:surface = surface.create(tiles,TILEWIDTH,map1,1.0,1.0)
Local s2:surface = surface.create(tiles,TILEWIDTH,map2,0.8,0.8)
Local s3:surface = surface.create(tiles,TILEWIDTH,map3,0.6,0.6)

'Einfügen der Ebenen in die Lister der für die Kameras sichtbaren Ebenen
ListAddFirst camera.surfaces,s1
ListAddFirst camera.surfaces,s2
ListAddFirst camera.surfaces,s3

Global teil:TImage=LoadImage("./data/teil.png")
MidHandleImage teil

Type car Extends visible
   Field speed#
      
   Method update()
      posx:+Cos(rot)*speed
      posy:+Sin(rot)*speed
      speed:*0.98
   End Method
   
   Method goleft()
      rot:-10*speed
   End Method
   
   Method goright()
      rot:+10*speed
   End Method
   
   Method goup()
      speed:+0.01
   End Method
   
   Method godown()
      speed:-0.01
   End Method
      
   Function create:car(s:surface,posx#=0,posy#=0,rot#=0)
      Local c:car=New car
      c.posx  =posx
      c.posy  =posy
      c.image =teil
      c.rot   =rot
      c.link  = s.visibles.AddLast(c)
      c.s     = s
      Return c
   EndFunction
End Type

'Main schleife, und alles, was so zur laufzeit gehört.

SetGraphicsDriver GLMax2DDriver()

Graphics BILDBREITE,BILDHOEHE,32

'camera.createworld()

'Kamera auf der oberen Hälfte des Bildes
Local cam:camera  = camera.create(25,25,0,          0,BILDBREITE,BILDHOEHE/2)
'Kamera auf der unteren Hälfte des Bildes
Local cam2:camera = camera.create(50,50,0,BILDHOEHE/2,BILDBREITE,BILDHOEHE/2)
'Erstellung des Autos. s2 gibt an, dass das Auto auf der Zweiten Ebene fahren wird
Local auto:car = car.create(s2,25,25)

Repeat
   If KeyDown(KEY_W) Then auto.goup()
   If KeyDown(KEY_S) Then auto.godown()
   If KeyDown(KEY_A) Then auto.goleft()
   If KeyDown(KEY_D) Then auto.goright()
   
   If KeyDown(KEY_UP)          Then cam.posy:-.2/cam.zoom
   If KeyDown(KEY_DOWN)       Then cam.posy:+.2/cam.zoom
   If KeyDown(KEY_LEFT)       Then cam.posx:-.2/cam.zoom
   If KeyDown(KEY_RIGHT)       Then cam.posx:+.2/cam.zoom
   If KeyDown(KEY_NUMSUBTRACT) Then cam.zoom:*0.99
   If KeyDown(KEY_NUMADD)       Then cam.zoom:*1.01

   cam2.ceterVisible(auto)
   cam2.zoom= 1/(auto.speed^2*2+1)
      
   If MouseDown(1)
      Global x#,y#,altx#,alty#
      altx=x
      alty=y
      x=MouseX()
      y=MouseY()
      If MouseHit(1)
         altx=x
         alty=y
      EndIf
      cam.posx:+(altx-x)/TILEWIDTH/cam.zoom
      cam.posy:+(alty-y)/TILEWIDTH/cam.zoom
   ElseIf MouseDown(2)
      Global x#,y#,altx#,alty#
      If MouseHit(2)
         x=MouseX()
         altx=x
         y=MouseY()
         alty=y
      Else
         x=MouseX()
         y=MouseY()
         MoveMouse(altx,alty)
         cam.posx:+(x-altx)/TILEWIDTH/cam.zoom
         cam.posy:+(y-alty)/TILEWIDTH/cam.zoom
      EndIf
   EndIf
   
   auto.update()
   
   SetViewport 0,0,BILDBREITE,BILDHOEHE
   Cls
      cam.update()
      cam2.update()   
   Flip
Until KeyHit(Key_Escape)


Steuerung

WSAD: steuerung des Autos
Pfeiltasten: steuerung Kamera1
Numpad +/-: zoom Kamera1
Maus1 gedrückt halten: scrollen wie in Black & white
Maus2 gedrückt halten: scrollen wie in Siedler 2
(wers nicht kennt: ausprobieren!)


Changelog:
Version 2
-jedes objekt von typ visible oder von typ visible abgeleitet wird automatisch von der Kamera im Bild dargestellt.
-Das Auto ist nun sichtbar
Version 3
-Dank den Viewports sind nun die Sichtbereiche mehrerer Kameres gleichzeitig auf dem Bildschirm darstellbar.
-Das gleichzeite Darstellen mehrerer Kameras hat den Moduswechsel überflüssig gemacht.
-Kamera1 kann nun mit der Maus gesteuert werden.
Version 4
-Die scrollengine hat nun ihre eigene Datei (Datenkapselung)
-Es können nun beliebig viele Ebenen hinzugefügt werden, die alle mit unterschiedlicher Geschwindigkeit scrollen
-Jedes Sichtbare Objekt kann einer Ebene zugeordnet werden, damit man auch Ebenen vor den Objekten haben kann. (Noch jehler bei der Darstellung auf untere Ebenen vorhanden, funktioniert aber)
Version5
-Fehler wurde behoben, man kann nun Objekte auf jeder Ebene erstellen, ohne dass es unschön aussieht.
-Neue methode zu "camera" hinzugekommen: Method ceterVisible(v:visible)
Meine todo list:
-weiche kameraschwenks von A nach B
-beim zoomen entsteht das gefühl, die Ebenen würden ihre Distanz zueinander verändern, das muss geändert werden.
  • Zuletzt bearbeitet von krux am Di, Apr 03, 2007 3:45, insgesamt 4-mal bearbeitet
 

krux

BeitragDo, März 29, 2007 21:02
Antworten mit Zitat
Benutzer-Profile anzeigen
also ich weis es ist nicht sher gut nen doppelpost zu senden, aber ich hätte ganz gern etwas feedback von euch, danke. Übrigens, ich habs eben auf version zwei geupdatet und Bilder eingebaut.
 

#Reaper

Newsposter

BeitragFr, März 30, 2007 11:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

dü könntest ja mal den Code so abändern, das er die Bilder automatisch aus dem Netz läd, dann muss man das nicht extra alles Speichern Wink
Ich schaus mir dann mal an Smile

#Reaper
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

Farbfinsternis

BeitragFr, März 30, 2007 13:03
Antworten mit Zitat
Benutzer-Profile anzeigen
sowas habe ich schon früher gepostet...

Klick
Farbfinsternis.tv
 

krux

BeitragFr, März 30, 2007 13:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Farbfinsternis hat Folgendes geschrieben:
sowas habe ich schon früher gepostet...

Klick

ich finde meins besser, zumal bei mir nicht in die obere linke ecke des bildes gezoomt wird, sondern in die mitte. Und ich habs anders strukturiert (also mehr in types und objekten und so. Also auch wnn das resultat gleich aussieht, ist der Weg dahin doch schon anders. Und dein Programm läuft nicht stabil. es stürzt hin und wieder ab.
 

krux

BeitragSa, März 31, 2007 16:24
Antworten mit Zitat
Benutzer-Profile anzeigen
(sorry für doppelpost)
hiermit mache ich drauf aufmerksam, dass ich auf ne neue Version geupdatet habe. Die änderungen lohnen sich auch.

Kann mir mal jemand behilflich sein, beim Datenkapseln. Wenn ich versuche die types camera und visible mit allen von den types benötigten Konstanten in eine externe Datei verlagere, dann zeigt der mir einen Fehler im type camera an, und zwar genau da, wo versucht wird das bild zu zeichnen.
 

krux

Betreff: Re: Frei scroll und zoombare Tile_engine

BeitragDi, Apr 03, 2007 1:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab jetzt wieder eine neue Version geupdatet, aber langsahm wirds mal Zeit, dass hier mal jemand was postet, es gab bisher noch überhaupt keine Kritik, das stört mich momentan schon ein wenig.

d-bug

BeitragDi, Apr 03, 2007 7:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ob dich das stört oder nicht ist eigentlich egal, aber ständiges Meinungsgebettel ist eher armseelig. Wenn jemand was dazu zu sagen hat, dann wird er es auch tun. Bitte unterlasse das pushen des Threads nur um Meinungen zu ergattern...

cheers

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group