Ergebnis 1 bis 20 von 75

Thema: Hilfe für absoluten Anfänger

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Ich hab auch mal zwei Fragen:

    1. Wenn ich eigene Klassen in meinem Projekt benutze und später auch abspeichern will, kann ich einfach scene_save bzw. scene_load um die entsprechenden Klassen erweitern oder muss ich noch etwas dabei beachten?

    2. Mal angenommen ich habe eine Klasse, die als Attribut selber wieder Klassen haben kann. Ein Beispiel aus dem Maker wäre hier game_party mit dem Attribut actors. Wenn ich nun - in diesem Beispiel - alle actors lösche, wird das Attribut wenn ich mich nicht irre auf nil gesetzt. Interessiert das den Garbage Collector?

  2. #2
    Zu Kelvens Fragen:

    1.) Kannst du machen, ist aber nicht empfehlenswert. Zum einen musst du die Reihenfolge streng einhalten, zum anderen können ältere Spielstände ungültig werden. Besser ist, du erzeugst eine Referenz auf dein eigenes Objekt in einer bestehenden globalen Variable, die abgespeichert wird.
    Beispiel: Der Spieler kann im Laufe des Spiels wie in VD Silberminen kaufen und damit Geld verdienen. Die Instanz, welche die Silberminen verwaltet speicherst du nun als Instanzvariable in $game_party ab. Nun wird dein Objekt abgespeichert, da ja auch $game_party abgespeichert wird. Das funktioniert völlig risikofrei, kostet keine zusätzlichen globalen Variablen und du musst nicht in den bestehenden Standardscripten rumschreiben.

    2.) In diesem Beispiel nicht. Alle Actors in $game_party.actors sind auch in $game_actors enthalten. Veränderst du die Variable von $game_party.actors (in dem du sie z.B. auf nil setzt) ändert sich nichts an den Game_Actor Objekten selbst. Diese werden nicht vom GarbageCollector angerührt, solange mindestens eine Referenz auf sie besteht. Solange also eine Variable noch auf ein Objekt zeigt, verbleibt dieses im Speicher (wobei der GarbageCollector im Maker sowieso nur selten angewandt wird - die Makerspiele verbrauchen ja bis auf Grafiken kaum Speicher, und die Grafiken werden per dispose manuell gelöscht).
    Anders sieht es aber mit dem Abspeichern aus. Hier wird für jede Variable das Objekt abgespeichert. Das heißt für $game_actors und $game_party.actors, dass die Game_Actor-Objekte doppelt abgespeichert werden und beim Laden plötzlich zwei verschiedene Objekte existieren, wo vorher nur eins war (daher muss nach dem Laden $game_party refresht werden, dabei wird der eigene actors-Array durch den Inhalt von $game_actors ersetzt, so dass wieder die Objekte nur einmal vorkommen).

    @Melfice: Wir alle wissen was du mit Vektografien meinst. Es ist nur so, dass der Begriff recht merkwürdig anmutet. Ich kenn es bisher auch nur als Vektorgrafik. Und wie man sowas im XP realisieren kann ist mir schleierhaft (höchstens auf Umwege, in dem du die Vektorgrafiken über ein externes Programm zur Laufzeit in Bitmap-Grafiken umwandelst und dann einliest).

    @SDRano: Im Script Interpreter werden die einzelnen EventCommands eines Events in RGSS "umgewandelt". Intern ist ein EventCommand repräsentiert durch eine Nummer (die auf die Funktion zeigt) und einer Parameterliste. Du kannst aber auch an den Kommentaren im Interpreter-Script ablesen, welche Methode für welchen EventCommand steht.

  3. #3
    @-KD-
    Zu 1.
    Und es spielt keine Rolle ob später noch andere Instanzvariablen hinzukommen?

    Zu 2.
    Was wäre denn wenn es die Referenz über $game_actos nicht gäbe und trotzdem das Array in $game_party ganz geleert werden würde?

  4. #4
    1.) Dann werden die einfach mit nil belegt. Eine Klasse ist ja nur eine Methodensammlung. Die Instanzvariablen gehören zum Objekt und können jederzeit hinzukommen.

    2.) Dann hast du keinen Zugriff mehr auf die Game_Actors in Game_Party. Ob der GarbageCollector die nun frisst oder verschont ist ja egal. Du selbst kommst jedenfalls nicht mehr ran (gibt ja keine Variable mehr zu).

    Wenns dir wirklich um den Speicher geht: Der Garbagecollector löscht alle nichtbenötigten Objekte (=Objekte, die weder von einer Variable, noch von einem Proc am Leben gehalten werden), sobald dein Projekt zuviel Speicher einnimmt. Du kannst zwar auch manuell den GarbageCollector starten (GC.init), aber eigentlich reicht es, wenn du das dem System überlässt.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •