Mapeditor problem (mal wieder ><)
Übersicht

![]() |
eternitysoftBetreff: Mapeditor problem (mal wieder ><) |
![]() Antworten mit Zitat ![]() |
---|---|---|
So hallo erstmal hab nach einer ganzen weile wieder mit BB angefangen und wollte eben wie damals erstmal einen kleinen Mapeditor progge.
So hab jetzt folgende 2 Probleme 1.Layer Ich will Layer Stufen einbauen (0=Boden,1=Objekte und Held,2=Über Held,3= Kollisionslayer).Dieses versuche ich mit einer dritten Dimension umzusetzen (map(breite,höhe,layer)) nur will das nicht richtig funktionieren sobald ich beim zeichnen der Map eine dritte For schleife hinzufüge für die Layers kann ich nurnoch auf der objekte Ebene zeichnen und er zeichnet immer nur das erste Tile sobald ich diese Schleife aber rausnehme geht es wieder mit der Auswahl Code: [AUSKLAPPEN] For l = 0 to 3 For x = 0 To map_width For y = 0 To map_height DrawImage Tileset$,x*16+153,y*16+23,map(x,y,l); Next Next Next +153 und +23 um oben und unten im Fenster abstand zu halten 2.Speedprobleme So desweiteren hab ich ein Speedproblem und zwar sobald ich eine Dimfeld erstellen lasse (sprich die Zeichenfläche) da hab ich dann ein FPS-wert von ca 5-14 FPS und ohne Dim ca 70-80 FPS Wird daran liegen das ich in der Schleife den rechten und oberen Kasten neuzeichnen lasse (ja ich weiß das macht man nicht oO weiß aber keine bessere Lösung) weil ich muss das Bild ja löschen und neu Zeichnen wegen den Mousekoordinaten die an der Linken Seite geschrieben werden. Hier nochmal der ganze Code Code: [AUSKLAPPEN] ;########################################## ;--> Const und Global Variablen setzen ;########################################## const TILE_X=16,TILE_Y=16,TRANZCOLOR1=255,TRANZCOLOR2=132,TRANZCOLOR3=132,GRAPHIC_W=800,GRAPHIC_H=600 Const GRAPHIC_AUF = 32,GRAPHIC_MODUS=2 Global map_width, map_height,tileset_laden$,Tileset$,newmap,my,mx,layer,x,y,l,mapx,mapy GLOBAL neu_w ,neu_h, laden_w ,laden_h, speichern_w ,speichern_h, beenden_w ,beenden_h ;########################################## ;########################################## ;--> Fenster erstellen Graphics GRAPHIC_W,GRAPHIC_H,GRAPHIC_AUF,GRAPHIC_MODUS ;########################################## ;--> Beim 1.Start werte setzen ;########################################## ;--> anfangswerte Dim map (0,0,3) layer=1 ;menü leisten zeichnen leiste_oben() leiste_links() ;########################################## ;########################################## ;--> Schleife starten while(keyhit(1)=0) ;--> FPS berechnen milliseks=MilliSecs() If milliseks-startcount>=1000 startcount=milliseks frames=frame frame=0 Else frame=frame+1 EndIf ;--> Mauskoordinaten mx=mousex() my=mousey() setbuffer backbuffer() cls ;########################################## ;--> neu einzeichnen ;########################################## ;-->menü leisten zeichnen leiste_oben() leiste_links() ;--> Wenn eine Map vorhanden ist dann zeichnen if newmap=1 then for l = 0 to 3 For x = 0 To map_width For y = 0 To map_height DrawImage Tileset$,x*16+153,y*16+23,map(x,y,l); next Next Next If MouseHit(1) Then mapx = (mx)/16+153 ;153 weil das fenster um 153 nach rechts verschoben ist mapy = (my)/16+23 ; 23 weil das fenster um 23 nach unten verschoben ist For x = 0 To map_width For y = 0 To map_height If RectsOverlap(x*16+154,y*16+23,16,16,MouseX(),MouseY(),1,1) Then if layer=1 then map(x,y,0)=tile end if if layer=2 then map(x,y,1)=tile map(x,y,3)=1 end if if layer=3 then map(x,y,2)=tile end if End If Next Next End If ;--> zeigt an weleches tile ausgewählt ist DRAWBLOCK Tileset$, 30, 300 ,tile end if ;--> 4 eck an der stelle wo die maus ist zeichnen if mx>153 and my>23 then mrx =mx-5 mry =my-5 Rect mrx,mry,16,16,0 rect 0,0,0,0,0 end if ;--> Informationstext schreiben Color 000,000,000 Text 3,60, "Maphöhe: " Text 85,60, map_height Text 3,80, "Mapbreite: " Text 85,80, map_width Text 3,100, "Set: " Text 55,100, tileset_laden$ Text 3,160, "FPS: " Text 85,160, frames Text 3,180, "Mouse X: " Text 85,180, mx Text 3,200, "Mouse Y: " Text 85,200, my Text 3,230, "Layer: " Text 85,230, layer Text 3,270, "Ausgewähltes Tile: " Text 3,330, "Layer1 (F1) ";boden 0 Text 3,340, "Layer2 (F2) ";normale 1 Text 3,350, "Layer3 (F3) ";über 2 ;kolli 3 ;########################################## ;########################################## ;########################################## ;--> Tasten und Button abfragen ;########################################## checknew = checknew() checkladen = checkladen() checkspeichern = checkspeichern() checkende = checkende() ;-->Abfragen ob ein Button gedrückt wurde (Neu,Laden,speichern,beenden) if checknew =1 then newmap() if checkladen =1 then color 255,255,255 text 200,100, "haha2" if checkspeichern =1 then color 255,255,255 text 300,100, "haha3" if checkende =1 then exit ;--> abfrage ob F1, F2 oder F3 dedrückt wurde wenn ja layer setzen if keydown(59)=1 then layer=1 if keydown(60)=1 then layer=2 if keydown(61)=1 then layer=3 If KeyDown(78) Then tile = tile+1 If KeyDown(74) Then tile = tile-1 ;########################################## ;########################################## flip 0 WEND ;########################################## ;--> functionen ;########################################## ;--> leiste oben function leiste_oben() neu$="Neu" laden$="Laden" speichern$="Speichern" beenden$="Beenden" Color 180,180,180 Rect 0,0,GRAPHIC_W,20 Color 250,250,250 LINE 0, 21, GRAPHIC_W, 21 Color 0,0,0 Text 20,5,neu$ ;Text Text 80,5,laden$ ;Text Text 150,5,speichern$ ;Text Text 250,5,beenden$ ;Text neu_w=Stringwidth(neu$) neu_h=stringheight(neu$) laden_w=Stringwidth(laden$) laden_h=stringheight(laden$) speichern_w=Stringwidth(speichern$) speichern_h=stringheight(speichern$) beenden_w=Stringwidth(beenden$) beenden_h=stringheight(beenden$) end function ;--> leiste links function leiste_links() Color 180,180,180 Rect 0,23,150,GRAPHIC_H-23 Color 250,250,250 LINE 151, 23, 151, GRAPHIC_H end function ;--> new geklickt? function checknew() if (Mousex()>20 AND MOUSEX()<20+neu_w) and (MouseY()>5 and MOUSEY()<5+neu_h) and(mousedown(1)=1) then return 1 end function ;--> laden geklickt? function checkladen() if (Mousex()>80 AND MOUSEX()<80+laden_w) and (MouseY()>5 and MOUSEY()<5+laden_h) and(mousedown(1)=1) then return 1 end function ;--> speichern geklickt? function checkspeichern() if (Mousex()>150 AND MOUSEX()<150+speichern_w) and (MouseY()>5 and MOUSEY()<5+speichern_h) and(mousedown(1)=1) then return 1 end function ;--> ende geklickt? function checkende() if (Mousex()>250 AND MOUSEX()<250+beenden_w) and (MouseY()>5 and MOUSEY()<5+beenden_h) and(mousedown(1)=1) then return 1 end function ;--> neue karte? function newmap() setbuffer backbuffer() cls color 125,125,125 map_width=Input ("geben sie die Breite an ") map_height=Input ("geben sie die Höhe an ") tileset_laden$=Input ("name des Tileset ") Tileset$ = LoadAnimImage("tiles/"+tileset_laden$,16,16,0,450) MASKIMAGE Tileset$, 255, 132, 132 cls Dim map (map_width, map_height,3) leiste_oben() leiste_links() For x = 0 To map_width For y = 0 To map_height DrawImage Tileset$,x*16+153,y*16+23,map(x,y,0); Next Next newmap=1 end function ;--> end Würde mich darüber Freuen wenn mir jemand helfen kann/würde bzw ein paar Optimierungstipps geben kann (unteranderem für den Speed aber auch so allg. ) mfg et |
||
![]() |
skey-z |
![]() Antworten mit Zitat ![]() |
---|---|---|
hab e zwar gerade keine Zeit mir dein ganzes Problem anzusehen, aber die schleife solltest du so durchgehen
1. layer 2. y 3 x das iost schneller, vlt kannst du so noch ein paar fps mehr rauskitzeln. |
||
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz BAC#57: 2. Platz |
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Was mir beim kurzen überfliegen sofort aufgefallen istt: Der Index in einem Array- oder Dim-Feld reicht IMMER von 0 bis Länge -1!
Wenn Du ein Dim-Feld mit (3, Breite, Höhe) erstellst, dann kannst (solltest!) Du es in der Schleife nur so abfragen: (0 bis 2, 0 bis Breite -1, 0 bis Höhe -1). Sonst bekommst Du falsche Werte heraus und manchmal sogar einen Laufzeitfehler. Das ist ja eigntlich auch ganz logisch. Wenn Du bspw. ein Feld mit 10 Einträgen erstellst und es anschliessend von 0 bis 10 ausliesst, dann liesst Du insgesamt 11 Einträge - und soviele sind ja gar nicht drin! ![]() [/Edit] Mist, vielleicht erzähle ich aber auch Käse? - ich hab grad nochmal überlegt und bin mir nun unsicher, ob das bei Blitz2D/3D nicht doch anders war?! (ich arbeite seit einem Jahr nur noch mit BMax) - Es könnte auch sein, dass Du mit Dim Feld(10) nicht 10, sondern 11 Einträge anlegst, und dann könntest Du diese 11 natürlich auch abfragen. Das ändert aber nichts daran, dass Du mit einer Schleife von 0 bis Höhe/Breite immer jeweils ein Feld mehr hast, als der Benutzer eigentlich eingestellt hat!! ![]() |
||
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jo du erzählst Käse! Das ist bei C++ php usw. so aber nicht bei BB2D und 3D...das ist ja das komische...ich hab sowas auch grad gemacht und hab jetzt aber auch keine zeit den ganzen code durchzugehen...also bei mir hat das super funktioniert...einfach dim feld(50,50,6) (da es bei mir 7 ebenen gibt) und dann eine tastenabfrage schreiben, mit der du zwischen den ebenen switchst und dann einfach if mousedown(1) then feld(mx,my,layer)=selection
und das auslesen sollte so gehn... for ebene=0 to 3 For x=0 to 50 For y=0 to 50 if feld(x,y)>0 then drawimage tileset,x*64,y*64,feld(x,y)1 next next ...das ist das was mir so grad einfällt...kann aber auch sein das ich nen kleinen denkfehler drin hab... |
||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Man sollte so etwas allerdings noch stark optimieren. In jedem Loop die komplette Map zu zeichnen, obwohl davon eigentlich nur ein sehr winziger Ausschnitt sichtbar ist, das ist nicht schön. ![]() Und wenn Du mit einem AnimImage als Tileset arbeitest, dann würde ich Dir empfehlen, stelle Deine Abfrage von Feld(x, y) auf > -1 (und setze "kein Feld" auf = -1), dann kannst Du im Tileset auch das Bild auf Frame 0 nutzen (denn hier bin ich mir sicher, zählt der Index von 0 bis Framecount -1 ![]() |
||
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
jop in meinem Spiel hab ichs auch optimiert für den editor hab ich dies nicht für nötig gehalten und sowieso wars nur eine grobe richtilinie... | ||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
![]() |
eternitysoft |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also erstmal danke das ihr mir hilft
@ava: Verstehe gerade nicht richtig wie du das mit der Abfrage >-1 meinst Und werde mal gucken das ich das so mache das nur der Teil gezeichnet wird der sichtbar ist danke schonmal dafür ^^ |
||
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Worauf du bei nem layer editor noch achten musst, dass du wenn die tiles auf 0 sind auf der layer nichts zeichnen lässt damit man die anderen layers durchsieht,... | ||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
5k41 hat Folgendes geschrieben: Worauf du bei nem layer editor noch achten musst, dass du wenn die tiles auf 0 sind auf der layer nichts zeichnen lässt damit man die anderen layers durchsieht,...
Und genau das meinte ich mit der Abfrage > -1. Das würde bedeuten, Du musst vorher alle Felder auf -1 setzen, um diese als "hier ist kein Feld!" zu kennzeichnen. Du könntest das aber auch genau so gut mit > 0 abfragen, wie Sk41 es schreibt. Dann wären halt alle Felder mit Inhalt 0 = kein Feld. Das hat dann den Vorteil, dass Du Deine Karte nach dem Dimensionieren nicht zurücksetzen musst, allerdings musst Du dann beim DrawImage vom Frame immer 1 abziehen oder Du verschwendest den ersten Frame in Deinem TileSet. |
||
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
achso ok das hab ich nicht verstanden sry^^ ich fand das bis jetzt immer (wie du ja auch scon gesagt hast) seht konfortabel nichts vorher berecnen zu müssen...wobei bei meinem jetztigen projekt lass ich es auch auf 999 (weil -1 bei mir noch das schwarze tile ist, welches man sehen soll) setzten weil es dann praktischer ist...naja musst du entscheiden, was dir mehr liegt! | ||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
![]() |
eternitysoft |
![]() Antworten mit Zitat ![]() |
---|---|---|
so erstmal danke Jungs es klappt jetzt soweit und zwar lag es daran
Code: [AUSKLAPPEN] if layer=2 then
map(x,y,1)=tile map(x,y,3)=1 end if liegt daran das ich beim Kollisions layer eine 1 einzeichnen lasse, dadurch setzt er auf dem höhsten layer das tile 1 >< und es wird alles überzeichnet und ich weiß jetzt nicht wie ich das umändern soll und dann muss ich mal gucken das ich irgendwie einbaue das man besser sieht auf welchem layer welches tile gesetzt wurde aber ich danke euch für eure hilfe mfg et |
||
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
Aloa
www.Mapeditor.de.vu da hste gleich alles drinne und ausserdem kostenlos. ansonsten, immer nur den Sichtbaren bereich zeichnen! 5k41 hat Folgendes geschrieben: Jo du erzählst Käse! Das ist bei C++ php usw. so
der Meister hat gesprochen, wie des öffteren misst, aber dafür zieht er über ava her, die sich nur Falsch ausgedrückt hat. |
||
between angels and insects |
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Um es genau zu sehen hatte sie sich nicht falsch ausgedrückt sondern gesagt, das ein array von 0 bis länge -1 geht was bei BB nicht stimmt! und mit dem käse damit hab ich sie nur bestätigt...ich weiss echt nicht was ich dir getan hab! | ||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group