Bex

Seher

  • »Bex« ist der Autor dieses Themas

Motto: Lets have some Fun.

  • Nachricht senden

1

Donnerstag, 5. November 2015, 12:08

Wie kann ich eigene Globale Variablen erstellen die mit in der Safefile gespeichert werden?

Moin konnte auf rpgmaker web leider keine mir verständliche Antwort bekommen.
Ich copy paste meine Frage einfach mal, hoffe es ist dises mal ok wenn ich es nicht extra übersetze.

Edit: Deutsche Fassung
Wie kann ich eigene Globale Variablen erstellen die mit in der Safefile gespeichert werden?
Wie geht das? Oder geht das schon längst und ich weiss nicht wie?

Also ich brauche für ne rumspielerei mehr Variablen. Soweit ich weiss hab ich ja als globale variablen die $game_variables[id].

kann ich dann sowas machen wie @variables.meinevariable[id]. wie müsste ich das Scriptequivalent schreiben? Ist das überhaupt ohne extra Script möglich?
Und falls das jemand weiss, würde der safefile speicher bei 50.000 variablen mit einfachen zahlen drin,stark erhöhen?
_________________________________________________________________________________________________________________________________________

We have the standard $game_variables[id] that are automaticly safed when the Player safes his Game.
But is it possible to create own global variables that are getting safed automaticly?
Is there maybe a inbuild Scriptequivalent for that to use in Eventcommand Script?

Maybe something like $myvariable[1] or @variables_myvariable[15000] and would it be safed automaticly? How to write down properly?
And how much would the safefile increase if i have for example 50 000 of that Variables defined with number values in it?

Sorry Iam not a Scripter so please explain with Words simple ones understand :)

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Bex« (5. November 2015, 14:57)


Avery

Dinoritterin mit Herrschaft über die Contests und Ressourcen

  • Nachricht senden

2

Donnerstag, 5. November 2015, 12:14

Bitte übersetz sie trotzdem, Bex. Auch wenn die meisten hier Englisch sprechen so doch nicht alle und ich denke, dass es auch besser zu verstehen ist, wenn du das Problem in deiner und unserer Muttersprache formulierst.

Bex

Seher

  • »Bex« ist der Autor dieses Themas

Motto: Lets have some Fun.

  • Nachricht senden

3

Donnerstag, 5. November 2015, 14:58

Ok du hast recht, habe es im ersten Post editiert.
Vieleicht kann man mir so besser helfen.

4

Donnerstag, 5. November 2015, 18:29

Hallo Bex,

natürlich kannst du auch selbst globale Variablen erstellen, die permanent ansprechbar sind. Als globale Variable kennzeichnest du eine Zeichenfolge durch ein Dollarzeichen, z.B. $bex. der defaultwert einer globalen Variable ist nil, d.h. du kannst sie sogar abfragen, ohne sie vorher einem Objekt zugewiesen zu haben. $bex = 1 dürfte sich also verhalten wie eine andere Variable aus dem Spiel auch. In ihr müsste sich auch ein Array speichern lassen, die Elemente des Arrays lassen sich dann mit $bex[id] abfragen wie bei den Ingame-Variables. Von der Verwendung zusätzlicher globaler Variablen wird jedoch öfter abgeraten.
Ein Blick in die Scientia lohnt sich bei dem Thema.
Bild

5

Freitag, 6. November 2015, 01:05

Lycaon hat ja schon ein paar Tipps gegeben.
Du kannst dir problemlos eine eigene Spielvariableninstanz anlegen:

Ruby Quellcode

1
$my_personal_variables = Game_Variables.new

Das kannst Du zum Beispiel bei Spielstart tun. Bedenke allerdings, dass Game_Variables auf 5000 Einträge limitiert ist.

Damit sie aber auch im Savefile landen und daraus auch wieder ausgelesen werden, müsstest Du in der Scene_Save und Scene_Load noch ein bisschen Code ergänzen.
Allerdings möchte ich dir erstmal davon abraten. Nicht wegen der Größe - ein Array mit 50.000 Zahlen würde gespeichert 100.006 Bytes einnehmen, das wäre also nur etwas über 100kB die zusätzlich gebraucht wird (naja, ok - ist doch schon viel) aber weil ich vermute, dass das Konzept nicht durchdacht wurde. Was genau speichern diese Variablen denn? Möglicherweise gehst Du einen etwas unklugen Weg, bei deinem erdachten System.

Bex

Seher

  • »Bex« ist der Autor dieses Themas

Motto: Lets have some Fun.

  • Nachricht senden

6

Freitag, 6. November 2015, 11:36

$bex = 1 #funktioniert wunderbar halbwegs
aber
$bex[1] = 1 # gibt ne fehlermeldung aus
Wenn ich aber playms zeile vorher mache ($bex = Game_Variables.new) , dann funktioniert das.
Wenn ich dann aber speichere neulade und dann das event anspreche gibts wieder ne fehlermeldung.
Und es wäre schon schön variable + halt [] die klammern für ne zahl.

Ah nun verstehe ich wohl die antwort vom rpg maker web, da meinte einer das man es in game system speichern soll, hatte mich gewundert was er meinte zumal er sonst auch nur noch ein unverständliches script postete und nichts erklärte.
Wie müsste da der Befehl lauten oder welche Lösung habt ihr im Sinn? Mir fällt nichts ein.

Edit1:
Was mich sehr wundert ist, das ich einfach schreiben kann $game_variables[12000] = 20 und das funktioniert einwandfrei, wird gespeichert und geladen und in textboxen erkannt.
Warum meintest du das man das nicht tun soll Playm? Gibts da einen grund?

Edit2:
Eigentlich wollte ich nur rumspielen und lernen.
Ich hatte vor für jedes Maptile auf einer Karte eine Variable anzulegen. Wenn ich dann zum beispiel in nem Farmgame Maptiles per Eventscriptbefehl ändere, so könnte ich die Map nach dem Mapwechsel anhand der Variablen wiederherstellen. Das wären bei einer einzigen grossen map mit 3layern schon bis zu 50 000Variablen.
Wenn das nur geringfügig die MB zahl erhöht ist das nicht schlimm. Wenn es sich nicht auf die performance im spiel auswirkt da niemals ausgeführt(ausser das eine mal beim mapwechsel) dann wäre das supi.

7

Freitag, 6. November 2015, 13:58

Zitat

Was mich sehr wundert ist, das ich einfach schreiben kann $game_variables[12000] = 20 und das funktioniert einwandfrei, wird gespeichert und geladen und in textboxen erkannt.
Warum meintest du das man das nicht tun soll Playm? Gibts da einen grund?
Upps. Ich habe in die Quellcodes des RMXP geguckt, wo die Variablen auf 5000 Stück begrenzt sind. Im VX Ace wurde die Beschräkung aufgehoben. Hab nicht bemerkt, in welchem Unterforum wir sind. '-'

Zitat

Ich hatte vor für jedes Maptile auf einer Karte eine Variable anzulegen.

Muss es wirklich jedes Maptile sein?
Vielleicht brauchst Du garnicht alle, dann kannst Du dir eine Klasse erstellen mit den Attributen x, y, layer und tile_id und kommst vielleicht mit weniger Speicher davon, wenn garnicht alle Tiles belegt sind. Ansonsten hast Du schon die kleinstmögliche Struktur. Ein RGSS-Table würde nicht weniger Speicher benötigen und wenn Du nur einmal pro Mapwechsel darauf zugreifst sollte das auch nicht allzustark Performance fressen.

Die Idee es in Game_System zu speichern ist eine Möglichkeit - dann musst Du dich nicht um Scene_Save und _Load kümmern, da Game_System dort problemlos gespeichert wird. Du könntest dann in Game_System ein Attribut :bex_variables anlegen und dortrein ein neues Game_Variables Objekt stecken.

Bex

Seher

  • »Bex« ist der Autor dieses Themas

Motto: Lets have some Fun.

  • Nachricht senden

8

Freitag, 6. November 2015, 16:02

Dafür brauch ich dann ein extra Script? oder wie heisst der befehl um das anzulegen?

9

Dienstag, 10. November 2015, 00:38

Ja, ein extra Script, was dir die Klasse erweitert. Das könnte zum Beispiel so aussehen:

Ruby Quellcode

1
2
3
4
5
6
7
8
9
10
11
class Game_System
  # ATTRibut erstellen - Zugriff über $game_system.bex_variables
  attr_accessor( :bex_variables )
  # Initialize aliasen
  alias_method( :org_ini_wo_bexvars, :initialize )
  # Initialize neu definieren und die ehemalige Definition darin aufrufen
  def initialize
    org_ini_wo_bexvars
    @bex_variables = Game_Variables.new
  end
end
Disclaimer: Habe das eben so runtergeschrieben, könnten kleine Syntaxfehler sich reingeschummelt haben.

Jetzt kannst Du in einem neuen Spiel in ein CallScript schreiben:

Ruby Quellcode

1
$game_system.bex_variables[1] = 25

Bex

Seher

  • »Bex« ist der Autor dieses Themas

Motto: Lets have some Fun.

  • Nachricht senden

10

Dienstag, 10. November 2015, 11:45

Danke fürs teilen, das sieht interessant aus.

11

Donnerstag, 12. November 2015, 23:17

Und was hast Du nun daraus gemacht? :3
Stell deine Lösung doch mal hier vor.

Bex

Seher

  • »Bex« ist der Autor dieses Themas

Motto: Lets have some Fun.

  • Nachricht senden

12

Freitag, 13. November 2015, 12:27

Ich bin ja noch nicht fertig mit basteln und ab hier eröffnen sich soviele Wege in verschiedene Richtungen.

z.B. könnte man dein snippet dafür benutzen um eigene self variablen zu kreiren. Hab dafür aber noch ein gutes Script im Archiev, ist aber auf jedenfall etwas womit ich später nochmal rumspielen werde.

Für eigene Variablen um Mapkoordinaten zu speichern könnte ich es verwenden hab es aber noch nicht getan weil ich glaube das man ab und an mehr Fragen stellen muss bevor ich
etwas wichtiges übersehe.
In diesem Fall kam mir noch eine Frage an dich.

Die Gamemap wird ja gespeichert in der Safefile.
Kann ich nicht einfach während des Spiels diese Gamemap mit den Tileseteinstellungen in $game_variables[1] speichern?
Dann würd das doch theoretisch immer mit gespeichert und ich müsst die daten aus variable 1 beim betreten der map in nem event kurz aufrufen und dann bräucht ich den scriptcall für die updatemethode glaube ich?
Später würd ich nach jeder änderung an den maptiles einfach die map data oder wie das heisst was ich genau brauche in variable1 speichern.


Variablen kann man ja für vieles nutzen, hierfür auch?

13

Freitag, 13. November 2015, 22:52

Zitat

Variablen kann man ja für vieles nutzen, hierfür auch?
Da erwartet wird, das in den Spielvariablen Zahlen gespeichert sind, würde ich da nie etwas anderes reinspeichern als Zahlen, auch wenn es technisch möglich ist. Ich finde es einfach unschön und unnötig, da Du ja siehst, dass es kein Problem ist neue Variablen anzulegen.

Zitat

Kann ich nicht einfach während des Spiels diese Gamemap mit den Tileseteinstellungen in $game_variables[1] speichern?
Ja. Allerdings speichert die Map ja auch nur jedes Feld als eine Zahl, also kommen wir wieder zur Argumentation von eben: Sicher, dass Du jedes Feld mit jedem Layer speichern musst? In dem Fall - weil Du irgendwas in Richtung Minecraft, sprich eine komplett inGame modifizierbare Map haben möchtest - dann ist das halt so. Leg dir eine passende Variable an und speicher dir da die Mapdaten rein. Das Game_Map Objekt brauchst Du garnicht, es reicht den Table aus $game_data.data zu speichern.

Bex

Seher

  • »Bex« ist der Autor dieses Themas

Motto: Lets have some Fun.

  • Nachricht senden

14

Samstag, 14. November 2015, 00:40

Danke für die schnelle Antwort, ich werde es morgen ausprobieren. Danke fürs teilen.

Social Bookmarks