Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 17

Тема: Mouse system

  1. #1

    Сообщение Mouse system

    с помощью этого скрипта теперь можно пользоваться мышкой!

    Код:
    #===============================================================================
    # Mouse System (RGSS3)
    # By Jet10985(Jet)
    # Some Code by: Woratana, Berka
    # Uses: ListRA-92's Path Finding
    # Super Heavy Testing/Debug Help/Requested By: Nathanial(Beleren)
    #===============================================================================
    # This script will allow full use of the mouse inside of rmvx for various
    # purposes.
    # This script has: 7 customization options.
    #===============================================================================
    # Overwritten Methods:
    # Game_Player: move_by_input
    #-------------------------------------------------------------------------------
    # Aliased methods:
    # Scene_Map: update, terminate, update_transfer_player
    # Input: update, trigger?, press?, repeat?, dir4, dir8
    # Window_Selectable: update, top_row=
    # Scene_File: update
    # Window_NameInput: update
    # Game_Temp: initialize
    # Game_Event: initialize, update
    #===============================================================================
    
    =begin
    Showing text above event when mouse hovers:
    
    If you want a message to appear over an event's head if the mouse is hovering
    over the event, put this comment in the event:
    
    MOUSE TEXT MESSAGE HERE
    
    everything after TEXT will be the hovering display.
    --------------------------------------------------------------------------------
    Change mouse picture above event when mouse hovers:
    
    If you want the mouse's picture to temporarily change whne over an event, put
    this comment in the event
    
    MOUSE PIC NAME/NUMBER
    
    if you put a name, the mouse will become that picture, but if you put a number
    then the mouse will become the icon that is the id number
    --------------------------------------------------------------------------------
    Specific mouse click movement routes:
    
    If you want the player to land specifically in a square around an event when
    they click to move on the event, put one of these comments in the event:
    
    MOUSE MOVE UP/LEFT/RIGHT/DOWN
    
    only put the direction that you want the player to land on.
    --------------------------------------------------------------------------------
    Click to activate:
    
    If you want an event to automatically start when it is clicked on, place
    this in an event comment:
    
    MOUSE CLICK
    --------------------------------------------------------------------------------
    Don't stop the player when walking over a touch event:
    
    By default, this script will stop a mouse-caused movement if the player walks
    over/under a player touch/event touch event. If you want the event to activate,
    but for the player to keep walking to their destination, put this comment in the
    event:
    
    MOUSE NOSTOP
    --------------------------------------------------------------------------------
    Ignore Events:
    
    To have an event be ignored when the mouse makes it's movement path(as if the
    event isn't there), put this comment in the event:
    
    MOUSE THROUGH
    --------------------------------------------------------------------------------
    Extra Notes:
    
    In selectable windows that have more items than what's shown, players can
    either put the mouse below the window to scroll down, OR use the mouse's
    scroll wheel to scroll up/down.
    
    You can activate action button events by standing next to the event and clicking
    on it with the mouse.
    =end
    module JetMouse
      
      # If you are using a graphic, this is it.
      # It must be in the Graphics/System folder.
      CURSOR_PICTURE = "cursor-mouse"
      
      # If you aren't using a graphic, this icon will be the mouse.
      # To use the icon, just put a non-existant picture as the above config
      ICON_INDEX = 387
      
      # Do you want the player to be able to move by clicking the mouse?
      ALLOW_MOUSE_MOVEMENT = true
      
      # Do you want mouse movement to do 8-dir walking?
      # Requires 8-Dir Walking by Jet.
      DO_8DIR_WALKING = false
      
      # Turning this switch on will make the mouse invisible and unusuable until
      # the switch is turned off
      TURN_MOUSE_OFF_SWITCH = 20
      
      # Do you want the mouse to check for mouse wheel scrolling in selectbale
      # windows? Not using this may reduce some rare cases of lag.
      USE_WHEEL_DETECTION = false
      
      # Do you want to use the Dijkstra formula for pathfinding?
      # This is more accurate, but slower.
      USE_DIJKSTRA = true
      
    end
    
    #===============================================================================
    # DON'T EDIT FURTHER UNLESS YOU KNOW WHAT TO DO.
    #===============================================================================
    module Mouse
      
      Get_Message = Win32API.new('user32', 'GetMessage', 'plll', 'l')
      GetAsyncKeyState = Win32API.new("user32", "GetAsyncKeyState", 'i', 'i')
      GetKeyState = Win32API.new("user32", "GetKeyState", 'i', 'i')
      SetCursorPos = Win32API.new('user32', 'SetCursorPos', 'nn', 'n')
      GetCursorPo = Win32API.new('user32', 'GetCursorPos', 'p', 'i')
      ScreenToClient = Win32API.new('user32', 'ScreenToClient', 'lp', 'i')
      FindWindowA = Win32API.new('user32', 'FindWindowA', 'pp', 'l')
      GetClientRect = Win32API.new('user32', 'GetClientRect', 'lp', 'i')
      GetWindowRect = Win32API.new('user32', 'GetWindowRect', 'lp', 'i')
      contents = File.open('Game.ini', 'r') { |f| f.read }
      q = contents[/Title=(.+)/].nil? ? "cccc" : $1
      @handle = FindWindowA.call('RGSS Player', q)
      module_function
      
      Point = Struct.new(:x, :y)
      
      Message = Struct.new(:message, :wparam, :lparam, :pt)
      
      Param = Struct.new(:x, :y, :scroll)
      
      Scroll = 0x0000020A
      
      def hiword(dword); return((dword&0xffff0000) >> 16)&0x0000ffff; end
      def loword(dword); return dword&0x0000ffff; end
        
      def word2signed_short(value)
        return value if (value&0x8000) == 0
        return -1 *((~value&0x7fff) + 1)
      end
      
      def unpack_dword(buffer, offset = 0)
        ret = buffer[offset + 0]&0x000000ff
        ret |=(buffer[offset + 1] <<(8 * 1))&0x0000ff00
        ret |=(buffer[offset + 2] <<(8 * 2))&0x00ff0000
        ret |=(buffer[offset + 3] <<(8 * 3))&0xff000000
        return ret
      end
      
      def unpack_msg(buffer)
        msg = Message.new; msg.pt = Point.new
        msg.message=unpack_dword(buffer,4*1)
        msg.wparam = unpack_dword(buffer, 4 * 2)
        msg.lparam = unpack_dword(buffer,4*3)
        msg.pt.x = unpack_dword(buffer, 4 * 5)
        msg.pt.y = unpack_dword(buffer, 4 * 6)
        return msg
      end
      
      def wmcallback(msg)
        return unless msg.message == Scroll
        param = Param.new
        param.x = word2signed_short(loword(msg.lparam))
        param.y = word2signed_short(hiword(msg.lparam))
        param.scroll = word2signed_short(hiword(msg.wparam))
        return [param.x, param.y, param.scroll]
      end
      
      def click?(button)
        return false if $game_switches[JetMouse::TURN_MOUSE_OFF_SWITCH]
        return true if @keys.include?(button)
        return false
      end 
      
      def press?(button)
        return false if $game_switches[JetMouse::TURN_MOUSE_OFF_SWITCH]
        return true if @press.include?(button)
        return false
      end
      
      def set_pos(x_pos = 0, y_pos = 0)
        width,height = client_size
        if (x_pos.between?(0, width) && y_pos.between?(0, height))
          SetCursorPos.call(client_pos[0] + x_pos,client_pos[1] + y_pos)
        end
      end
      
      def update
        return if $game_switches[JetMouse::TURN_MOUSE_OFF_SWITCH]
        @pos = Mouse.pos
        @keys, @press = [], []
        @keys.push(1) if GetAsyncKeyState.call(1)&0x01==1
        @keys.push(2) if GetAsyncKeyState.call(2)&0x01==1
        @keys.push(3) if GetAsyncKeyState.call(4)&0x01==1
        @press.push(1) if pressed?(1)
        @press.push(2) if pressed?(2)
        @press.push(3) if pressed?(4)
      end 
      
      def pressed?(key)
        return true unless GetKeyState.call(key).between?(0, 1)
        return false
      end
      
      def global_pos
        pos = [0, 0].pack('ll')
        GetCursorPo.call(pos) != 0 ?(return pos.unpack('ll')):(return [0, 0])
      end
      
      def pos
        return 0, 0 if $game_switches[JetMouse::TURN_MOUSE_OFF_SWITCH]
        x, y = screen_to_client(*global_pos)
        width, height = client_size
        begin
          x = 0 if x <= 0; y = 0 if y <= 0
          x = width if x >= width; y = height if y >= height
          return x, y
        end
      end
      
      def screen_to_client(x, y)
        return nil unless x && y
        pos = [x, y].pack('ll')
        ScreenToClient.call(@handle, pos) != 0 ?(return pos.unpack('ll')):(return [0, 0])
      end
      
      def client_size
        rect = [0, 0, 0, 0].pack('l4')
        GetClientRect.call(@handle, rect)
        right,bottom = rect.unpack('l4')[2..3]
        return right, bottom
      end
      
      def client_pos
        rect=[0, 0, 0, 0].pack('l4')
        GetWindowRect.call(@handle, rect)
        left, upper = rect.unpack('l4')[0..1]
        return left + 4, upper + 30
      end
      
      def grid
        return [-1, -1] if $game_switches[JetMouse::TURN_MOUSE_OFF_SWITCH]
        return [-1, -1] if @pos.nil?
        return [(@pos[0]/32),(@pos[1]/32)]
      end
      
      def true_grid
        return [grid[0] + $game_map.display_x / 256, grid[1] + $game_map.display_y / 256]
      end
      
      def area?(x, y, width, height)
        return false if $game_switches[JetMouse::TURN_MOUSE_OFF_SWITCH]
        return false if @pos.nil?
        return @pos[0].between?(x, width + x) && @pos[1].between?(y, height + y)
      end
      
      def scroll
        msg="\0"*32;Get_Message.call(msg,0,0,0);r=wmcallback(unpack_msg(msg))
        return r if !r.nil?
      end
    end
    
    class Sprite_Cursor < Sprite_Base
      
      attr_accessor :current_cursor, :not_default
      
      include JetMouse
      
      def initialize
        super
        @current_cursor = ""
        @not_default = false
        Win32API.new('user32', 'ShowCursor', 'i', 'i').call(0)
        self.z = 5004
        create_cursor(CURSOR_PICTURE)
        $game_switches = []
        update
      end
      
      def create_cursor(cursor = "")
        self.bitmap.dispose unless self.bitmap.nil?
        self.bitmap = nil
        begin
          self.bitmap = Cache.system(cursor)
          @current_cursor = cursor
        rescue
          self.bitmap = Bitmap.new(24, 24)
          bitmap = Cache.system("Iconset")
          rect = Rect.new(ICON_INDEX % 16 * 24, ICON_INDEX / 16 * 24, 24, 24)
          self.bitmap.blt(0, 0, bitmap, rect)
          @current_cursor = ICON_INDEX
        end
        @not_default = false
      end
      
      def change_cursor(cursor)
        self.bitmap.dispose unless self.bitmap.nil?
        self.bitmap = nil
        begin
          self.bitmap = Cache.system(cursor)
          @current_cursor = cursor
          @not_default = true
        rescue
          begin
            self.bitmap = Bitmap.new(24, 24)
            bitmap = Cache.system("Iconset")
            rect = Rect.new(cursor % 16 * 24, cursor / 16 * 24, 24, 24)
            self.bitmap.blt(0, 0, bitmap, rect)
            @current_cursor = cursor
            @not_default = true
          rescue
            create_cursor(CURSOR_PICTURE)
          end
        end
      end
    
      def update
    	  return if self.disposed?
        if $game_switches[TURN_MOUSE_OFF_SWITCH]
          self.opacity = 0 unless self.opacity == 0
        end
        self.opacity = 255 unless self.opacity == 255
        super
        x = self.x
        y = self.y
        self.x, self.y = Mouse.pos
        self.x -= 8 if @not_default
        self.y -= 8 if @not_default
      end
    end
    
    $cursor = Sprite_Cursor.new
    
    module Input
      
      class << self
        
        alias jet5888_press? press? unless $@
        def press?(arg)
          if arg == Input::C
            return true if Mouse.press?(1)
          elsif arg == Input::B
            return true if Mouse.press?(2)
          end
          jet5888_press?(arg)
        end
        
        alias jet5888_repeat? repeat? unless $@
        def repeat?(arg)
          if arg == Input::C
            return true if Mouse.click?(1)
          elsif arg == Input::B
            return true if Mouse.click?(2)
          end
          jet5888_repeat?(arg)
        end
        
        alias jet5888_trigger? trigger? unless $@
        def trigger?(arg)
          if arg == Input::C
            return true if Mouse.click?(1)
          elsif arg == Input::B
            return true if Mouse.click?(2)
          end
          jet5888_trigger?(arg)
        end
        
        alias jet8432_update update unless $@
        def update(*args, &block)
          jet8432_update(*args, &block)
          if $game_switches[JetMouse::TURN_MOUSE_OFF_SWITCH] && $cursor.opacity != 0
            $cursor.opacity = 0
          end
          $cursor.update unless $game_switches[JetMouse::TURN_MOUSE_OFF_SWITCH]
          Mouse.update unless $game_switches[JetMouse::TURN_MOUSE_OFF_SWITCH]
        end
      
        alias jet1626_dir4 dir4 unless $@
        def dir4(*args, &block)
          if !$game_temp.nil?
            if $game_temp.move_because_of_mouse
              if !$game_temp.mouse_path.empty? && $game_player.movable? && 
                  !$game_map.interpreter.running? && SceneManager.scene_is?(Scene_Map) &&
                  jet1626_dir4(*args, &block) == 0
                f = $game_temp.mouse_path.reverse!.pop
                $game_temp.mouse_path.reverse!
                return f * 2
              else
                $game_temp.move_because_of_mouse = false
                $game_temp.mouse_path = []
              end
            end
          end
          jet1626_dir4(*args, &block)
        end
        
        alias jet1626_dir8 dir8 unless $@
        def dir8(*args, &block)
          if !$game_temp.nil?
            if $game_temp.move_because_of_mouse
              if !$game_temp.mouse_path.empty? && $game_player.movable? && 
                  !$game_map.interpreter.running? && SceneManager.scene_is?(Scene_Map) &&
                  jet1626_dir8(*args, &block) == 0
                f = $game_temp.mouse_path.reverse!.pop
                $game_temp.mouse_path.reverse!
                if [1, 2, 3, 4].include?(f)
                  return f * 2
                else
                  case f
                  when 5
                    return 1
                  when 6
                    return 3
                  when 7
                    return 7
                  when 8
                    return 9
                  end
                end
              else
                $game_temp.move_because_of_mouse = false
                $game_temp.mouse_path = []
              end
            end
          end
          jet1626_dir8(*args, &block)
        end
      end
    end
    
    class Game_Player
    	
    	def move_by_input
        return if !movable? || $game_map.interpreter.running?
        move = Input.dir4
        move_straight(move) if move > 0
      end
    end
    
    class Game_Character
      
      def find_mouse_path(trgt_x, trgt_y)
    	  fake_char = Game_Character.new
    	  fake_char.moveto(self.x, self.y)
    		fake_char.set_direction(self.direction)
    	  path = []
    	  g = MGraph.new(JetMouse::DO_8DIR_WALKING ? 8 : 4)
        until fake_char.x == trgt_x && fake_char.y == trgt_y
          if JetMouse::USE_DIJKSTRA
            path.push(g.Dijkstra(fake_char.x, fake_char.y, trgt_x, trgt_y))
          else
            path.push(g.AStar(fake_char.x, fake_char.y, trgt_x, trgt_y))
          end
          if path[-1] != 0
            fake_char.move_straight(path[-1] * 2)
          else
            path = []
            break
          end
        end
        Graphics.frame_reset
        return path.reverse
      end
    end
    
    class PQueue < Array
    
      def addEl(ii)
        iii = 0
        while iii < self.length && self[iii] < ii
          iii += 1
        end
        self.insert(iii,ii)
      end
    
      def remEl(ii)
        iii = 0
        while iii < self.length && self[iii] < ii
          iii += 1
        end
        self.delete_at(iii)
      end
    
      def found?(ii)
        i = 0
        j = self.length-1
        ff = false
        while (not ff) && i <= j
          mid = (i+j)/2
          if self[mid] == ii
            ff = true
          else
            if self[mid] < ii
              i = mid+1
            else
              j = mid-1
            end
          end
        end
        return ff
      end
    end
    
    class MGraph
    
      attr_accessor :w, :h
      attr_accessor :neighbors
      attr_accessor :passage_table
    
      def initialize(nh, char = $game_player)
        @w = $game_map.width
        @h = $game_map.height
        @neighbors = nh
        @passage_table = Table.new(@w,@h,nh)
        for i in 0..@w
          for j in 0..@h
            for k in 1..nh
              @passage_table[i,j,k-1] = char.passable?(i, j, k * 2) ? 1 : 0
              if not neighborExist?(nodeOf(i, j), k)
                @passage_table[i, j, k - 1] = 0
              end
            end
          end
        end
      end
    
      def nodeOf(x,y)
        return y*@w+x+1
      end
    
      def xNode(idxNode)
        return (idxNode-1) % @w
      end
      
      def yNode(idxNode)
        return (idxNode-1)/@w
      end
    
      def neighborOf(idxNode,dir)
        case dir
          when 1
            return (idxNode+@w)
          when 2
            return (idxNode-1)
          when 3
            return (idxNode+1)
          when 4
            return (idxNode-@w)
        end
      end
    
      def neighborExist?(idxNode,dir)
        case dir
          when 1
            return (yNode(idxNode)<@h-1)
          when 2
            return (xNode(idxNode)>0)
          when 3
            return (xNode(idxNode)<@w-1)
          when 4
            return (yNode(idxNode)>0)
        end
      end
    
      def reconstruct_path(s,t,vertices_prev)
        u=t
        while vertices_prev[u] != s && vertices_prev[u] != 0
          u = vertices_prev[u]
        end
        case u
          when s+@w
            return 1
          when s-1
            return 2
          when s+1
            return 3
          when s-@w
            return 4
        end
        return 0
      end
    
      def heuristic_dist(u,v)
        dx = xNode(v)-xNode(u)
        dy = yNode(v)-yNode(u)
        return (dx.abs+dy.abs)
      end
      
      def Dijkstra(x1, y1, x2, y2)
        s = nodeOf(x1, y1)
        t = nodeOf(x2, y2)
        q = PQueue.new(1, 0)
        q.addEl(s)
        vertices_dist = Array.new(@w * @h + 1, 9999)
        vertices_prev = Array.new(@w * @h + 1, 0)
        vertices_dist[s] = 0
        while q.length > 1
          d = vertices_dist[q[1]]
          u = q[1]
          if q.length > 2
            for ii in 2..q.length-1
              if vertices_dist[q[ii]] < d
                d = vertices_dist[q[ii]]
                u = q[ii]
              end
            end
          end
          if u == t
            return reconstruct_path(s,t,vertices_prev)
          end
          q.remEl(u)
          for i in 1..@neighbors
            if @passage_table[xNode(u), yNode(u), i - 1] == 1
              v = neighborOf(u, i)
              alt = vertices_dist[u] + 1
              if alt < vertices_dist[v]
                q.addEl(v)
                vertices_dist[v] = alt
                vertices_prev[v] = u
              end
            end
          end
        end
        return 0
      end
      
      def AStar(x1, y1, x2, y2)
        s = nodeOf(x1, y1)
        t = nodeOf(x2, y2)
        q = PQueue.new(1, 0)
        q.addEl(s)
        q1 = Array.new(@w * @h + 1, false)
        vertices_prev = Array.new(@w * @h + 1, 0)
        vertices_dist = Array.new(@w * @h + 1, 9999)
        h_score = Array.new(@w * @h + 1, 0)
        f_score = Array.new(@w * @h + 1, 9999)
        vertices_dist[s] = 0
        h_score[s] = heuristic_dist(s, t)
        f_score[s] = h_score[s]
        while q.length > 1
          d = f_score[q[1]]
          u = q[1]
          if q.length > 2
            for ii in 2..q.length-1
              if f_score[q[ii]] < d
                d = f_score[q[ii]]
                u = q[ii]
              end
            end
          end
          if u == t
            return reconstruct_path(s, t, vertices_prev)
          end
          q.remEl(u)
          q1[u] = true
          for i in 1..@neighbors
            if @passage_table[xNode(u), yNode(u), i - 1] == 1
              v = neighborOf(u, i)
              if !q1[v]
                tentative_g_score = vertices_dist[u] + 1
                if !q.found?(v)
                  q.addEl(v)
                  tentative_is_better = true
                elsif tentative_g_score < vertices_dist[v]
                  tentative_is_better = true
                else
                  tentative_is_better = false
                end
                if tentative_is_better
                  if vertices_prev[v] != 0
                    if f_score[u] < f_score[vertices_prev[v]]
                      vertices_prev[v] = u
                    end
                  else
                    vertices_prev[v] = u
                  end
                  vertices_dist[v] = tentative_g_score
                  h_score[v] = heuristic_dist(v, t)
                  f_score[v] = vertices_dist[v] + h_score[v]
                end
              end
            end
          end
        end
        return 0
      end
    end
    
    class Game_Temp
      
      attr_accessor :move_because_of_mouse
      attr_accessor :mouse_controlled_object
      attr_accessor :making_path
      attr_accessor :mouse_path
      attr_accessor :did_mouse_change
      
      alias jet6742_initialize initialize unless $@
      def initialize(*args, &block)
        jet6742_initialize(*args, &block)
        @move_because_of_mouse = false
        @making_path = false
        @mouse_path = []
      end
    end
    
    class Window_Selectable
      
      alias jet6742_update update unless $@
      def update(*args, &block)
        jet6742_update(*args, &block)
        update_mouse if self.active && self.visible
      end
      
      alias jet7222_top_row top_row= unless $@
      def top_row=(*args, &block)
        @last_cursor_move = 0 if @last_cursor_move.nil?
        @last_cursor_move -= 1
        return if @in_rect_loop || @last_cursor_move > 0
        jet7222_top_row(*args, &block)
        @last_cursor_move = 10
      end
      
      def update_mouse
        if JetMouse::USE_WHEEL_DETECTION
          f = Mouse.scroll
          if !f.nil?
            if f[2] < 0
              if contents.height > self.height && self.oy - contents.height < -self.height + 32
                self.top_row = self.top_row + 1
              end
            else
              self.top_row = self.top_row - 1 if contents.height > self.height
            end
          end
        end
        original_index = @index
        fake_index = -2
        add_x = self.viewport.nil? ? 0 : self.viewport.ox
        add_y = self.viewport.nil? ? 0 : self.viewport.oy
        self.item_max.times {|i|
          rect = item_rect(i)
          if Mouse.area?(self.x - self.ox + rect.x + 16 + add_x, self.y - self.oy + rect.y + 16 + add_y, rect.width, rect.height)
            fake_index = i
          end
        }
        @index = fake_index == -2 ? original_index : fake_index
        update_cursor
      end
    end
    
    class Scene_File
      
      alias wor_scefil_upd_mouse update unless $@
      def update(*args, &block)
        (0..self.item_max - 1).each do |i|
          ix = @savefile_windows[i].x
          iy = @savefile_windows[i].y + 48
          iw = @savefile_windows[i].width
          ih = @savefile_windows[i].height
          if Mouse.area?(ix, iy, iw, ih)
            @savefile_windows[@index].selected = false
            @savefile_windows[i].selected = true
            @index = i
          end
        end
        wor_scefil_upd_mouse(*args, &block)
      end
    end
    
    class Window_NameInput
      
      alias wor_winnam_upd_mouse update unless $@
      def update(*args, &block)
        wor_winnam_upd_mouse(*args, &block)
        if self.active and self.visible
          (0..self.table[@page].size - 1).each do |i|
          irect = item_rect(i)
          irx = self.x + 16 + irect.x - self.ox
          iry = self.y + 16 + irect.y - self.oy
          @index = i if Mouse.area?(irx, iry, irect.width, irect.height)
          end
        end
      end
    end
    
    class Window_PartyCommand
      
      def update_mouse
        (0..self.item_max - 1).each do |i|
        irect = item_rect(i)
        irx = self.viewport.ox + 16 + irect.x - self.ox
        iry = 288 + 16 + irect.y - self.oy + 64
        self.index = i if Mouse.area?(irx, iry, irect.width, irect.height)
        end
      end
    end
    
    class Window_ActorCommand
      
      def update_mouse
        (0..self.item_max - 1).each do |i|
        irect = item_rect(i)
        irx = self.viewport.ox + 288 + 16 + irect.x + 96
        iry = 288 + 16 + irect.y + 64
        self.index = i if Mouse.area?(irx, iry, irect.width, irect.height)
        end
      end
    end
    
    class Window_EventPopUp < Window_Base
      
      def initialize(x, y, width, height, text)
        super(x, y, width, height)
        self.opacity = 0
        @text = text
        refresh
      end
      
      def refresh
        self.contents.clear
        self.contents.draw_text(0, 0, self.width, 24, @text)
      end
    end
    
    class Game_Event
      
      attr_accessor :popup_window, :page
      
      def check_for_comment(regexp)
        return false if @list.nil?
        for item in @list
          if item.code == 108 or item.code == 408
            if !item.parameters[0][regexp].nil?
              return $1.nil? ? true : $1
            end
          end
        end
        return false
      end
      
      def through
        return true if check_for_comment(/MOUSE THROUGH/i) && $game_temp.making_path
        return @through
      end
      
      alias jet2734_update update unless $@
      def update(*args, &block)
        jet2734_update(*args, &block)
        update_mouse_popup
        update_mouse_change
      end
      
      def update_mouse_popup
        switch = $game_switches[JetMouse::TURN_MOUSE_OFF_SWITCH]
        if Mouse.true_grid == [self.x, self.y] && !switch && !@erased
          f = self.check_for_comment(/MOUSE TEXT(.+)/i)
          if f != false
            q = Bitmap.new(1, 1)
            size = q.text_size(f)
            x = self.screen_x - 16 - size.width / 2
            y = self.screen_y - 52 - size.height / 2
            if self.popup_window != nil
              self.popup_window.dispose
              self.popup_window = nil
            end
            self.popup_window = Window_EventPopUp.new(x, y, 
              size.width + 34, size.height + 34, f)
            q.dispose
            q = nil
          end
        else
          if self.popup_window != nil
            self.popup_window.dispose
            self.popup_window = nil
          end
        end
      end
      
      def update_mouse_change
        if Mouse.true_grid == [self.x, self.y]
          f =(self.check_for_comment(/MOUSE PIC(.+)/i) rescue false)
          if f != false
            if f.to_i != 0
              $cursor.change_cursor(f.to_i) unless $cursor.current_cursor == f.to_i
            else
              $cursor.change_cursor(f) unless $cursor.current_cursor == f
            end
            $game_temp.did_mouse_change = true
          end
        end
      end
    end
    
    
    class Scene_Map
      
      alias jet6742_update update unless $@
      def update(*args, &block)
        if !$game_message.visible
          update_mouse_left_click
        end
        jet6742_update(*args, &block)
        check_mouse_change
      end
      
      alias jet7811_terminate terminate unless $@
      def terminate(*args, &block)
        for event in $game_map.events.values
          next if event.popup_window.nil?
          event.popup_window.dispose unless event.popup_window.disposed?
          event.popup_window = nil
        end
        $cursor.create_cursor(JetMouse::CURSOR_PICTURE) if ![JetMouse::CURSOR_PICTURE,
          JetMouse::ICON_INDEX].include?($cursor.current_cursor)
        $cursor.opacity = 0
        jet7811_terminate(*args, &block)
        $cursor.opacity = 255 unless $game_switches[JetMouse::TURN_MOUSE_OFF_SWITCH]
      end
      
      alias jet8887_update_transfer_player update_transfer_player unless $@
      def update_transfer_player(*args, &block)
        if $game_player.transfer?
          $cursor.create_cursor(JetMouse::CURSOR_PICTURE) if ![JetMouse::CURSOR_PICTURE,
            JetMouse::ICON_INDEX].include?($cursor.current_cursor)
        end
        jet8887_update_transfer_player(*args, &block)
      end
      
      def check_mouse_change
        return if $game_switches[JetMouse::TURN_MOUSE_OFF_SWITCH]
        if $game_message.visible || $game_player.transfer?
          $cursor.create_cursor(JetMouse::CURSOR_PICTURE) if ![JetMouse::CURSOR_PICTURE,
            JetMouse::ICON_INDEX].include?($cursor.current_cursor)
          return
        end
        $cursor.create_cursor(JetMouse::CURSOR_PICTURE) if $game_temp.did_mouse_change.nil? && 
          ![JetMouse::CURSOR_PICTURE, JetMouse::ICON_INDEX].include?($cursor.current_cursor)
        $game_temp.did_mouse_change = nil
      end
    
      def update_mouse_left_click
        return if $game_map.interpreter.running? || $game_player.transfer?
        if Mouse.click?(1)
          event_activated = false
          for event in $game_map.events_xy(*Mouse.true_grid)
            if event.check_for_comment(/MOUSE CLICK/i)
              event.start
              event_activated = true
            elsif (event.x - $game_player.x).abs + (event.y - $game_player.y).abs == 1
              if ![3, 4].include?(event.trigger) && 
                   (![0, 2].include?(event.priority_type) || event.trigger == 0) &&
                      ![0, 1].include?(event.page.list.size)
                if (event.y - $game_player.y).abs >
                   (event.x - $game_player.x).abs
                  if event.y - $game_player.y > 0
                    $game_player.set_direction(2)
                  else
                    $game_player.set_direction(8)
                  end
                else
                  if event.x - $game_player.x > 0
                    $game_player.set_direction(6)
                  else
                    $game_player.set_direction(4)
                  end
                end
                event.start
                event_activated = true
                break
              end
            end
            if !event_activated
              for i in ["UP", "DOWN", "RIGHT", "LEFT"]
                if event.check_for_comment(/MOUSE MOVE #{i}/i)
                  event_activated = true
                  case i
                  when "UP"
                    x, y = event.x, event.y - 1
                  when "DOWN"
                    x, y = event.x, event.y + 1
                  when "LEFT"
                    x, y = event.x - 1, event.y
                  when "RIGHT"
                    x, y = event.x + 1, event.y
                  end
                  break
                end
              end
            end
          end
          if !event_activated
            x, y = *Mouse.true_grid
          end
          if !x.nil?
            $game_temp.move_because_of_mouse = true
            g = $game_player.find_mouse_path(x, y)
            $game_temp.mouse_path = g
          end
        end
      end
    end
    Изображения Изображения
    • Тип файла: png zxcccc.png (144.7 Кб, Просмотров: 266)
    Последний раз редактировалось aisuuw; 22.02.2012 в 18:52.
    Я очень злой дядя.....Так что думайте перед тем когда говорить!
    Спрайты тут http://rpgmaker.su/album.php?u=2719

  2. #2
    Маститый Аватар для Andrew
    Информация о пользователе
    Регистрация
    08.02.2011
    Адрес
    Беларусь, Витебск
    Сообщений
    1,049
    Записей в дневнике
    3
    Репутация: 30 Добавить или отнять репутацию

    По умолчанию

    Мне очень нравиться оформление. А на скрине не мыши. А где дема. А где автор.


  3. #3
    Авторитет Аватар для David Kristens
    Информация о пользователе
    Регистрация
    27.09.2010
    Адрес
    г.Хайдельберг (Германия)
    Сообщений
    1,711
    Записей в дневнике
    157
    Репутация: 66 Добавить или отнять репутацию

    По умолчанию

    А зачем нужна мышь? в мэйкере-то??

  4. #4
    Маститый Аватар для Andrew
    Информация о пользователе
    Регистрация
    08.02.2011
    Адрес
    Беларусь, Витебск
    Сообщений
    1,049
    Записей в дневнике
    3
    Репутация: 30 Добавить или отнять репутацию

    По умолчанию

    В смысле зачем?
    Хотя...
    Когда я ствил мышь в свой проект, я делал её только в менюшках.


  5. #5
    Местный Аватар для SethNsk
    Информация о пользователе
    Регистрация
    25.03.2010
    Сообщений
    243
    Записей в дневнике
    7
    Репутация: 12 Добавить или отнять репутацию

    По умолчанию

    Эээ... А Можно демку?.. Или объяснение как пользоваться, для не грамотных с дерёвни...

  6. #6
    Маститый Аватар для Nalia
    Информация о пользователе
    Регистрация
    18.09.2009
    Адрес
    Пенза
    Сообщений
    1,412
    Записей в дневнике
    105
    Репутация: 87 Добавить или отнять репутацию

    По умолчанию

    Милый скрипт, но у меня не желает работать. Выдаёт сие сообщение.

    Я отрицаю вашу реальность и заменю её своей. (c) Джон Адам Севидж

    Надо работать, работать надо. Ремешки под касками затянуть потуже, шинели в порядок привести, в кобуру засунуть трудолюбие 36 калибра и марш за мейкер! (с) Tall Men

  7. #7
    Местный Аватар для SethNsk
    Информация о пользователе
    Регистрация
    25.03.2010
    Сообщений
    243
    Записей в дневнике
    7
    Репутация: 12 Добавить или отнять репутацию

    По умолчанию

    Цитата Сообщение от Nalia Посмотреть сообщение
    Милый скрипт, но у меня не желает работать. Выдаёт сие сообщение.

    У меня тоже странно: добавил в базу, запустил проект, а ГГ не шевелится... Нет, вызов меню и работа в нем происходит адекватно, а ГГ не двигается... Хотя иногда, если долго тыкать все подряд, включая стрелки на клаве, он подрывается зигзагами в неизвестном направлении...
    А других скриптов с, хотя бы примерно, таким же функционалом я не нашел...

  8. #8
    Местный Аватар для SethNsk
    Информация о пользователе
    Регистрация
    25.03.2010
    Сообщений
    243
    Записей в дневнике
    7
    Репутация: 12 Добавить или отнять репутацию

    По умолчанию

    Выяснилась следующая проблема - если ГГ заходит на эвент который содержит какой нибудь код, то он не может сойти с него при помощи мыши... А каждый клик активирует событие.
    Последний раз редактировалось SethNsk; 06.05.2012 в 08:16.

  9. #9

    По умолчанию

    Еще один не нужный скрипт, ага.

  10. #10
    Местный Аватар для SethNsk
    Информация о пользователе
    Регистрация
    25.03.2010
    Сообщений
    243
    Записей в дневнике
    7
    Репутация: 12 Добавить или отнять репутацию

    По умолчанию

    Цитата Сообщение от aisuuw Посмотреть сообщение
    Еще один не нужный скрипт, ага.
    Почему?.. Мне, например, нужный.

Страница 1 из 2 12 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
Mouse system