Laden und speichern geht nur wenn Editornicht beendet wurde

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

WEBLink

Betreff: Laden und speichern geht nur wenn Editornicht beendet wurde

BeitragSo, Aug 21, 2005 13:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, bei meinen Editor funktioniert das Laden und speicher nur so lange wie der Editor läuft. Beendet man ihn und startet neu. Kommt beim laden gar nix mehr ... außer man zeichnet nochmals so viele Tile wie bei der gespeicherten Map gebraucht wurden.

Leider hab ich zur Zeit kein webspace. also hier mal der gesamte Code. Das laden und speichern erfolgt ganz unten am Ende.

BlitzBasic: [AUSKLAPPEN]
; Starttile wird festgelegt
Ebene1Chip = 1
AZahlE = 1
kartenname$ = \"unbekannt\"







Graphics 800,600,32,2
.restart
viereck=CreateImage(20,20)
SetBuffer ImageBuffer(viereck)


; Kartengröße
; Die Kartengröße kann nur in 40 cm2 vorranschreiten das heisst
; min. 40*40 nach oben keine Grenzen gesetzt aber so addieren
; 80*80, 120*120, 160*160 oder auch 200*240,440*800 u.s.w.

kartexmax = 1660 - 1
karteymax = 1660 - 1
Gitter = 1 ; Aufliegende Gitter = AN


Type imga
Field x,y
Field tileIndex
End Type

Dim Ebene1a(100)
Dim kastenx(100000)
Dim kasteny(100000)








button = LoadAnimImage(\"gfx\datagfx\button.bmp\",79,10,0,2)
me1 = LoadAnimImage(\"gfx\datagfx\me1.bmp\",15,15,0,2)

; Icons

menueicon = LoadAnimImage(\"gfx\datagfx\menueicon.bmp\",29,13,0,2)





; Hier optional mit LoadImage das Bild laden

fenster1 = LoadImage(\"gfx\datagfx\Fenster\fenster1.bmp\")
fenster2 = LoadImage(\"gfx\datagfx\Fenster\fenster2.bmp\")
fenster3 = LoadImage(\"gfx\datagfx\Fenster\fenster3.bmp\")
fenster4 = LoadImage(\"gfx\datagfx\Fenster\fenster4.bmp\")
hilfsfenster = LoadImage(\"gfx\datagfx\Fenster\hilfsfenster.bmp\")


mapdesigne = LoadImage(\"gfx\datagfx\Mapdesigne.bmp\")
scroll = LoadImage(\"gfx\datagfx\scroll.bmp\")
mouse1 = LoadImage(\"gfx\datagfx\mouse.bmp\")
mouse2 = LoadImage(\"gfx\datagfx\mouse2.bmp\")
mouse = LoadImage(\"gfx\datagfx\point.bmp\")
kasten = LoadImage(\"gfx\datagfx\kasten.bmp\")
scro = LoadImage(\"gfx\datagfx\scro.bmp\")
lo = LoadImage(\"gfx\datagfx\lo.bmp\")
vier = LoadImage(\"gfx\datagfx\vier.bmp\")

; Boden

B1 = LoadImage(\"gfx\Boden\grass.bmp\")
B2 = LoadImage(\"gfx\Boden\Dreck.bmp\")


; Tiles Ebene 1 werden geladen

bdaten = LoadImage(\"GFX\bild.bmp\")
bildy = ImageHeight(bdaten)
bildx = ImageWidth(bdaten)
bildgesamt = bildx * bildy
anzahl = (bildgesamt / 20^2)

Ebene1 = LoadAnimImage(\"gfx\bild.bmp\",20,20,0,anzahl)
anzahl = anzahl - 1
For Ebene1Chip = 1 To anzahl ; Chips werden einmal durchgegangen
MaskImage Ebene1, 0, 255,0
Next



; Für Ebene 2

; Ebene1a(Ebene1Chip) = LoadImage(\"gfx\\"+Ebene1Chip+\".bmp\") ; Laden aller Chips
; MaskImage Ebene1a(Ebene1Chip), 0, 255,0


; Einzellne Bilder werden Tranzparent gemacht
MaskImage Mapdesigne ,0,255,0
MaskImage mouse1 ,0,255,0
MaskImage mouse2 ,0,255,0
MaskImage kasten ,0,255,0
MaskImage scroll ,0,255,0
MaskImage scro ,0,255,0
MaskImage button ,0,255,0
MaskImage fenster1 ,0,255,0
MaskImage vier ,0,255,0
MaskImage menueicon ,0,255,0
MaskImage mouse2 ,0,255,0


;image=CreateImage(40,40)
;SetBuffer ImageBuffer(image)
;Color 0,255,0
;Oval 0,0,40,40,0
;EIn Bild selbst kreiern


kasten_nor = kasten ; Untergrundfläche
mouse_nor = mouse1

; Schriftart wird gesetzt
font=LoadFont (\"arial\",12,1)
SetFont font

; Boden = Grass
bo = B1


; Start
SetBuffer BackBuffer()
Repeat
Cls



; Mousepositionen
mx = MouseX()
my = MouseY()

mxs = mx - sk ; mx mit scroll
mys = my - sk2 ; my mit scroll


mousedown1 = MouseDown(1)
MouseHit1 = MouseHit(1)



; Untergrundfläche
For kasteny(fachx) = 0 To karteymax Step 60
For kastenx(fachx) = 0 To kartexmax Step 60
If fachx < kartexmax Then
fachx = fachx + 1
EndIf
DrawImage bo, kastenx(fachx) + sk , kasteny(fachx) + sk2
Next
Next




; Variablen um untergrund wechseln zu können
fuellart = kasten_nor



; Viereck darf sich nur auf der Karte bewegen
If Not mxs > kartexmax Then
If Not mxs =< 0 Then
If Not mys =< 0 Then
If Not mys > karteymax Then

vierX = mx / 20 * 20
vierY = my / 20 * 20

EndIf
EndIf
EndIf
EndIf


; Klick mit linker Maustaste und Tile wird gemalt

For img.imga = Each imga

If ImagesOverlap(viereck, vierx - sk,viery - sk2, Ebene1, img\x, img\y) Then nopaint = 1; Else nopaint = 0
Next




;Viereck


If rechtemaus = 0 And loeschen = 0 And nopaint = 0 Then

DrawImage ebene1,vierx,viery, AZahlE

If mousedown1 Then

;For img.imga = Each imga
;If ImageRectCollide(,mx,my,0,Ebene1,img\x + sk,img\y + sk2, img\tileIndex) Then Delete img.imga
;Next




img.imga=New imga
img\x=vierX - sk
img\y=vierY - sk2
img\tileIndex = AZahlE

Tileanzahl = Tileanzahl + 1


EndIf
EndIf


; Tiles werden durchgegangen und gezeichnet

For img.imga = Each imga





;For AZahlE = anzahl To anzahl
;DrawImage Ebene1a(img\tileIndex),img\x + sk,img\y + sk2
DrawImage Ebene1,img\x + sk,img\y + sk2, img\tileIndex
Color 255,255,255
If ImagesCollide(mouse,mx,my,0,Ebene1,img\x + sk,img\y + sk2, img\tileIndex) Then Text mx + 15,my,\"Nr:\"+img\tileIndex+\" Zahl:\"+Zahl+\"\" : nopaint = 1: If loeschen = 1 Then Delete img.imga
Color 0,0,0

;Next
Next



; letztes Tile wird gelöscht
If loeschen = 1 Then mouse_nor = mouse2 Else mouse_nor = mouse1


If MouseDown(2) Then rechtemaus = 1 Else rechtemaus = 0

If rechtemaus = 1 Then
If Mousehit1 Then
loeschen = loeschen Xor 1


; img.imga=Last imga
; Delete img.imga
EndIf
EndIf




; Erstellt Viereck


Color 255,255,255
Rect vierX , vierY, 20, 20, 0
Color 0,0,0

; Schaltflächen werden gezeichnet

DrawImage fenster1,1,512
If mekl = 0 Then
DrawImage fenster2,100,512
EndIf

; Ein und aus blenden

If mousehit1 Then
If ImagesCollide(mouse,mx-sk,my - sk2,0,button,30 - sk,1 - sk2,0) Then
mekl = mekl Xor 1
EndIf
EndIf


; Boden schaltfläche klicken
; deaktiviert alle anderen vorher gedrückten Buttons


If ImagesCollide(mouse,mx-sk,my - sk2,0,button,6 - sk,520 - sk2,0) Then

If Mousehit1 Then
onoffmenue = 0
ebene1an = 0
bodenan = bodenan Xor 1 ; aktiviert die Bodentypen
EndIf

hilfe = 1

EndIf


If ImagesCollide(mouse,mx-sk,my - sk2,0,button,6 - sk,532 - sk2,0) Then
hilfe = 2

If Mousehit1 Then
onoffmenue = 0
bodenan = 0
ebene1an = ebene1an Xor 1 ; aktviert die Ebenentiles
EndIf



EndIf


If ImagesOverlap(mouse,mx,my,menueicon,104,516) Then
If Mousehit1 Then

bodenan = 0
ebene1an = 0
onoffmenue = onoffmenue Xor 1

EndIf

hilfe = 3


EndIf





; Schaltbuttons
DrawImage button, 6, 520,bodenan
DrawImage button, 6, 532,ebene1an

; Buttonbeschriftung
Text 28,518 + bodenan,\"Boden\"
Text 26,530 + ebene1an,\"Ebene 1\"

; Kartenname

Text 350,1, \"Map: \"+kartenname$+\"\"





;-----------------------
;*vorher nopaintabfrage*
;-----------------------

; kein Zeichnen mehr möglich


If ebene1an = 1 Or Bodenan = 1 Or onoffmenue = 1 Then
DrawImage fenster3, 150, 512
If ImagesOverlap(mouse,mx,my,fenster3, 150 ,512 ) Or ImagesOverlap(mouse,mx,my,fenster1,0 ,512 ) Or ImagesOverlap(mouse,mx,my,fenster2,100,512) Or mxs > kartexmax Or mxs < 0 Or mys < 0 Or mys > karteymax Then
nopaint = 1 ; Es kann in einem bestimmten Gebiet nicht mehr gezeichnet werden
Else
nopaint = 0 ; macht das obere Rückgängig
EndIf

klick = 1 ; aktiviert paint
Else
klick = 0 ; deaktiviert paint

EndIf




; Für ebene 2
; DrawImage Ebene1a(Ebene1Chip), 140 + (22 * Ebene1Chip) + cs , 520





If ebene1an = 1 Then

; Schaltfläche wird gezeigt und Tiles E1 werden gezeichnet

For Ebene1Chip = 1 To anzahl



DrawImage Ebene1, 140 + (22 * Ebene1Chip) + cs , 520, Ebene1Chip
If ImagesCollide(mouse,mx,my,0,Ebene1,140 + (22 * Ebene1Chip) + cs, 520,Ebene1Chip) Then
If mousehit1 = 1 Then
AZahlE = Ebene1Chip
EndIf
EndIf

Next
EndIf


If Bodenan = 1 Then

Rect 159,524,62,62
Rect 229,524,62,62
DrawImage B1, 160, 525
DrawImage B2, 230, 525
Color 255,255,255
If ImagesOverlap(mouse,mx,my, B1, 160, 525) Then Text 730,32, \"Grass\" If MouseDown(1) Then bo = B1
If ImagesOverlap(mouse,mx,my, B2, 230, 525) Then Text 730,32, \"Dreck\" If MouseDown(1) Then bo = B2
Color 0,0,0

EndIf





If onoffmenue = 1 Then
DrawImage fenster4, 160,520
DrawImage button, 160,535,speichernan
DrawImage button, 160,547,ladenan
DrawImage button, 160,558

Text 177,533 + speichernan,\"Speichern\"
Text 184,545 + ladenan,\"Laden\"
Text 191,556 + ladenan,\"Neu\"



If ImagesOverlap(mouse,mx,my, button,160,547) Then
hilfe = 5
If MouseHit1 Then

ladenan = 1
Gosub laden

EndIf
EndIf


If ImagesOverlap(mouse,mx,my, button,160,535) Then
hilfe = 4
If mousehit1 Then
speichernan = 1
Gosub speichern
EndIf

EndIf

. back

EndIf


; ICONBILDER
DrawImage menueicon,104,516,onoffmenue

; Hilfsfenster

DrawImage hilfsfenster,1,495


Color 0,0,155
If hilfe = 0 Then Text 5,496, \"-Hilfefenster-\"
If hilfe = 1 Then Text 5,496, \"-Bodenauswahl-\"
If hilfe = 2 Then Text 5,496, \"-Ebene 1 Tiles-\"
If hilfe = 3 Then Text 5,496, \"- Menü AN/AUS-\"
If hilfe = 4 Then Text 5,496, \"- SPEICHERN -\"
If hilfe = 5 Then Text 5,496, \"- LADEN -\"

If hilfe = 5 Or hilfe = 4 Or hilfe = 1 Or hilfe = 2 Or hilfe = 3 Then
If MilliSecs() > erdsch + 300 Then
erdsch=MilliSecs()
hilfe = 0
EndIf
EndIf
Color 0,0,0







; MENÜ





; Für Tilebeschriftung
;---------------------
For Ebene1Chip = 1 To anzahl
Color 255,255,255
Text 715,2, \"Anzahl: \"+anzahl+\"\"
Text 715,22, \"Untergrund:\"
Text 715,32, \"---\"
Color 0,0,0
Next
;---------------------







If klick = 0 Then
If ImagesOverlap(mouse,mx,my,fenster1,0 ,512 ) Or ImagesOverlap(mouse,mx,my,fenster2,100,512) Or mxs > kartexmax Or mxs < 0 Or mys < 0 Or mys > karteymax Then
nopaint = 1
Else
nopaint = 0
EndIf
EndIf






; Mausposition
Color 255,255,255
Text 1,1,\"MouseX:\"+mxs+\"\"
Text 1,10, \"MouseY:\"+mys+\"\"
Text 1,20, \"\"+Tileanzahl+\"\"



Color 0,0,0










;Karte Scrollen
mausda = 1

If MouseDown(2) Then
scroll = 1
mausda = 0
If einmalm2 = 0 Then
mxxz = mx
myyz = my
einmalm2 = 1
EndIf



DrawImage lo , mxxz, myyz
DrawImage scro, mxxz - 15 , myyz
DrawImage scro, mxxz + 15 , myyz
DrawImage scro, mxxz, myyz + 15
DrawImage scro, mxxz, myyz - 15
;DrawImage scro, mxxz - 15 , myyz - 15
;DrawImage scro, mxxz - 15 , myyz + 15
;DrawImage scro, mxxz + 15 , myyz - 15
;DrawImage scro, mxxz + 15 , myyz + 15
If MilliSecs() > scrolltime + 50 Then ; Zeit für nächsten Schritt
scrolltime = MilliSecs()
If ImagesCollide(mouse, mx + 3, my + 1, 0, scro, mxxz - 15, myyz,0) Then sk = sk + 20 ;: o = 1
If ImagesCollide(mouse, mx + 3, my + 1, 0, scro, mxxz + 15, myyz,0) Then sk = sk - 20 ;: u = 1
If ImagesCollide(mouse, mx + 3, my + 1, 0, scro, mxxz, myyz + 15,0) Then sk2 = sk2 - 20
If ImagesCollide(mouse, mx + 3, my + 1, 0, scro, mxxz, myyz - 15,0) Then sk2 = sk2 + 20
;If ImagesCollide(mouse, mx + 3, my + 1, 0, scro, mxxz - 15, myyz - 15,0) Then sk = sk + 4: sk2 = sk2 + 20
;If ImagesCollide(mouse, mx + 3, my + 1, 0, scro, mxxz - 15, myyz + 15,0) Then sk = sk + 4: sk2 = sk2 - 20
;If ImagesCollide(mouse, mx + 3, my + 1, 0, scro, mxxz + 15, myyz - 15,0) Then sk = sk - 4: sk2 = sk2 + 20
;If ImagesCollide(mouse, mx + 3, my + 1, 0, scro, mxxz + 15, myyz + 15,0) Then sk = sk - 4: sk2 = sk2 - 20
EndIf
Else
einmalm2 = 0
scroll = 0
EndIf



; Schaltflächen

;Mausbilder

DrawImage mouse_nor, mx , my
DrawImage mouse, mx + 3, my + 1



; SCREENSHOT
If KeyDown(59) Then
For xs=01 To 100
tmp=ReadFile(\"Screenshots\Screenshot\"+xs+\".bmp\")
If Not tmp Then
SaveBuffer(FrontBuffer(),\"Screenshots\Screenshot\"+xs+\".bmp\")
time = MilliSecs()
Exit
EndIf
Next
EndIf


;FlushMouse

Flip

Until KeyHit(1)
End

. laden
Locate 163, 519
kartenname$ = Input$(\"\")
fileout = OpenFile(\"Maps\\"+kartenname$+\".map\")

imga = ReadLine (fileout)
AZahlE = ReadLine (fileout)


For img.imga = Each imga

img\x = ReadLine (fileout)
img\y = ReadLine (fileout)
img\tileIndex = ReadLine (fileout)

Next




CloseFile fileout
ladenan = 0

Gosub restart



. speichern
Locate 163, 519
kartenname$ = Input$(\"\")

fileout = WriteFile(\"Maps\\"+kartenname$+\".map\")


;For Type.Type = Each Type
; WriteLine(datei,Type\Field)
;Next


WriteLine fileout, imga
WriteLine fileout, AZahlE

For img.imga = Each imga

WriteLine (fileout, img\x)
WriteLine fileout, img\y
WriteLine fileout, img\tileIndex


Next






CloseFile fileout
Speichernan = 0

Gosub back

End
 

Johannes

BeitragSo, Aug 28, 2005 20:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin!
Du lädst Daten in Types ("For img.imga = Each imga"), die noch nicht erstellt wurden. Das heißt, du lädst sie eigentlich gar nicht, denn solange keine imga s existieren, wird auch die Schleife als nicht-existent behandelt und wenn's nur wenige gibt, wird die Schleife "abgebrochen", bevor alle geladen sind; eben dann, wenn für alle vorhandenen Types Daten geladen wurden.
Du müsstest also vor dem Speichern die imgas zählen
(anzahl=0: for img.imga=each imga: anzahl=anzahl+1: Next),
abspeichern, hinterher die Anzahl wieder aus der Datei laden und dann mit einer For-Schleife, die bereits auf diese Anzahl eingestellt ist, die Types erstellen (vorher vielleicht noch die bereits vorhandenen imgas löschen, sonst hast du zu viele) sowie dann die Daten laden, etwa so:

BlitzBasic: [AUSKLAPPEN]

Delete Each imga
;[...]
anzahl=ReadLine(fileout);natürlich an der entsprechenden Stelle
For i=0 To anzahl
img.imga=New imga
img\x = ReadLine (fileout) ;ich würde übrigens statt Read-/Writeline eher Read-/WriteInt oder, falls es reicht, -byte verwenden, aber das ist ja Geschmackssache
img\y = ReadLine (fileout)
img\tileIndex = ReadLine (fileout)
Next


Ich hoffe, das hilft dir.

WEBLink

BeitragDi, Aug 30, 2005 13:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Alles, hab gedacht das sie durch das laden gleich mit erstellt werden, aber da hab ich wohl falsch gedacht.

Danke schonmal, werde es heute nach der Arbeit mal probieren.

MfG

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group