Mapeditor problem (mal wieder ><)

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

eternitysoft

Betreff: Mapeditor problem (mal wieder ><)

BeitragSa, Jan 14, 2006 4:12
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Jan 14, 2006 9:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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
Twitter
 

Ava

Gast

BeitragSa, Jan 14, 2006 10:09
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! Wink


[/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!! Wink

5k41

BeitragSa, Jan 14, 2006 11:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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
 

Ava

Gast

BeitragSa, Jan 14, 2006 12:52
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. Rolling Eyes

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 Razz ). Du kannst dann anstatt x * 64 auch x * imagewidth(tileset) schreiben, dann brauchst Du solche Kleinigkeiten später nicht nochmal per Hand anpassen, falls Du Dein Tileset irgendwann einmal ausstauschen möchtest.

5k41

BeitragSa, Jan 14, 2006 13:20
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Jan 14, 2006 14:19
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Jan 14, 2006 17:02
Antworten mit Zitat
Benutzer-Profile anzeigen
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
 

Ava

Gast

BeitragSa, Jan 14, 2006 18:55
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

BeitragSa, Jan 14, 2006 19:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jan 17, 2006 20:23
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jan 18, 2006 8:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jan 18, 2006 14:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group