Frei scroll und zoombare Tile_engine
Übersicht BlitzMax, BlitzMax NG Codearchiv & Module
kruxBetreff: Frei scroll und zoombare Tile_engine |
Mi, März 28, 2007 17:59 Antworten mit Zitat |
|
---|---|---|
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: teil.png: 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 |
Do, März 29, 2007 21:02 Antworten mit Zitat |
|
---|---|---|
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. | ||
#ReaperNewsposter |
Fr, März 30, 2007 11:08 Antworten mit Zitat |
|
---|---|---|
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 Ich schaus mir dann mal an #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 |
Fr, März 30, 2007 13:03 Antworten mit Zitat |
|
---|---|---|
sowas habe ich schon früher gepostet...
Klick |
||
Farbfinsternis.tv |
krux |
Fr, März 30, 2007 13:46 Antworten mit Zitat |
|
---|---|---|
Farbfinsternis hat Folgendes geschrieben:
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 |
Sa, März 31, 2007 16:24 Antworten mit Zitat |
|
---|---|---|
(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. |
||
kruxBetreff: Re: Frei scroll und zoombare Tile_engine |
Di, Apr 03, 2007 1:53 Antworten mit Zitat |
|
---|---|---|
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 |
Di, Apr 03, 2007 7:30 Antworten mit Zitat |
|
---|---|---|
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 |
||
Übersicht BlitzMax, BlitzMax NG Codearchiv & Module
Powered by phpBB © 2001 - 2006, phpBB Group