dim position löschen und speichern?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Sereyanne

Betreff: dim position löschen und speichern?

BeitragMi, Apr 23, 2008 10:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
mein Projekt schreitet voran. Man kann Items einsammeln, die wunderschön angezeigt und mitgezählt werden.
Mit der Forumsuche bin ich darauf gekommen, ein Tile beim Darüberlaufen aus der DIM zu löschen, damit man Items nicht unendlich mal einsammeln kann.
Der Code dazu:
Code: [AUSKLAPPEN]
If KeyDown(200) Then
If map(px,py-1)=13 Then ;13 ist die Nummer des Items im Tileset
   py = py - 1 ;Figur läuft übers Item drüber
   map(px,py)=08 ;Tile wird aus Dim gelöscht und mit Gras übermalt
   item=item+1
   scrolly = scrolly - 32
   move = 1
   moving=True
    richtung = HOCH
   End If
endif

Funktioniert wunderbar, wie gesagt.
Mein Problem ist folgendes. Wenn ich das Spiel speichere, aus- und wieder einschalte, sind diese eingesammelten Items alle wieder da. Sollen sie aber nicht. Wie speichere ich sowas?
Es wäre ganz leicht, wenn das Item nur einmal vorhanden wäre. Bei den geöffneten Schatztruhen klappt das prima:
Code: [AUSKLAPPEN]

For y = 0 To 49 ;dim wird ausgegeben
For x = 0 To 49
DrawImage tileset,x*32-scrollx,y*32-scrolly,map(x,y)
If truhe1=1 Then ;wenn die Truhe geöffnet wurde
   If map(x,y)=156 Then ;übermale das Bild der Truhe
      map(x,y)=151; mit dem Bild der geöffneten Truhe
   EndIf
EndIf
Next
Next

Aber wie geht das, wenn dasselbe Frame (z.B.13) 20x in der dim auftaucht? ich will ja nur die löschen bzw. speichern, die schon weg sind....
Hat da jemand eine Idee?
Vielen Dank schon mal!

Dottakopf

BeitragMi, Apr 23, 2008 12:29
Antworten mit Zitat
Benutzer-Profile anzeigen
du musst den arry irgenwo zwischenspeichern (in eine speicher-datei )
Damit dein programm beim nächsten Start weis, dass es hier kein item sondern etwas anderes setzen soll.

Ein beispiel ausm kopf raus:
(beim beenden des spiels wird eine "spiestand datei" erstellt)

Code: [AUSKLAPPEN]

function save_game()

Speicherdatei = writefile("saved_game.txt")
    for x = 0 to size_x
        for y  = 0 to size_y
           writeline(speicherdatei, item_arry(x,y))
        next
   next
closefile(speicherdatei)
end function


Und wenn du das spiel wieder startest, brauchts du noch eine funktion die die "saved_game.txt" datei öffnet und dann aus diesen daten die items plaziert.

benötigte befehle (hihi gleich mal neue funktion ausprobieren Laughing )

writefile , writeline , openfile , readline , closefile

mfg Dottakopf[/code]

Sereyanne

BeitragMi, Apr 23, 2008 14:12
Antworten mit Zitat
Benutzer-Profile anzeigen
danke für die antwort.
leider ist mein problem damit nicht behoben.
denn: mit deiner funktion ändere ich alle gleichnamigen tiles. auch die, die ja noch gar nicht eingesammelt wurden! schlag mich, wenn ich mich irre Wink , aber es scheint mir so.
scheint ziemlich kompliziert zu sein, wenn ich nicht jedes einzelne item abfragen will, ob das eingesammelt wurde...
Zitat:
benötigte befehle (hihi gleich mal neue funktion ausprobieren )

writefile , writeline , openfile , readline , closefile

ähm.... ich erwähnte doch, dass ich das spiel speichere, und dann beim laden wieder alle eingesammelten items auftauchen? die speicherbefehle sind mir durchaus bekannt. mein problem ist wie gesagt, ich will ein tile löschen, von dem es mehrere gibt, ich aber nur dieses eine eingesammelte löschen will.

Tankbuster

BeitragMi, Apr 23, 2008 14:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Ehm...
Ich würde es so machen:

1. Alle Tiles werden aus der Datei geladen.
2. Wenn du dann alle geladen hast, kannst du drauf rumlaufen.
3. Wenn du ein Item einsammelst wird ja das Tile sowieso verändert.
"map(px,py)=08 ;Tile wird mit Gras übermalt"
4. Dann speicherst du alle Tiles wieder in der Datei.
5. denk dir einfach wieder, das Programm wird beendet und startet neu Wink
Twitter
Download Jewel Snake!
Windows|Android

Sereyanne

BeitragMi, Apr 23, 2008 15:16
Antworten mit Zitat
Benutzer-Profile anzeigen
@Tankbuster
hey danke, gute idee.
meinst du mit Zitat:
Dann speicherst du alle Tiles wieder in der Datei.

Code: [AUSKLAPPEN]
For y = 0 To 49
For x = 0 To 49
Read map(x,y)
Next
Next

?
werd ich gleich mal ausprobieren.
würde das bedeuten ich muss die array in meine save dat aufnehmen? Embarassed blöde frage.... wahrscheinlich ja....

Dottakopf

BeitragMi, Apr 23, 2008 15:22
Antworten mit Zitat
Benutzer-Profile anzeigen
So hier ist ein lauffähiger code der genau das macht was ich gerade oben schlecht erklärt habe.
Nachdem du die Datei befehle kennst, hab ich mir mal erklärungen im code gespart.
Damit das ganze läuft, muss das beispiel gespeichert werden und am gleichen ort eine "s.txt" datei vorhanden sein den inhalt habe ich dir unten dazu geschickt, einfach in die textdatei reinkopieren... Welche normalerweise durch den mapeditor erstellt werden müsste. Aber ich wollte jetzt keinen schreiben darum musst du selber schnell eine datei mit dem namen "s.txt" erstellen.
Mit der maus kannst du dann deine items "löschen" und mit "Enter" wird der arry gespeichert und "spiel beendet"

Programm neu starten und tata.. die items wurden so übernommen

Sry für die schlechte code formatierung.

Code: [AUSKLAPPEN]

Graphics 800,600,16,2
SetBuffer BackBuffer()


Dim map(20,20)
Dim items(20,20)



;pseudo item layer erstellen
For x = 0 To 19
   For y = 0 To 19
       items(x,y) = Rnd(0,1)
   Next
Next


;die item posis einlesen ( achtung es muss eine s.txt datei vorhanden sein ...)
load_items()



Repeat
Cls



  draw_items() ;malen
  einsammeln() ;items "löschen"
  If KeyHit(28) Then save(): End  ;mit enter speichern
 
 




Flip
Until KeyHit(1)



Function draw_items()

For x = 0 To 19
   For y = 0 To 19
       If items(x,y) = 1 Then Rect x*32,y*32,32,32,items(x,y)
   Next
Next

End Function






Function einsammeln()


  If MouseDown(1) Then items(MouseX()/32,MouseY()/32) = 0




End Function






Function save()


   daten = WriteFile("s.txt")
      For x = 0 To 19
        For y = 0 To 19
          WriteLine(daten,items(x,y))
        Next
      Next
   CloseFile(daten)


End Function



Function load_items()


  daten = OpenFile("s.txt")

   For x = 0 To 19
        For y = 0 To 19
          items(x,y) = ReadLine(daten)
        Next
      Next

  CloseFile(daten)



End Function




Inhalt der s.txt einfach reinkopieren

Code: [AUSKLAPPEN]

0
1
0
0
1
1
1
0
0
1
0
0
0
0
1
1
0
1
0
1
0
0
1
0
1
1
0
1
1
1
1
1
0
1
1
0
0
0
1
1
0
0
1
1
0
0
1
1
1
1
0
1
1
0
1
0
1
1
0
1
0
1
1
1
1
1
1
1
1
0
1
1
1
1
0
1
1
1
1
1
1
0
1
1
1
1
1
1
1
1
1
0
0
0
1
0
1
1
0
0
0
1
1
1
1
1
0
1
0
1
0
1
0
0
1
0
0
0
0
0
1
0
0
1
1
0
1
1
1
1
1
0
0
0
1
1
0
1
0
1
0
0
0
0
0
0
1
1
1
0
1
0
0
1
0
0
1
0
0
0
0
1
1
1
0
1
0
0
1
1
0
1
0
0
1
0
1
1
1
1
1
0
0
0
1
1
0
0
1
0
0
0
0
0
1
0
0
0
1
0
0
1
0
0
1
1
1
0
1
0
0
1
1
1
0
1
0
1
1
0
1
1
1
1
0
0
1
1
0
0
0
1
1
1
0
0
1
0
0
1
1
0
1
0
0
1
0
0
0
1
0
1
1
1
0
1
0
1
1
1
1
0
1
1
1
0
1
0
1
1
0
1
0
0
0
0
0
1
0
0
1
1
0
1
0
0
0
0
0
0
0
1
0
1
1
1
0
1
1
0
1
0
0
1
1
1
0
0
1
1
1
1
1
1
1
1
0
0
1
0
1
0
0
1
0
0
0
0
1
1
0
1
0
0
0
1
0
0
1
1
1
0
1
1
1
1
0
1
0
0
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
1
0
0
0
1
0
0
0
1
0
1
1
1
1
0
1
0
0
0
0
1
0
0
1
1
0
1
0
0
1
0
0
0


~EDIT~
Ganz vergessen, am besten du machst nicht nur einen einzigen "map_arry" sondern hinzukommend auch einen "item_arry" . Der map arry zeichnet die landschaft .. bäume büsche, wasser. Hingegen der "item_arry" zeichnent und verwaltet nur gegenstände.


mfg Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!
  • Zuletzt bearbeitet von Dottakopf am Mi, Apr 23, 2008 16:03, insgesamt einmal bearbeitet

Sereyanne

BeitragMi, Apr 23, 2008 15:48
Antworten mit Zitat
Benutzer-Profile anzeigen
@Dottakopf
jo, auch nich schlecht!
danke! werd mal gucken wie ich das am besten bei mir einbaue....

@Tankbuster
ähm... wie speicher ich ein dim map???
den Code: [AUSKLAPPEN]
WriteInt(save, map(x,y))

mag bb nicht....
  • Zuletzt bearbeitet von Sereyanne am Mi, Apr 23, 2008 17:46, insgesamt einmal bearbeitet

Tankbuster

BeitragMi, Apr 23, 2008 17:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau so speicherst du die ganze Map Wink
Dabei musst du alle Tiles durchgehen und speichern.

Von WriteLine ist aber abzuraten, da die Datei ungefähr doppelt so groß werden würde, wie mit WriteInt <.<
Twitter
Download Jewel Snake!
Windows|Android

Sereyanne

BeitragMi, Apr 23, 2008 17:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Genau so speicherst du die ganze Map
Dabei musst du alle Tiles durchgehen und speichern.

wie gesagt, obigen befehl nimmt bb nicht.
meinst du etwa mit for...next? wie soll das dann aussehen? (sorry stelle mich grad wohl echt doof an)
Code: [AUSKLAPPEN]
for x=0 to 49
foy y=0 to 49
WriteInt(save, map(x,y))
next
next

wäre das das was du meinst?
und danke für die hilfe!

Tankbuster

BeitragMi, Apr 23, 2008 17:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Das wäre exakt, was ich meinte^^
Twitter
Download Jewel Snake!
Windows|Android

Sereyanne

BeitragMi, Apr 23, 2008 17:25
Antworten mit Zitat
Benutzer-Profile anzeigen
ja, klappt! spitze, danke!!

vielleicht stell ich mich ja doch nicht sooo doof an... Wink

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group