赞 | 0 |
VIP | 0 |
好人卡 | 3 |
积分 | 1 |
经验 | 5930 |
最后登录 | 2021-5-12 |
在线时间 | 123 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 65
- 在线时间
- 123 小时
- 注册时间
- 2013-5-12
- 帖子
- 24
|
本帖最后由 名雪 于 2013-6-16 18:40 编辑
插入第一个脚本(输出模块)- #==============================================================================
- # ** 鼠标输出模块 (修复)
- #------------------------------------------------------------------------------
- # by DerVVulfman
- # 版本 1.2
- # 08-18-2007
- #------------------------------------------------------------------------------
- # 建立在鼠标输出模块...
- #
- # by Near Fantastica
- #------------------------------------------------------------------------------
- # Set_Pos feature by
- # Freakboy
- #------------------------------------------------------------------------------
- #
- # CALLS:
- #
- # Mouse.click?
- # 判断鼠标是否真的按下(Ture/False).
- # 这个值控制您按下的是左/右键,还是中键
- #
- # Mouse.press?
- # 判断鼠标是否真的按下/保持按下状态
- # 这个值控制您按下的是左/右键,还是中键
- # Mouse.pixels
- # Mouse.pixels
- # 这个值返回鼠标所在的坐标(640*480大小),如果鼠标超出游戏画面,这个值为空
- #
- # Mouse.tiles
- # This returns the mouse's screen coordinates in map tiles. Based on the
- # system's 20x15 tile size, this returns it in index values (a 0-19 width &
- # a 0-14 height). This functions the same manner as Mouse.pixels.
- #
- # Mouse.set_pos
- # This allows you to forcefully position the mouse at an x/y position within
- # the game screen by pixel coordinates. Given the game's normal screen width
- # of 640x480, adding: Mouse.set_pos(320,240) should position the mouse dead
- # center of the gaming window.
- #
- # Mouse.update
- # Add this routine into your update routines to update the mouse position.
- # It must be called otherwise you won't get valid mouse coordinates.
- #
- #==============================================================================
- module Mouse
- @mouse_menu = 0
- #--------------------------------------------------------------------------
- # * 鼠标点击
- # button : button
- #--------------------------------------------------------------------------
- def Mouse.click?(button)
- return true if @keys.include?(button)
- return false
- end
- #--------------------------------------------------------------------------
- # * 鼠标击键
- # button : button
- #--------------------------------------------------------------------------
- def Mouse.press?(button)
- return true if @press.include?(button)
- return false
- end
- #--------------------------------------------------------------------------
- # * 鼠标按下
- # button : button
- #--------------------------------------------------------------------------
- def Mouse.area?(x, y, width=32, height=32)
- return false if @pos == nil
- return true if @pos[0] >= x and @pos[0] <= (x+width) and @pos[1] >= y and @pos[1] <= (y+height)
- return false
- end
- #--------------------------------------------------------------------------
- # * 坐标
- #--------------------------------------------------------------------------
- def Mouse.pixels
- return @pos == nil ? [0, 0] : @pos
- end
- #--------------------------------------------------------------------------
- # * 鼠标初始坐标
- #--------------------------------------------------------------------------
- def Mouse.tiles
- return nil if @pos == nil
- x = @pos[0] / 32
- y = @pos[1] / 32
- return [x, y]
- end
- #--------------------------------------------------------------------------
- # * 设置鼠标初始坐标
- #--------------------------------------------------------------------------
- def Mouse.set_pos(x_pos=0, y_pos=0)
- width, height = Mouse.client_size
- if (x_pos.between?(0, width) && y_pos.between?(0, height))
- x = Mouse.client_pos[0] + x_pos; y = Mouse.client_pos[1] + y_pos
- Win32API.new('user32', 'SetCursorPos', 'NN', 'N').call(x, y)
- end
- end
- #--------------------------------------------------------------------------
- # * Mouse Update
- #--------------------------------------------------------------------------
- def Mouse.update
- @pos = Mouse.pos
- @keys, @press = [], []
- @keys.push(1) if Win32API.new("user32","GetAsyncKeyState",['i'],'i').call(1) & 0X01 == 1
- @keys.push(2) if Win32API.new("user32","GetAsyncKeyState",['i'],'i').call(2) & 0X01 == 1
- @keys.push(3) if Win32API.new("user32","GetAsyncKeyState",['i'],'i').call(4) & 0X01 == 1
- @press.push(1) if Win32API.new("user32","GetKeyState",['i'],'i').call(1) & 0X01 == 1
- @press.push(2) if Win32API.new("user32","GetKeyState",['i'],'i').call(2) & 0X01 == 1
- @press.push(3) if Win32API.new("user32","GetKeyState",['i'],'i').call(4) & 0X01 == 1
- end
- #--------------------------------------------------------------------------
- # * Automatic functions below
- #--------------------------------------------------------------------------
- #
- #--------------------------------------------------------------------------
- # * Obtain Mouse position in screen
- #--------------------------------------------------------------------------
- def Mouse.global_pos
- pos = [0, 0].pack('ll')
- if Win32API.new('user32', 'GetCursorPos', 'p', 'i').call(pos) != 0
- return pos.unpack('ll')
- else
- return nil
- end
- end
- #--------------------------------------------------------------------------
- # * 返回鼠标坐标
- #--------------------------------------------------------------------------
- def Mouse.pos
- x, y = Mouse.screen_to_client(*Mouse.global_pos)
- width, height = Mouse.client_size
- begin
- if (x >= 0 and y >= 0 and x < width and y < height)
- return x, y
- else
- return nil
- end
- rescue
- return nil
- end
- end
- #--------------------------------------------------------------------------
- # * Pass Screen to Game System
- #--------------------------------------------------------------------------
- def Mouse.screen_to_client(x, y)
- return nil unless x and y
- pos = [x, y].pack('ll')
- if Win32API.new('user32', 'ScreenToClient', %w(l p), 'i').call(Mouse.hwnd, pos) != 0
- return pos.unpack('ll')
- else
- return nil
- end
- end
- #--------------------------------------------------------------------------
- # * 得到游戏屏幕高度
- #--------------------------------------------------------------------------
- def Mouse.hwnd
- game_name = "\0" * 256
- Win32API.new('kernel32', 'GetPrivateProfileStringA', %w(p p p p l p), 'l').call('Game','Title','',game_name,255,".\\Game.ini")
- game_name.delete!("\0")
- return Win32API.new('user32', 'FindWindowA', %w(p p), 'l').call('RGSS Player',game_name)
- end
- #--------------------------------------------------------------------------
- # * 得到游戏屏幕宽度
- #--------------------------------------------------------------------------
- def Mouse.client_size
- rect = [0, 0, 0, 0].pack('l4')
- Win32API.new('user32', 'GetClientRect', %w(l p), 'i').call(Mouse.hwnd, rect)
- right, bottom = rect.unpack('l4')[2..3]
- return right, bottom
- end
- #--------------------------------------------------------------------------
- # * 得到窗口坐标
- #--------------------------------------------------------------------------
- def Mouse.client_pos
- rect = [0, 0, 0, 0].pack('l4')
- Win32API.new('user32', 'GetWindowRect', %w(l p), 'i').call(Mouse.hwnd, rect)
- left, upper = rect.unpack('l4')[0..1]
- return left+4, upper+30
- end
- end
复制代码 插入第二个脚本(路径寻址)- #==============================================================================
- # ■ 路径寻址
- #==============================================================================
- # Near Fantastica
- # 版本 1
- # 29.11.05
- #==============================================================================
- # Lets the Player or Event draw a path from an desonation to the source. This
- # method is very fast and because the pathfinding is imbedded into the Game
- # Character the pathfinding can be interrupted or redrawn at any time.
- #==============================================================================
- # 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)
- #==============================================================================
- # [VX] Simple Mouse System Note: I edited the method
- # character.passable?(x, y, direction) to character.passable?(x, y)
- # according to change of this method in VX.
- #------------------------------------------------------------------------------
- class Game_Character
- #--------------------------------------------------------------------------
- alias nf_pf_game_character_initialize initialize
- alias nf_pf_game_character_update update
- #--------------------------------------------------------------------------
- attr_accessor :map
- attr_accessor :runpath
- #--------------------------------------------------------------------------
- def initialize
- nf_pf_game_character_initialize
- @map = nil
- @runpath = false
- end
- #--------------------------------------------------------------------------
- def update
- run_path if @runpath == true
- nf_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 clear_path
- @map = nil
- @runpath = false
- 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) 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) 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) 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) 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 Game_Map
- #--------------------------------------------------------------------------
- alias pf_game_map_setup setup
- #--------------------------------------------------------------------------
- def setup(map_id)
- pf_game_map_setup(map_id)
- $game_player.clear_path
- end
- end
-
- class Game_Player
- #--------------------------------------------------------------------------
- alias pf_game_player_update update
- #--------------------------------------------------------------------------
- def update
- $game_player.clear_path if Input.dir4 != 0
- pf_game_player_update
- end
- end
-
- class Interpreter
- #--------------------------------------------------------------------------
- def event
- return $game_map.events[@event_id]
- end
- end
复制代码 插入第三个脚本(鼠标系统)- #==============================================================================
- # [VX] SMS - Simple Mouse System
- #------------------------------------------------------------------------------
- # ◦ by Woratana [[email][email protected][/email]]
- # ◦ Released on: 14/04/2008 (D-M-Y)
- # ◦ Version: 1.5
- #
- # ◦ Credit: DerVVulfman, Near Fantastica, and Freak Boy [Mouse Input Module]
- # lambchop, shun, Cybersam, Astro_mech, and Mr.Mo [Super Simple Mouse System]
- # - Modern Algebra, Zeriab, Patrick Lester [Path Finding]
- # - Near Fantastica, Fuso [Path Finding]
- #
- # - I will not be able to script this without those people and scripts above
- #-----------------------------------------------------------------------------
- #====[REQUIRE]=====
- # - DerVVulfman's Mouse Input Module
- # ([url]http://rmxp.org/forums/index.php?topic=26993[/url])
- # It's XP script, but also works in VX!
- #
- # - Near Fantastica's Path Finding [version 1.0]
- # ([url]http://www.rmxp.org/forums/index.php?topic=26661.0[/url])
- # with a little fix to make it works in VX.
- # (get fixed version from Simple Mouse System demo)
- #
- #====[FEATURE]=====
- # - Support to use mouse in many scenes / windows
- # - Click on map to move player with Path Finding
- # - Mouse Pointer
- #
- #====[PLAN in next version]=====
- # - Cursor change when put on other event
- # - Better event trigger check by click mouse
- #
- #------------------------------------------------------------------------------
- #==============================================================================
- # **鼠标输出模块
- #==============================================================================
- class << Mouse
- show_cursor = Win32API.new('user32', 'ShowCursor', 'l', 'l')
- show_cursor.call(0)
- $mousec = Sprite.new
- $mousec.z = 10001
- $mousec.x = $mousec.y = 1000
- $mouse_icon = 'fox_cursor'
- $mousec.bitmap = Cache.system($mouse_icon)
-
- alias wor_mouse_upd_mouse update unless $@
- def Mouse.update
- wor_mouse_upd_mouse
- if $mouse_old_icon.nil? or $mouse_old_icon != $mouse_icon
- $mouse_old_icon = $mouse_icon
- $mousec.bitmap = Cache.system($mouse_old_icon)
- end
- if @pos.nil?
- $mousec.x = 1000 if $mousec.x != 1000
- $mousec.y = 1000 if $mousec.y != 1000
- else
- $mousec.x = @pos[0] if $mousec.x != @pos[0]
- $mousec.y = @pos[1] if $mousec.y != @pos[1]
- end
- end
-
- def Mouse.map_pos
- return nil if @pos == nil
- x = ($game_map.display_x / 256) + (@pos[0] / 32)
- y = ($game_map.display_y / 256) + (@pos[1] / 32)
- return [x, y]
- end
- end
- #==============================================================================
- # ** 输出
- #==============================================================================
- class << Input
- alias wor_input_upd_mouse update unless $@
- alias wor_input_trig_mouse trigger? unless $@
- alias wor_input_rep_mouse repeat? unless $@
- def Input.update
- wor_input_upd_mouse
- Mouse.update
- end
-
- def Input.trigger?(input)
- return wor_input_trig_mouse(input) if Mouse.pos.nil?
- case input
- when Input::B
- return (wor_input_trig_mouse(input) or Mouse.click?(2))
- when Input::C
- if $scene.is_a?(Scene_Map) and !$game_message.visible
- return wor_input_trig_mouse(input)
- else
- return (wor_input_trig_mouse(input) or Mouse.click?(1))
- end
- else
- return wor_input_trig_mouse(input)
- end
- end
-
- def Input.repeat?(input)
- if input == Input::B
- return (wor_input_rep_mouse(input) or Mouse.click?(2))
- else
- return wor_input_rep_mouse(input)
- end
- end
- end
- #==============================================================================
- # ** 图形
- #==============================================================================
- class << Graphics
- alias wor_graph_fadeout_mouse fadeout unless $@
- def Graphics.fadeout(frames = 1)
- $mousec.visible = false if !$mousec.nil?
- wor_graph_fadeout_mouse(frames)
- end
- end
- #==============================================================================
- # ** Window_Selectable
- #==============================================================================
- class Window_Selectable < Window_Base
- alias wor_winsel_ini_mouse initialize
- alias wor_winsel_upd_mouse update
- def initialize(*args)
- wor_winsel_ini_mouse(*args)
- @scroll_wait = 0
- @cursor_wait = 0
- end
- def update
- wor_winsel_upd_mouse
- update_mouse if self.active and self.visible
- end
-
- def update_mouse
- @cursor_wait -= 1 if @cursor_wait > 0
- (0..@item_max - 1).each do |i|
- irect = item_rect(i)
- irx = self.x + 16 + irect.x - self.ox
- iry = self.y + 16 + irect.y - self.oy
- move_cursor(i) if Mouse.area?(irx, iry, irect.width, irect.height)
- end
- end
- def move_cursor(index)
- return if @index == index
- @scroll_wait -= 1 if @scroll_wait > 0
- row1 = @index / @column_max
- row2 = index / @column_max
- bottom = self.top_row + (self.page_row_max - 1)
- if row1 == self.top_row and row2 < self.top_row
- return if @scroll_wait > 0
- @index = [@index - @column_max, 0].max
- @scroll_wait = 4
- elsif row1 == bottom and row2 > bottom
- return if @scroll_wait > 0
- @index = [@index + @column_max, @item_max - 1].min
- @scroll_wait = 4
- else
- @index = index
- end
- return if @cursor_wait > 0
- Sound.play_cursor
- @cursor_wait += 2
- end
- end
- #==============================================================================
- # ** Window_MenuStatus
- #==============================================================================
- class Window_MenuStatus < Window_Selectable
- def item_rect(index)
- return Rect.new(0, index * 96, contents.width, 96)
- end
- end
- #==============================================================================
- # ** Window_NameInput
- #==============================================================================
- class Window_NameInput < Window_Base
- alias wor_winnam_upd_mouse update
- def update
- wor_winnam_upd_mouse
- if self.active and self.visible
- (0..TABLE[@mode].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
- #==============================================================================
- # ** Window_PartyCommand
- #==============================================================================
- class Window_PartyCommand < Window_Command
- def update_mouse
- (0..@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
- self.index = i if Mouse.area?(irx, iry, irect.width, irect.height)
- end
- end
- end
- #==============================================================================
- # ** Window_ActorCommand
- #==============================================================================
- class Window_ActorCommand < Window_Command
- def update_mouse
- (0..@item_max - 1).each do |i|
- irect = item_rect(i)
- irx = self.viewport.ox + 288 + 16 + irect.x
- iry = 288 + 16 + irect.y
- self.index = i if Mouse.area?(irx, iry, irect.width, irect.height)
- end
- end
- end
- #==============================================================================
- # ** Window_Message
- #==============================================================================
- class Window_Message < Window_Selectable
- def update_mouse
- (0..@item_max - 1).each do |i|
- irect = item_rect(i)
- irx = self.x + 16 + irect.x - self.ox
- iry = self.y + 16 + irect.y - self.oy + ($game_message.choice_start * WLH)
- self.index = i if Mouse.area?(irx, iry, irect.width, irect.height)
- end
- end
- end
- #==============================================================================
- # ** Scene_Base
- #==============================================================================
- class Scene_Base
- alias wor_scebase_posstr_mouse post_start
- alias wor_scebase_preter_mouse pre_terminate
- def post_start
- $mousec.visible = true if !$mousec.nil?
- wor_scebase_posstr_mouse
- end
-
- def pre_terminate
- $mousec.visible = false if !$mousec.nil?
- wor_scebase_preter_mouse
- end
- end
- #==============================================================================
- # ** Scene_File
- #==============================================================================
- class Scene_File < Scene_Base
- alias wor_scefil_upd_mouse update
- def update
- (0..@item_max - 1).each do |i|
- ix = @savefile_windows[i].x
- iy = @savefile_windows[i].y
- 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
- end
- end
- #==============================================================================
- # ** Scene_Map
- #==============================================================================
- class Scene_Map < Scene_Base
- alias wor_scemap_ini_mouse initialize
- alias wor_scemap_upd_mouse update
- def initialize
- @last_click = [nil, nil]
- wor_scemap_ini_mouse
- end
-
- def update
- wor_scemap_upd_mouse
- mouse_xy = Mouse.map_pos
- if Mouse.click?(1) and !mouse_xy.nil? and !$game_message.visible and
- !$game_map.interpreter.running?
- $game_player.turn_toward_pos(mouse_xy[0], mouse_xy[1])
- if $game_player.close?(mouse_xy[0],mouse_xy[1]) and
- $game_player.check_action_event
- $game_player.clear_path
- return
- end
- if $game_map.passable?(mouse_xy[0], mouse_xy[1])
- $game_player.find_path(mouse_xy[0], mouse_xy[1])
- end
- @last_click = mouse_xy
- end
- if Mouse.click?(3) and !mouse_xy.nil? and !$game_message.visible and
- !$game_map.interpreter.running?
- $game_player.clear_path
- $game_player.turn_toward_pos(mouse_xy[0], mouse_xy[1])
- end
- end
- end
- #==============================================================================
- # ** Game_Character
- #==============================================================================
- class Game_Character
- def turn_toward_pos(x,y)
- sx = distance_x_from_pos(x)
- sy = distance_y_from_pos(y)
- if sx.abs > sy.abs
- sx > 0 ? turn_left : turn_right
- elsif sx.abs < sy.abs
- sy > 0 ? turn_up : turn_down
- end
- end
-
- def distance_x_from_pos(x)
- sx = @x - x
- if $game_map.loop_horizontal?
- if sx.abs > $game_map.width / 2
- sx -= $game_map.width
- end
- end
- return sx
- end
-
- def distance_y_from_pos(y)
- sy = @y - y
- if $game_map.loop_vertical?
- if sy.abs > $game_map.height / 2
- sy -= $game_map.height
- end
- end
- return sy
- end
-
- def close?(x,y)
- sx = (@x - x).abs
- sy = (@y - y).abs
- if sx + sy == 1
- return true
- end
- return false
- end
- end
复制代码 插入以上脚本后,请自己找一个鼠标,命名为fox_cursor
不知道你要找的是不是这个 |
评分
-
查看全部评分
|