Ergebnis 1 bis 14 von 14

Thema: Pathfinding Script editieren.

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #10
    Dann hast du an anderer Stelle im Script ein end vergessen/zuviel gemacht. So sieht es vollständig aus:
    Code:
    #==============================================================================
    #   ¦ Path Finding
    #   By: Near Fantastica
    #   Date: 24.09.05
    #   Version: 1
    #
    #   Player :: $game_player.find_path(x,y)
    #   Event Script Call :: self.event.find_path(x,y)
    #   Event Movement Script Call :: self.find_path(x,y)
    #==============================================================================
    
    class Game_Character
      #--------------------------------------------------------------------------
      alias pf_game_character_initialize initialize
      alias pf_game_character_update update
      #--------------------------------------------------------------------------
      attr_accessor :map
      attr_accessor :runpath
      #--------------------------------------------------------------------------
      def initialize
        pf_game_character_initialize
        @map = nil
        @runpath = false
      end
      #--------------------------------------------------------------------------
      def update
        run_path if @runpath == true
        pf_game_character_update
      end
      #--------------------------------------------------------------------------
      def run_path
        return if moving?
        step = @map[@x,@y]
        if step == 1
          @map = nil
          @runpath = false
          return
        end
        dir = rand(2)
        case dir
        when 0
          move_right if @map[@x+1,@y] == step - 1 and step != 0
          move_down if @map[@x,@y+1] == step - 1 and step != 0
          move_left if @map[@x-1,@y] == step -1 and step != 0
          move_up if @map[@x,@y-1] == step - 1 and step != 0
        when 1
          move_up if @map[@x,@y-1] == step - 1 and step != 0
          move_left if @map[@x-1,@y] == step -1 and step != 0
          move_down if @map[@x,@y+1] == step - 1 and step != 0
          move_right if @map[@x+1,@y] == step - 1 and step != 0
        end
      end
      #--------------------------------------------------------------------------
      def find_path(x,y)
        sx, sy = @x, @y
        result = setup_map(sx,sy,x,y)
        @runpath = result[0]
        @map = result[1]
        @map[sx,sy] = result[2] if result[2] != nil
      end
      #--------------------------------------------------------------------------
      def setup_map(sx,sy,ex,ey)
        map = Table.new($game_map.width, $game_map.height)
        map[ex,ey] = 1
        old_positions = []
        new_positions = []
        old_positions.push([ex, ey])
        depth = 2
        depth.upto(100){|step|
          loop do
            break if old_positions[0] == nil
            x,y = old_positions.shift
            return [true, map, step] if x == sx and y+1 == sy
            if $game_player.passable?(x, y, 2) and map[x,y + 1] == 0
              map[x,y + 1] = step
              new_positions.push([x,y + 1])
            end
            return [true, map, step] if x-1 == sx and y == sy
            if $game_player.passable?(x, y, 4) and map[x - 1,y] == 0
              map[x - 1,y] = step
              new_positions.push([x - 1,y])
            end
            return [true, map, step] if x+1 == sx and y == sy
            if $game_player.passable?(x, y, 6) and map[x + 1,y] == 0
              map[x + 1,y] = step
              new_positions.push([x + 1,y])
            end
            return [true, map, step] if x == sx and y-1 == sy
            if $game_player.passable?(x, y, 8) and map[x,y - 1] == 0
              map[x,y - 1] = step
              new_positions.push([x,y - 1])
            end
          end
          old_positions = new_positions
          new_positions = []
        }
        return [false, nil, nil]
      end
    end
    
    class Interpreter
      def event(id = @event_id)
        return $game_map.events[id]
      end
    end
    
    class Game_Character
      #--------------------------------------------------------------------------
      # * Frame Update
      #--------------------------------------------------------------------------
      def pf_game_character_update
        # Branch with jumping, moving, and stopping
        if jumping?
          update_jump
        elsif moving?
          update_move
        else
          update_stop
        end
        # If animation count exceeds maximum value
        # * Maximum value is move speed * 1 taken from basic value 18
        if @anime_count > 18 - @move_speed * 2
          # If stop animation is OFF when stopping
          if not @step_anime and @stop_count > 0
            # Return to original pattern
            @pattern = @original_pattern
          # If stop animation is ON when moving
          else
            # Update pattern
            @pattern = (@pattern + 1) % 4
          end
          # Clear animation count
          @anime_count = 0
        end
        # If waiting
        if @wait_count > 0
          # Reduce wait count
          @wait_count -= 1
          return
        end
        # If move route is forced
        if @move_route_forcing
          # Custom move
          move_type_custom
          return
        end
        # When waiting for event execution or locked
        if @starting or lock?
          # Not moving by self
          return
        end
        unless @stop then
          # If stop count exceeds a certain value (computed from move frequency)
          if @stop_count > (40 - @move_frequency * 2) * (6 - @move_frequency)
            # Branch by move type
            case @move_type
            when 1  # Random
              move_type_random
            when 2  # Approach
              move_type_toward_player
            when 3  # Custom
              move_type_custom
            end
          end
        end
      end
    
      def stop!
        @stop = true
      end
      
      def go!
        @stop = false
        true
      end
      
      alias stop_run_path run_path
      def run_path
        unless @stop then stop_run_path end
      end
        
    end
    Du brauchst dir nicht extra für das Script SDK zulegen. Allerdings sind die meisten SDK Scripte auch äußerst zuverlässig und qualitativ - schaden kann's also nicht ^^ Das es mehrere Versionen des SDK gibt, ist mir neu. Eigentlich darf es nur eine offizielle Version (und deren Updates) geben. Und die findest du hier.

    Edit: Hm, kommt irgendeine Fehlermeldung? Ansonsten überprüf mal, ob du die Variablen auch wirklich auf diesen Wert setzt, statt sie beispielsweise zu addieren. Wenn die eingegebenen Koordinaten nicht in der Map vorkommen, wird der Befehl nämlich ohne Fehlermeldung ignoriert.

    Geändert von -KD- (21.03.2007 um 15:22 Uhr)

Berechtigungen

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