Mapeditor mit variabler Tilegröße

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Baret

Betreff: Mapeditor mit variabler Tilegröße

BeitragDo, März 24, 2005 23:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!

Ich versuche einen Mapeditor zu programmieren bei dem man die Tilegröße selbst bestimmen kann.
Aber irgendwie ist mein Progamm viel zu langsam.
Ohne geladenem Tileset habe ich ca.74Fps danach nur mehr 7Fps.

Ich weiß, es ist etwas viel verlangt, aber vielleicht kann sich ja jemand den Code ansehen.

Die Funktion am Ende des Codes ist wahrscheinlich der Teil der zu opitimieren ist.
Ich poste zum besseren Verständnis trotzdem den ganzen Code.

Damit ihr das Programm testen könnt,benötigt ihr folgende dll,Bilder und folgendes Test-Bild.
Einfach starten und "Tileset laden" auswählen.

Testbild:
user posted image
Bilder:
user posted imageuser posted imageuser posted imageuser posted image
user posted imageuser posted imageuser posted imageuser posted image
DLL:
http://www.8ung.at/ms-online/btools.dll

Oder alles in einem Rar-Verzeichnis:
http://www.8ung.at/ms-online/Bilder+DLL.rar

BlitzBasic: [AUSKLAPPEN]

Graphics 800,600,16,2

SetBuffer BackBuffer()

;------------------------- Bilder laden -------------------------------
tilesetladen1=LoadImage(\"Tilesetladen1.jpg\")
tilesetladen2=LoadImage(\"Tilesetladen2.jpg\")
mapladen1= LoadImage(\"Mapladen1.jpg\")
mapladen2=LoadImage(\"Mapladen2.jpg\")
mapspeichern1=LoadImage(\"Mapspeichern1.jpg\")
mapspeichern2=LoadImage(\"Mapspeichern2.jpg\")
scroll1=LoadImage(\"scroll1.jpg\")
scroll2=LoadImage(\"scroll2.jpg\")
;-------------------------------------------------------------------------

Global pfad$
Global tileset
Global anzahltiles
Global hoehe
Global breite

font = LoadFont(\"Arial\",24,False,False,False)
SetFont font

Repeat
Cls


If ImageRectOverlap (tilesetladen1,370,10,MouseX(),MouseY(),1,1) Then
DrawImage tilesetladen2,370,10
If MouseDown(1) Then
tilesetladen()
EndIf
Else
DrawImage tilesetladen1,370,10
EndIf

If ImageRectOverlap (mapladen1,10,10,MouseX(),MouseY(),1,1) Then
DrawImage mapladen2,10,10
Else
DrawImage mapladen1,10,10
EndIf

If ImageRectOverlap (mapspeichern1,190,10,MouseX(),MouseY(),1,1) Then
DrawImage mapspeichern2,190,10
Else
DrawImage mapspeichern1,190,10
EndIf

If ImageRectOverlap (scroll1,553,575,MouseX(),MouseY(),1,1) Then
DrawImage scroll2,553,575
Else
DrawImage scroll1,553,575
EndIf

Line 550,0,550,600


If Not pfad$=\"\" Then
tilesetzeichnen()
EndIf

;-----------------------------FPS-------------------------------
milliseks=MilliSecs()
If milliseks-startcount>=1000
startcount=milliseks
frames=frame
frame=0
Else
frame=frame+1
EndIf
;-----------------------------------------------------------------



Text 5,580,frames
Flip

Until KeyHit(1)





;----------------------FUNKTIONEN-------------------------
Function Rahmentext(TextimRahmen$,pos_x,pos_y)
Rect pos_x-3,pos_y,StringWidth (TextimRahmen)+7,StringHeight(TextimRahmen)+2,0
Text pos_x,pos_y,TextimRahmen
End Function
Function tilesetladen()
Cls
pfad$=loadfile(\"Auswahl\",\"Alle Dateien|*.*|.bmp|*.bmp|.png|*.png|.jpg|*.jpg|.pcx|*.pcx|.tga|*.tga|.iff|*.iff\")
pfadok$=Right$(pfad,4)

If pfadok=\".bmp\" Or pfadok=\".png\" Or pfadok=\".jpg\" Or pfadok=\".pcx\" Or pfadok=\".tga\" Or pfadok=\".iff\" Then
Locate 100,250
hoehe = Input (\"Bitte geben Sie die Höhe eines Tiles an:\")
Locate 100,270
breite = Input (\"Bitte geben Sie die Breite eines Tiles an: \")
Locate 100,290
anzahltiles= Input(\"Bitte geben Sie die Anzahl der Tiles an:\")

tileset=LoadAnimImage (pfad,breite,hoehe,0,anzahltiles)
tilesetzeichnen()

Else
Text 300,290,\"Ungültiges Dateiformat\"
Text 275,310,\"Weiter mit beliebieger Taste\"
Flip
WaitKey()
EndIf

End Function
Function tilesetzeichnen()
spalte=0
zeile=0
aktuellepositiony=0
aktuellepositionx=548
anzahl=Floor((800-553)/(breite+5))
For i=0 To anzahltiles-1
If spalte<anzahl Then
aktuellepositionx=548+spalte*breite+5
aktuellepositiony=zeile*hoehe+5
DrawBlock tileset,aktuellepositionx,aktuellepositiony,i
spalte=spalte+1
ElseIf (800-553)<breite Then
aktuellepositiony=zeile*hoehe+5
DrawBlock tileset,553,aktuellepositiony,i
zeile=zeile+1
Else
zeile=zeile+1
spalte=1
aktuellepositiony=zeile*hoehe+5
DrawBlock tileset,553,aktuellepositiony,i
EndIf
Flip
Next
End Function
;-------------------------------------------------------------------


Vielen Dank im Voraus

Mfg
Baret

diGGa

GruppenKaspar

BeitragDo, März 24, 2005 23:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Zeile 92: Function 'loadfile' not found
Gestern Nacht Schlug der Regen an mein Fenster
Ich ging durch das dunkle Zimmer und
glaubte im Licht der Straßenlampe
Den Geist unseres jahrhunderts auf der
Straße zu sehen
Der uns sagte, daß wir alle am Rande
des Abgrunds stehen.
- Al Steward


Athlon 64 3000+ / Radeon 9600 / 1024mb ddram

Firstdeathmaker

BeitragFr, März 25, 2005 1:40
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
Function tilesetzeichnen() 
spalte=0
zeile=0
aktuellepositiony=0
aktuellepositionx=548
anzahl=Floor((800-553)/(breite+5))
For i=0 To anzahltiles-1
If spalte<anzahl Then
aktuellepositionx=548+spalte*breite+5
aktuellepositiony=zeile*hoehe+5
DrawBlock tileset,aktuellepositionx,aktuellepositiony,i
spalte=spalte+1
ElseIf (800-553)<breite Then
aktuellepositiony=zeile*hoehe+5
DrawBlock tileset,553,aktuellepositiony,i
zeile=zeile+1
Else
zeile=zeile+1
spalte=1
aktuellepositiony=zeile*hoehe+5
DrawBlock tileset,553,aktuellepositiony,i
EndIf
Flip
Next
End Function


Warum hast du das Flip denn in der For-Schleife? kann es daran liegen?
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Hubsi

BeitragFr, März 25, 2005 11:02
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
If ImageRectOverlap(tilesetladen1,370,10,MouseX(),MouseY(),1,1) Then
DrawImage tilesetladen2,370,10
If MouseDown(1) Then
tilesetladen()
EndIf
Else
Das bewirkt zwar nicht sofort den von dir beschriebenen Fehler, ist aber dennoch eine Todsünde Very Happy Grafiken, Sounds, Schriften etc. immer nur einmal laden. Bei jedem Ladevorgang wird VRam, bzw Ram für das neue Medium belegt. Solange bis alles voll ist und der Computer explodiert Wink
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

maximilian

BeitragFr, März 25, 2005 11:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Dachte ich am Anfang auch, aber es bleibt ja mmer das gleiche Bild, das neu landen macht also nichts aus.

LordChaos
Variety is the spice of life. One day ignore people, next day annoy them.

Hubsi

BeitragFr, März 25, 2005 11:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ist völlig egal ob das Bild dasselbe ist oder ein anderes Wink Wirds nochmal geladen ists halt zweimal im Speicher Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Baret

BeitragFr, März 25, 2005 16:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstmal DANKE für Eure vielen Antworten.

@Firstdeathmaker: Habe das Flip jetzt aus der For-Schleife genommen und habe dadurch schon einige Fps gwonnen (habe jetzt 37 statt 7!!)

@Hubsi und LordChaos: Ich verstehe nicht so ganz was Ihr meint!
Es ist eigentlich so gedacht dass man im Editor durch einen Klick auf den Button "Tileset laden" ein Tileset auswählt, welches anschließend geladen wird. d.h.: Wenn man während dem Editieren bemerkt man bräuchte doch ein anderes Tileset, dann ladet man dieses einfach.

@diGGa: Dieser Fehler kommt, wenn du die .dll-Datei nicht im selben Verzeichnis wie den Quellcode hast!
Hier nochmal der Link zur DLL:
http://www.8ung.at/ms-online/btools.dll

Mfg
Baret

Baret

BeitragFr, März 25, 2005 17:14
Antworten mit Zitat
Benutzer-Profile anzeigen
So habe den Fehler jetzt endgültigt beseitigt.
Habe den "Flip" Befehl total aus der Funktion entfernt und führe ihn nur mehr in der Hauptschleife aus.
Dadurch habe ich jetzt 74Fps! Very Happy
 

Timo

BeitragFr, März 25, 2005 17:27
Antworten mit Zitat
Benutzer-Profile anzeigen
jetzt schreib statt "Flip" einfach mal "Flip 0" und ich wette du kommst über 100FPS Wink

Baret

BeitragFr, März 25, 2005 19:32
Antworten mit Zitat
Benutzer-Profile anzeigen
WOW !
Ich kannte diese Art von Flip bisher noch nicht! Embarassed

Habe jetzt 158Fps Very Happy Edit: 378Fps

VIELEN DANK

Mfg
Baret

maximilian

BeitragFr, März 25, 2005 20:54
Antworten mit Zitat
Benutzer-Profile anzeigen
@Hubsi: Du meinst wenn ich schreibe:

img_bla = LoadImage("bla.bmp")
img_bla = LoadImage("bla.bmp")

, ich das Bild 2x im Speicher habe? o_O

LordChaos
Variety is the spice of life. One day ignore people, next day annoy them.

Hubsi

BeitragSa, März 26, 2005 0:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, das ist so. Versuch folgendes:BlitzBasic: [AUSKLAPPEN]
Print AvailVidMem()
bla=LoadImage(\"irgendwas.bmp\")
Print AvailVidMem()
bla=LoadImage(\"irgendwas.bmp\")
Print AvailVidMem()
WaitKey()
Wink
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Baret

BeitragSa, März 26, 2005 14:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Also habe jetzt irgendwie ein neues Problem!

Wenn ich einmal ein Tileset mit Hilfe der dll geladen habe, kann ich keine Datei-Befehle(WriteFile,usw.) ausführen.
Weiters kommt beim 2.Verwenden der dll-Funktion(loadfile) eine Fehlermeldung!

Ich glaube das ist in etwa so, wie wenn man eine Datei nach Gebrauch nicht schließt (mit closefile).

Ich hoffe Ihr wisst was ich meine!

Vielleicht könnt ihr selbst ja ein wenig mit der DLL herumprobieren.

Oder könnt ihr mir eine Alternative zu dieser Datei-Auswahl nennen?

Vielen Dank im Voraus

Mfg
Baret

Baret

BeitragSa, März 26, 2005 15:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe das ganze jetzt auf die BlitzSys dll umgestellt.

Der Fehler, dass beim 2. Öffnen eines Tilesets ein Fehler kommt, ist jetzt jetzt nicht mehr vorhanden.
Ich kann aber noch immer keine Datei erstellen.

Der Code für das Speichern einer Map:

BlitzBasic: [AUSKLAPPEN]

Function Mapspeichern()
Cls
Text 10,280,\"Bitte gib einen Namen für die Map ein\"
Locate 10,300
mapname$ = Input (\"(Achtung: sollte eine Map mit dem gleichen Namen bereits existieren, wird diese überschrieben) : \")
filename = WriteFile(\"Maps\\"+ mapname + \".map\")
If filename=0 Then
Cls
TextMittig(\"Speichern fehlgeschlagen\",290)
TextMittig(\"Weiter mit beliebieger Taste\",310)
Flip
WaitKey()
Else
For tileinmap.tileinmap = Each tileinmap
WriteLine filename,tileinmap\Tilenummer
WriteLine filename,tileinmap\posx
WriteLine filename,tileinmap\posy
Next
CloseFile filename
EndIf
End Function



Mfg
Baret

DA

BeitragSa, März 26, 2005 16:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin,

Also der Code ist soweit richtig.
Ich schätze mal das es an den Types liegt.
Hast du die Types auch global deklairt?

Thx
DarkAngel
Deutscher Blitz Basic Chat

Baret

BeitragSa, März 26, 2005 16:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Sind die Types nicht sowieso Global?
Denn wenn ich Global davor setze, bekomme ich die Meldung "Expecting Identifier"!

Aber das Programm kommt gar nicht bis zu den Types, sondern die If-Bedingung (If filename=0) wird bestätigt sobald ich ein Tileset geladen habe!Und filename dürfte(laut Hilfe) nur dann Null sein, wenn ein Fehler beim Laden aufttritt!
Wenn ich ohne ein Tileset zu laden speichere, funktioniert es einwandfrei und die Datei wird im gewünschten Ordner angelegt.

Mfg
Baret

DA

BeitragSa, März 26, 2005 16:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin,

mh.
Setz mal am Anfang:
BlitzBasic: [AUSKLAPPEN]

Global Type.Typename

ein.

So wird ein Typ global.

Thx
DarkAngel
Deutscher Blitz Basic Chat

Baret

BeitragSa, März 26, 2005 17:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Also das funktioniert bei mir nicht (Expecting Identifier)

Mfg
Baret

DA

BeitragSa, März 26, 2005 17:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin,

Du must natürlich im Rest des codes auch die Variablen ändern:
BlitzBasic: [AUSKLAPPEN]

Global a.Type
Function Mapspeichern()
Cls
Text 10,280,\"Bitte gib einen Namen für die Map ein\"
Locate 10,300
mapname$ = Input (\"(Achtung: sollte eine Map mit dem gleichen Namen bereits existieren, wird diese überschrieben) : \")
filename = WriteFile(\"Maps\\"+ mapname + \".map\")
If filename=0 Then
Cls
TextMittig(\"Speichern fehlgeschlagen\",290)
TextMittig(\"Weiter mit beliebieger Taste\",310)
Flip
WaitKey()
Else
For a = Each Type
WriteLine filename,a\Tilenummer
WriteLine filename,a\posx
WriteLine filename,a\posy
Next
CloseFile filename
EndIf
End Function


Thx
DarkAngel
Deutscher Blitz Basic Chat

Baret

BeitragMo, März 28, 2005 13:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry, dass ich nicht schneller geantwortet habe!

Also das mit den Types hat leider nichts gebracht!

Aber wenn du den Code ansiehst, siehst du, dass das Programm gar nicht bis zum Speichern der Type-Werte kommt,sondern schon vorher aus der If-Bedingung "aussteigt".

Denn solbald ich ein Tileset lade, bzw. die Funktion "DLLGetOpenFileName$" verwende, wird bei "WriteFile("Maps\" + mapname + ".map") immer 0 zurückgeliefert.

Mfg
Baret

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group