Ergebnis 1 bis 6 von 6

Thema: [XP] Blizz ABS + Shadow Script

  1. #1

    [XP] Blizz ABS + Shadow Script

    Hallo,

    ich nutze folgendes Schatten-Script:

    Code:
    #==============================================================================
    # ¡ Sprite_Shadow (Sprite_Ombre )
    # Based on Genzai Kawakami's shadows, dynamisme&features by Rataime, extra features Boushy
    #==============================================================================
    
    CATERPILLAR_COMPATIBLE = true
    
    class Game_Party
     attr_reader :characters
    end
    
    class Sprite_Shadow < RPG::Sprite
    
     attr_accessor :character
    
     def initialize(viewport, character = nil,source = nil,anglemin=0,anglemax=0,distancemax=0)
       super(viewport)
       @anglemin=anglemin.to_f
       @anglemax=anglemax.to_f
       @distancemax=distancemax.to_f
       @character = character
       @source = source
       update
     end
    
     def update
       super
      
       if @tile_id != @character.tile_id or
          @character_name != @character.character_name or
          @character_hue != @character.character_hue
         @tile_id = @character.tile_id
         @character_name = @character.character_name
         @character_hue = @character.character_hue
         if @tile_id >= 384
           self.bitmap = RPG::Cache.tile($game_map.tileset_name,
             @tile_id, @character.character_hue)
           self.src_rect.set(0, 0, 32, 32)
           self.ox = 16
           self.oy = 32
         else
           self.bitmap = RPG::Cache.character(@character.character_name,
             @character.character_hue)
           @cw = bitmap.width / 4
           @ch = bitmap.height / 4
           self.ox = @cw / 2
           self.oy = @ch
         end
       end
       self.visible = (not @character.transparent)
       if @tile_id == 0
         sx = @character.pattern * @cw
         sy = (@character.direction - 2) / 2 * @ch
         if self.angle>90 or angle<-90
           if @character.direction== 6
                  sy = ( 4- 2) / 2 * @ch
           end
           if @character.direction== 4
                  sy = ( 6- 2) / 2 * @ch
           end
           if @character.direction== 2
                  sy = ( 8- 2) / 2 * @ch
           end
           if @character.direction== 8
                  sy = ( 2- 2) / 2 * @ch
           end
         end
         self.src_rect.set(sx, sy, @cw, @ch)
       end
       self.x = @character.screen_x
       self.y = @character.screen_y-5
       self.z = @character.screen_z(@ch)-1
       self.opacity = @character.opacity
       self.blend_type = @character.blend_type
       self.bush_depth = @character.bush_depth
       if @character.animation_id != 0
         animation = $data_animations[@character.animation_id]
         animation(animation, true)
         @character.animation_id = 0
       end
       @deltax=@source.x-self.x
       @deltay= @source.y-self.y
       self.angle = 57.3*Math.atan2(@deltax, @deltay )
       @angle_trigo=self.angle+90
       if @angle_trigo<0
         @angle_trigo=360+@angle_trigo
       end
       self.color = Color.new(0, 0, 0)
       @distance = ((@deltax ** 2) + (@deltay ** 2))
       if$game_map.shadows==-1
         self.opacity = 0
       else
         self.opacity = 1200000/(@distance+6000)   
       end
       @distance = @distance ** 0.5
       if @distancemax !=0 and @distance>=@distancemax
         self.opacity=0
       end
       if @anglemin !=0 or @anglemax !=0
          if (@angle_trigo<@anglemin or @angle_trigo>@anglemax) and @anglemin<@anglemax
            self.opacity=0
          end
          if (@angle_trigo<@anglemin and @angle_trigo>@anglemax) and @anglemin>@anglemax
            self.opacity=0
          end    
       end
     end
    end
    
    #===================================================
    # ¥ CLASS Sprite_Character edit
    #===================================================
    
    class Sprite_Character < RPG::Sprite
     alias shadow_initialize initialize
     
     def initialize(viewport, character = nil)
       @character = character
       super(viewport)
       @ombrelist=[]
       if (character.is_a?(Game_Event) and character.list!=nil and character.list[0].code == 108 and character.list[0].parameters == ["s"])
         if (character.list[1]!=nil and character.list[1].code == 108)
           @anglemin=character.list[1].parameters[0]
         end
         if (character.list[2]!=nil and character.list[2].code == 108)
           @anglemax=character.list[2].parameters[0]
         end
         if (character.list[3]!=nil and character.list[3].code == 108)
           @distancemax=character.list[3].parameters[0]
         end 
        for i in $game_map.events.keys.sort
         if ($game_map.events[i].is_a?(Game_Event) and $game_map.events[i].list!=nil and $game_map.events[i].list[0].code == 108 and $game_map.events[i].list[0].parameters == ["o"])
           @ombrelist[i+1] = Sprite_Shadow.new(viewport, $game_map.events[i],self,@anglemin,@anglemax,@distancemax)
         end
        end
        @ombrelist[1] = Sprite_Shadow.new(viewport, $game_player,self,@anglemin,@anglemax,@distancemax)
    #===================================================
    # œ Compatibility with fukuyama's caterpillar script
    #===================================================
    if CATERPILLAR_COMPATIBLE and $game_party.characters!=nil
    
     for member in $game_party.characters
       @ombrelist.push(Sprite_Shadow.new(viewport, member,self,@anglemin,@anglemax,@distancemax))
     end
    
    end
    #===================================================
    # œ End of the compatibility
    #===================================================
       end
       shadow_initialize(viewport, @character)
     end
     
     alias shadow_update update
     
     def update
       shadow_update
       if @ombrelist!=[]
         for i in 1..@ombrelist.size
           if @ombrelist[i]!=nil
             @ombrelist[i].update
           end
         end
       end
     end 
     
    end
    
    #===================================================
    # ¥ CLASS Scene_Save edit
    #===================================================
    class Scene_Save < Scene_File
     
     alias shadows_write_save_data write_save_data
     
     def write_save_data(file)
       $game_map.shadows = nil
       shadows_write_save_data(file)
     end
    end
    
    #===================================================
    # ¥ CLASS Game_Map edit
    #===================================================
    class Game_Map
     attr_accessor :shadows
    end
    Es funktioniert wie es soll. Allerdings, wenn ich das Blizz ABS ganz nach unten in die Script Liste installiere, sind die Schatten verschwunden.
    Installiere ich das Schatten Script jedoch hinter das Blizz ABS, so bekomme ich wenigstens einen Hinweis wo genau das Poblem liegen könnte.
    Beim start des Levels, also nach dem Hauptmenü, erhalte ich die Fehlermeldung "Script Shadows line 151: Argument error occured. wrong number of arguments (2 for 1)"
    Ich habe die Zeile oben in dem Script fett markiert.

    Hat jemand damit schon Erfahrungen gemacht? Oder kann jemand aus der Fehlermeldung und der betreffenden Zeile ungefähr herleiten was das Problem ist, bzw
    ob es sich halbwegs einfach lösen ließe?

    Von hier habe ich das Blizz ABS Script. Version 2.85.
    http://forum.chaos-project.com/index.php?topic=106.0

    Leider kann ich nicht den Code posten, da er das Forenlimit überschreitet. Unter dem Link findet man das Script als Textdatei.


    Danke im Voraus für jeden nützlichen Tipp.

  2. #2
    Die Quelle für den Fehler ist leicht zu erklären: Beide Scripte versuchen die gleiche Basis-Klasse aus dem RPG-Maker zu überschreiben. Das funktioniert so natürlich nicht, da sie sich gegenseitig in die Quere kommen. Die Scripte sind wohl einfach inkompatible. Du könntest natürlich etwas Mühe auf dich nehmen und versuchen beide Scripte so umzuschreiben, dass ihre Änderungen miteinander vereinbar sind.

  3. #3
    Ok, vielen dank für die Erläuterung.
    Sehr blöd, vor allem, da auch ein anderes Schatten Script, dass ich gefunden habe nicht funktioniert.

    Leider sehe ich für mich keine Chance, es umzuschreiben.
    Falls jemand Lust dazu hat wäre ich natürlich sehr dankbar.

    Sollte ich eine andere Lösung finden werde ich es wissen lassen.

  4. #4
    Ich habe mich entschlossen zu versuchen das Script umzuschreiben. Es ist dann egal bei welchem von beiden Scripts ich die Klasse ändere, oder?

    Kann ich daraus, dass der Fehler in der Zeile "shadow_initialize(viewport, @character)" entsteht schließen, dass es etwas mit der Doppelbelegung von @character zu tun hat?
    Oder hat irgendjemand einen Tipp für mich was, in drei Sätzen ausgedrückt, das genaue Problem ist und wie man es in der Theorie beheben könnte?

    Ich habe mich nie mit RGSS beschäftigt, kann aber einiges in Javascript. Demnach würde ich mich dann nur in den wesentlichen Teilbereich einarbeiten.
    Ein mit dem BLIZZ-Abs kompatibles Schattenskript wäre sicherlich für andere auch sinnvoll.

  5. #5
    Das Problem bei diesen Scripten ist, dass man Methoden im Nachhinein umbenennen kann. Dies wird mit dem Schlüsselwort "alias" eingeleitet.
    Das von dir verwendete Schatten-Script verwendet zum Beispiel:
    Code:
    alias shadow_initialize initialize
    in der Klasse "Sprite_Character".
    Also die Methode "initialize" aus der Klasse wird umbenannt zu "shadow_initialize".
    Danach schreibt das Shadow_Script eine eigene "initialize"-Methode in die Klasse "Sprite_Character". Bei dieser neuen Methode wird ganz am Ende "shadow_initialize" aufgerufen, also die ursprüngliche Methode.
    Dies wird getan um Code vorne an die Methode dran zu hängen.

    Ich gehe davon aus, dass das Blizz-ABS-Script genau das selbe tut. Also irgendwo eine eigene "initialize"-Methode für "Sprite_Character" definiert und sich diese Definitionen nun im Wege sind. Die Lösung wäre es, falls ich mit dieser Vermutung richtig liege, einfach beide Versionen zusammenzupacken soweit es möglich ist.
    Aber um genaueres sagen zu können müsste man sich erstmal durch das gesamte Script lesen um sicherzustellen, dass es nicht noch andere Gründe haben kann.

  6. #6
    Ich verstehe. Und, dass es die initialize Methode verwendet ist notwendig? Deshalb, weil Code aus dieser Methode verwendet wird?
    Ich kann also nicht einfach eine eigene Methode erstellen, oder die initialize Methode kopieren und umbenennen?

Berechtigungen

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