Ergebnis 1 bis 20 von 52

Thema: [XP/ Ruby] Fragensammelthread (1.12.)

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Hallo, mal wieder eine Frage von mir

    Mich plagt eigentlich schon die ganze Zeit das Laden von Musik im RPGXP. Bei der Suche hab ich nichts dazu gefunden, daher scheint es kein generelles Problem zu sein. Die Sache ist jedenfalls:
    Wenn das erste Mal eine BGM oder ME abgespielt werden soll, hängt das Spiel für 5 Sekunden. Die Musik wird noch nicht abgespielt, aber auch alles an Grafik friert ein. Erstes Mal heißt dabei jedes Mal, wenn das Spiel geöffnet wird. So dauert es 5 Sekunden, bis der Titelbildschirm angezeigt wird. Wenn ich die BGM für den Titel abstelle, häng tes stattdessen bei der ersten Map mit BGM usw. Mit den MEs genau das Gleiche.
    Die Ladezeit gibt es immer nur beim ersten Mal, wenn z.B. beim Titel BGM1 gespielt wird und bei der ersten Map BGM2 lädt es nur beim Titelbildschirm und alle weiteren BGMs werden sofort abgespielt. Es ist dabei anscheinend egal, was für eine BGM beim ersten Mal gespielt wird, importiert oder aus der RTP, kleine oder große Datei, kein Unterschied. Das Problem tritt auch in jedem Projekt auf, auch in einem neu gestarteten Projekt ohne Inhalt / Imports.
    Ist das Problem bekannt und gibt es Lösungen um die Ladezeit wegzukriegen? Beim Testen ist es doch ziemlich nervig wenn man jedes Mal, auch wenn man Kleinigkeiten testet, erstmal die Verzögerung abzuwarten.

    Geändert von Fatalis (09.04.2012 um 13:04 Uhr)

  2. #2
    Ich habe zwar noch nie etwas dergleichen gemerkt aber ich würde sagen das klingt stark danach, dass einfach die Bibliotheken und Scripte zum Abspielen von Musik geladen und initialisiert werden müssen.
    Das kannst du nicht umgehen.

  3. #3
    Das selbe Problem habe ich auch. Zumindest bei mir tritt das Problem aber nur bei MIDI-Dateien auf. Ist übrigens auch im Editor so. Wenn ich dort das erste Mal eine MIDI-Datei abspielen will, hängt das ganze kurz. In Winamp/Mediaplayer/etc habe ich dieses Problem aber nicht, dürfte also ein Problem der Engine sein, und keines von meinem PC.

  4. #4
    Das Problem scheint eines vom RPG Maker selbst zu sein, und zwar in jeweils Kombination von bestimmten Dingen. Dabei können sowohl Projekte als auch der diverse Soft- und Hardwaregründe sein.
    Ich hab die Erfahrung gemacht, dass ich bei den meissten MEINER Projekte Probleme hab, mit extrernen aber nur bei manchen, während Freunde von mir bei meinem Projekt wo es bei mir hakt keine Probleme haben.

    Ich habe eine behelfsmässige Lösung für das Problem gefunden, die alle Lieder mit einem Schlag einlädt und danach nicht mehr Laden muss. D.h. auf betroffenen PCs würde einmal dieser Hänger 5 Sekunden bei jedem Spielstart auftreten, danach nicht wieder bis zum Neustart der exe.
    (Zum Testen von Scripten empfehle ich allerdings eher, entsprechende BGMs einfach auszumachen, und auch das Script rauszukommentieren, wenn man das Spiel häufig startet) (oder ihr fragt drumherum ein unless $DEBUG ab). Eigentlich würd ich gern halb-Credit dafür wem geben, da ich darauf über ein Script (Scene_MusicPlayer), welches ich im rpg-studio gefunden hab drauf gekommen bin und die Lösung nur copy/paste/edited hab, leider ist kein Name im Script selbst und der Link den ich mir dazu aufgeschrieben hab ist tot.

    Dies wäre in Scene_Title, direkt unter der if $BTEST abfrage, also direkt über dem Laden der Daten dann, wenn ihrs mögt.
    Code:
        dir = Dir.new("Audio/BGM/") # Neuer Ordnerpfad: Musikordner des Spiels
        musicarray1 = dir.entries   # Alle Dateinamen in einem Array abspeichern
          2.times do musicarray1.shift end # Die ersten beiden Elemente löschen
                                           # (Ist beides jeweils ein Punkr)
          musicarray1.each {|index| 
            index.slice!(index.length-4, index.length)} # Schneide die Dateiendung ab    
        dir = Dir.new("Audio/ME/") # Neuer Ordnerpfad: Musikordner des Spiels
        musicarray2 = dir.entries   # Alle Dateinamen in einem Array abspeichern        
          2.times do musicarray2.shift end # Die ersten beiden Elemente löschen
                                           # (Ist beides jeweils ein Punkr)
          musicarray2.each {|index| 
            index.slice!(index.length-4, index.length)} # Schneide die Dateiendung ab        
        Audio.bgm_play("Audio/BGM/" + musicarray1[0],0,0)
        Audio.me_play("Audio/ME/" + musicarray2[0], 0,0)
    Das führt zwar zu einer knapp längeren Ladezeit im Title, dafür danach nicht mehr. Gut fürs Release (Leute die die Hänger nicht haben merkens garnicht, Leute die es haben, merken es wesentlich seltener, was angenehmer sein sollte) oder das Testen bestimmter Szenen.

  5. #5
    Das Problem ist, dass es sowieso nur beim jeweils ersten Laden eines BGM oder BGS auftritt. Danach hängt es nie wieder.

  6. #6
    Ach? Okay, ich hab die Variante, dass beim ersten Laden JEDES Files das Problem auftritt, deshalb hatte ich es so interpretiert. File einmal geladen, gut, aber es hängt für Title BGM, Battle BGM, Map BGMs, BattleEnd-BGS - Vorausgesetzt, diese unterscheiden sich natürlich. Alles nur einmal. Für ebd. hilft die Lösung. Nur einmal hängen am Start find ich persönlich halb so wild ehlich gesagt.

  7. #7
    Lang lang ists her, ich hab mich mal wieder an den Maker gesetzt und ein kleines Problem..

    Ich nehme an, das Problem ist ein ziemliches Standard-Problem beim XP, eine Suche hat mir aber keine praktikable Lösungen geliefert.
    Es geht einfach darum, dass Events als "Brücke" über unbegehbarem Grund dienen sollen. Im 2000 war das ja problemlos möglich, Event hinsetzen, below hero, fertig.
    Im XP geht das anscheinend nicht, solange man für das Event keine Tilset-Grafik benutzt. Wenn die Brücke animiert sein soll, ist das schon ein Problem. Ich denke eigentlich, dass das Problem recht einfach durch eine Änderung im Game_Player- oder Game_Map-Skript behoben werden könnte. Vielleicht hatte ja jemand schonmal das gleiche Problem und kann mir weiterhelfen.

    (Ich weiß, man könnte zB im Mapping schon unsichtbare, begehbare Tiles setzen und die Events auf through setzen und es gibt auch kompliziertere Lösungen. Das wäre für mich keine Lösung, ich brauch das möglichst flexibel, sodass das Feld nur durch das Event begehbar wird. Konkret gesagt kann man Baumstämme ins Wasser schieben und diese als Brücke benutzen, ähnlich wie in Golden Sun)

  8. #8
    Im 2k geht das auch nur wenn die Grafik aus dem Tileset stammt.

    Aber hier mal eine Lösung für den XP (kann man mit Sicherheit noch schöner schreiben)
    Code:
    class Game_Event < Game_Character
      def name
        @event.name
      end
    end
    
    class Game_Player
      def passable?(x, y, d)
        # Get new coordinates
        new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
        new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
        # If coordinates are outside of map
        unless $game_map.valid?(new_x, new_y)
          # Impassable
          return false
        end
        # If debug mode is ON and ctrl key was pressed
        if $DEBUG and Input.press?(Input::CTRL)
          # Passable
          return true
        end
        $game_map.events.each_value { |event|
          if event.x == new_x && event.y == new_y
            return true if event.through && event.name.include?('bridge')
          end
          if event.x == x && event.y == y
            return true if event.through && event.name.include?('bridge') && $game_map.passable?(new_x, new_y, 10 - d)
          end
        }
        super
      end
    end
    In ein neues Script über Main einfügen. Events die auf Trough gesetzt sind und "bridge" im Namen haben sind dann immer passierbar egal was für Tiles unter oder über ihnen sind.

  9. #9
    Zitat Zitat von Cepanks Beitrag anzeigen
    Im 2k geht das auch nur wenn die Grafik aus dem Tileset stammt.

    Aber hier mal eine Lösung für den XP (kann man mit Sicherheit noch schöner schreiben)
    Code:
    class Game_Event < Game_Character
      def name
        @event.name
      end
    end
    
    class Game_Player
      def passable?(x, y, d)
        # Get new coordinates
        new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
        new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
        # If coordinates are outside of map
        unless $game_map.valid?(new_x, new_y)
          # Impassable
          return false
        end
        # If debug mode is ON and ctrl key was pressed
        if $DEBUG and Input.press?(Input::CTRL)
          # Passable
          return true
        end
        $game_map.events.each_value { |event|
          if event.x == new_x && event.y == new_y
            return true if event.through && event.name.include?('bridge')
          end
          if event.x == x && event.y == y
            return true if event.through && event.name.include?('bridge') && $game_map.passable?(new_x, new_y, 10 - d)
          end
        }
        super
      end
    end
    In ein neues Script über Main einfügen. Events die auf Trough gesetzt sind und "bridge" im Namen haben sind dann immer passierbar egal was für Tiles unter oder über ihnen sind.
    2k: Tatsächlich? Gut, da mekr man, dass es inzwischen wahrscheinlich mehr as 5 Jahre her ist, dass ich den 2k verwendet habe...

    Die Lösung sieht nach genau dem aus, was ich suche. Vielen Dank

  10. #10
    Nur als kleiner Hinweis am Rande, die dargestellte Lösung ist nicht sonderlich "effizient" was die Performance angeht. Es wird wahrscheinlich nicht direkt zu Problemen führen, kann aber wahrscheinlich, wenn man sich die Mühe machen wollte, sehr viel effektiver gelöst werden.

  11. #11
    Ich nehme an, du meinst die Schleife über alle Events?
    In der passable-Methode von Game_Character wird ja ohnehin schon über alle Events iteriert, im Grunde könnte ich da schon den Code anpassen. Spricht ja auch nichts dagegen, dass andere Events auch über die Brücke laufen können. (Dabei ist mir übrigens aufgefallen, dass Events mit leerer Grafik zwar kein Hindernis für den Spieler darstellen können, für Events aber schon. Hat das irgendeinen Sinn?)

    Edit: Kleine Korrektur am Codeschnipsel: An den Event-Namen kommt man nicht einfach über event.name, das Event hat ein Attribut mit dem Namen event (ja, das event hat ein event), welches erst das Namensattribut hat. Man braucht also noch folgenden Code, wenn man es über den Event-Namen steuern will:
    Code:
    def name
      return @event.name
    end

    Geändert von Fatalis (06.10.2012 um 12:06 Uhr)

  12. #12
    Ich dachte eher an preprocessing von solchen "Brücken", also bereits zu einem festen Zeitpunkt alle Brücken auf der Karte zu suchen und die Positionen in einer Tabelle zu markieren um dann in den jeweiligen Passierbarkeitsabfragen lediglich in einer Tabelle nachschlagen zu müssen.
    Solch eine Art der Datenvorverarbeitung ist ein Beispiel dafür wie man die Performance von Makerspielen um einen großteil erhöhen kann. Der standard Code vom RPG-Maker XP ist nicht sonderlich effizient und vieles wird hundertmal öfter berechnet als es nötig ist.

  13. #13
    Zitat Zitat von Fatalis Beitrag anzeigen
    (Dabei ist mir übrigens aufgefallen, dass Events mit leerer Grafik zwar kein Hindernis für den Spieler darstellen können, für Events aber schon. Hat das irgendeinen Sinn?)
    Der 2k(3) hatte ja bei Events diesen Haken "Forbid Event Overlap" oder so ähnlich, das hat man sich hier wohl gespart und einfach allen leeren Events diese Funktion gegeben.

    Zitat Zitat
    Code:
    def name
      return @event.name
    end
    Steht doch genau so (- return) drin? o.O

Berechtigungen

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