赞 | 0 |
VIP | 7 |
好人卡 | 0 |
积分 | 2 |
经验 | 18255 |
最后登录 | 2021-7-7 |
在线时间 | 224 小时 |
Lv1.梦旅人 剑仙·影羽
- 梦石
- 0
- 星屑
- 172
- 在线时间
- 224 小时
- 注册时间
- 2010-3-20
- 帖子
- 1580
|
- #==============================================================================
- # ■ 完整鼠标系统(四方向)
- #------------------------------------------------------------------------------
- # 使用时务必配合专用寻路算法
- # By whbm
- #==============================================================================
- #下面做一下介绍与使用说明:
- # 在屏幕上单击鼠标的时候,会自动进行寻路,这里为了速度更快并且为了进行迷
- #宫时的难度寻路被限定在当时的屏幕内部。(否则玩家直接点到终点,呵呵....知道
- #后果了吧)
- # 在角色移动过程中再次单击鼠标(即双击)并在单击第二次鼠标的时候不松手,
- #角色将会跟随鼠标方向移动。(这个应该好理解,不用多说吧)当角色贴着欲被启动
- #的事件的时候,单击NPC即可启动事件。若未贴着,将会产生自动寻路到NPC附近的某
- #点,那时在单击NPC即可。
- # 当鼠标停在某些事件上时候会发现有不同的图标,设置方法为:宝箱事件请在事
- #件的执行内容中添加 注释,注释内容为 Item 注意大小写。NPC事件请在事件的执行
- #内容中添加 注释注释内容为 NPC 注意大小写。若不箱改变某事件的图标,则不要写
- #那两个注释。
- # 当把脚本转到您工程的时候千万别忘了那个寻路用的脚本。
- #==============================================================================
- class Game_Event
- attr_accessor :flag
- end
- #==============================================================================
- # ■ Game_Map
- #------------------------------------------------------------------------------
- # 处理地图的类。包含卷动以及可以通行的判断功能。
- # 本类的实例请参考 $game_map 。
- #==============================================================================
- class Game_Map
- #--------------------------------------------------------------------------
- # ● 检查鼠标处是否有自定义的事件并返回类型
- #--------------------------------------------------------------------------
- def check_event_custom(mouse_x, mouse_y)
- for event in $game_map.events.values #循环所有事件检查
- event_width = RPG::Cache.character(event.character_name,event.character_hue).width / 4
- event_height = RPG::Cache.character(event.character_name,event.character_hue).height / 4
- if mouse_x > event.screen_x - event_width / 2 and mouse_x < event.screen_x + event_width / 2 and mouse_y + 32 > event.screen_y + 32 - event_height and mouse_y + 32 < event.screen_y + 32
- for i in 0...event.list.size
- if event.list[i].parameters[0] == "Item" #类型判断
- event.flag = 1
- elsif
- event.list[i].parameters[0] == "Npc" #类型判断
- event.flag = 2
- elsif
- event.list[i].parameters[0] == "Atk" #类型判断
- event.flag = 3
- else
- event.flag = 0 if $game_player.get_mouse_sta != 3 #无标志
- end
- return event.flag #返回事件类型标志
- return event.flag #返回事件类型标志
- end
- end
- end
- return 0 if $game_player.get_mouse_sta != 3 #如果不是在跟随鼠标状态,则返回无标志
- return $mouse_icon_id #使鼠标图不变化
- end
- #--------------------------------------------------------------------------
- # ● 检查鼠标处是否有事件可以开启
- #--------------------------------------------------------------------------
- def check_event_custom_start(mouse_x, mouse_y)
- for event in $game_map.events.values #循环所有事件检查
- #事件角色图片宽度、高度
- event_width = RPG::Cache.character(event.character_name,event.character_hue).width/4
- event_height = RPG::Cache.character(event.character_name,event.character_hue).height/4
- #判断是否鼠标在事件上
- if mouse_x > event.screen_x - event_width / 2 and mouse_x < event.screen_x + event_width / 2 and mouse_y + 32 > event.screen_y + 32 - event_height and mouse_y + 32 < event.screen_y + 32
- way_x = $game_player.x - event.x
- way_y = $game_player.y - event.y
- if ([1, -1].include?($game_player.x-event.x) and $game_player.y-event.y == 0) or ([1, -1].include?($game_player.y-event.y) and $game_player.x-event.x == 0)
- for i in 0...event.list.size
- if ["Item","Npc","Atk"].include?(event.list[i].parameters[0]) #当事件属于自定义事件
- #判断主角朝向
- if way_x == -1
- p_direction = 6 if way_y == 0
- elsif way_x == 0
- p_direction = 2 if way_y == -1
- p_direction = 8 if way_y == 1
- else
- p_direction = 4 if way_y == 0
- end
- event.start #开启事件
- return 1, p_direction #返回即将开启事件以及角色朝向
- end
- end
- end
- end
- end
- return 0, 5 #返回不会开启事件以及角色朝向不变
- end
- #--------------------------------------------------------------------------
- # ● 检查鼠标处是否存在自定义事件 for 寻路
- #--------------------------------------------------------------------------
- def check_event_custom_exist(mouse_x, mouse_y)
- for event in $game_map.events.values #循环所有事件检查
- #事件角色图片宽度、高度
- event_width = RPG::Cache.character(event.character_name,event.character_hue).width/4
- event_height = RPG::Cache.character(event.character_name,event.character_hue).height/4
- if mouse_x > event.screen_x - event_width / 2 and mouse_x < event.screen_x + event_width / 2 and mouse_y + 32 > event.screen_y + 32 - event_height and mouse_y + 32 < event.screen_y + 32
- for i in 0...event.list.size
- return 1, event if ["Item", "Npc","Atk"].include?(event.list[i].parameters[0]) #返回存在自定义事件以及事件体
- end
- end
- end
- return 0, event #返回不存在自定义事件,以及事件体
- end
- end
- #=================以下两个用来调整战斗时的手感问题,可以自己试试。
- $敌人选框扩大 = 20
- $角色选框扩大 = 30
- #==============================================================================
- # ● API调用
- #==============================================================================
- $ShowCursor = Win32API.new("user32", "ShowCursor", 'i', 'l')
- $GetCursorPos = Win32API.new("user32", "GetCursorPos", 'p', 'i')
- $ScreenToClient = Win32API.new("user32", "ScreenToClient", 'ip', 'i')
- $GetActiveWindow = Win32API.new("user32", "GetActiveWindow", nil, 'l')
- $Window_HWND = $GetActiveWindow.call
- $GetKeyState = Win32API.new("user32", "GetKeyState", 'i', 'i')
- module Mouse
- LEFT = 0x01
- RIGHT = 0x02
- def self.init(sprite = nil)
- $ShowCursor.call(0)
-
- @show_cursor = false
-
- @mouse_sprite = Sprite.new
- @mouse_sprite.z = 99999
- @mouse_sprite.bitmap = Bitmap.new('Graphics/Icons/001-Weapon01.png')
- @left_press = false
- @right_press = false
- @left_trigger = false
- @right_trigger = false
- @left_repeat = false
- @right_repeat = false
- @click_lock = false
-
- update
- end
- def self.exit
- @mouse_sprite.bitmap.dispose
- @mouse_sprite.dispose
- @show_cursor = true
- $ShowCursor.call(1)
- end
- def self.mouse_debug
- return @mouse_debug.bitmap
- end
- def self.update
- left_down = $GetKeyState.call(0x01)
- right_down = $GetKeyState.call(0x02)
- if Graphics.frame_count * 3 / Graphics.frame_rate != @total_sec
- @total_sec = Graphics.frame_count * 3 / Graphics.frame_rate
- @a = !@a
- end
- if $scene.is_a?(Scene_Map) == false
- $mouse_icon_id = 0
- end
- if $mouse_icon_id != $mouse_icon_id_last
- case $mouse_icon_id
- when 1
- if @a
- @mouse_sprite.bitmap = Bitmap.new('Graphics/Icons/GetItem1')
- else
- @mouse_sprite.bitmap = Bitmap.new('Graphics/Icons/GetItem2')
- end
- when 2
- if @a
- @mouse_sprite.bitmap = Bitmap.new('Graphics/Icons/TalkTo1')
- else
- @mouse_sprite.bitmap = Bitmap.new('Graphics/Icons/TalkTo2')
- end
- when 3
- if @a
- @mouse_sprite.bitmap = Bitmap.new('Graphics/Icons/飞标1')
- else
- @mouse_sprite.bitmap = Bitmap.new('Graphics/Icons/苦无2')
- end
- when 11
- @mouse_sprite.bitmap = Bitmap.new('Graphics/Icons/Mouse_LOWER_LEFT')
- when 12
- @mouse_sprite.bitmap = Bitmap.new('Graphics/Icons/Mouse_DOWN')
- when 13
- @mouse_sprite.bitmap = Bitmap.new('Graphics/Icons/Mouse_LOWER_RIGHT')
- when 14
- @mouse_sprite.bitmap = Bitmap.new('Graphics/Icons/Mouse_LEFT')
- when 16
- @mouse_sprite.bitmap = Bitmap.new('Graphics/Icons/Mouse_RIGHT')
- when 17
- @mouse_sprite.bitmap = Bitmap.new('Graphics/Icons/Mouse_UPPER_LEFT')
- when 18
- @mouse_sprite.bitmap = Bitmap.new('Graphics/Icons/Mouse_UP')
- when 19
- @mouse_sprite.bitmap = Bitmap.new('Graphics/Icons/Mouse_UPPER_RIGHT')
- when 0
- if @a
- @mouse_sprite.bitmap = Bitmap.new('Graphics/Icons/苦无1')
- else
- @mouse_sprite.bitmap = Bitmap.new('Graphics/Icons/苦无')
- end
- end
- $mouse_icon_id_last = $mouse_icon_id
- end
- @click_lock = false
- mouse_x, mouse_y = self.get_mouse_pos
- # $game_variables[20],$game_variables[21] = self.get_mouse_pos# mouse_x= mouse_y
- unless @mouse_sprite == nil
- @mouse_sprite.x = mouse_x
- @mouse_sprite.y = mouse_y
- end
- if left_down[7] == 1
- @left_repeat = (not @left_repeat)
- @left_trigger = (not @left_press)
- @left_press = true
- else
- @left_press = false
- @left_trigger = false
- @left_repeat = false
- end
- if right_down[7] == 1
- @right_repeat = (not @right_repeat)
- @right_trigger = (not @right_press)
- @right_press = true
- else
- @right_press = false
- @right_trigger = false
- @right_repeat = false
- end
- end
- def self.get_mouse_pos
- point_var = [0, 0].pack('ll')
- if $GetCursorPos.call(point_var) != 0
- if $ScreenToClient.call($Window_HWND, point_var) != 0
- x, y = point_var.unpack('ll')
- if (x < 0) or (x > 10000) then x = 0 end
- if (y < 0) or (y > 10000) then y = 0 end
- if x > 640 then x = 640 end
- if y > 480 then y = 480 end
- return x, y
- else
- return 0, 0
- end
- else
- return 0, 0
- end
- end
- def self.press?(mouse_code)
- if mouse_code == LEFT
- if @click_lock
- return false
- else
- return @left_press
- end
- elsif mouse_code == RIGHT
- return @right_press
- else
- return false
- end
- end
- def self.trigger?(mouse_code)
- if mouse_code == LEFT
- if @click_lock
- return false
- else
- return @left_trigger
- end
- elsif mouse_code == RIGHT
- return @right_trigger
- else
- return false
- end
- end
- def self.repeat?(mouse_code)
- if mouse_code == LEFT
- if @click_lock
- return false
- else
- return @left_repeat
- end
- elsif mouse_code == RIGHT
- return @right_repeat
- else
- return false
- end
- end
- def self.click_lock?
- return @click_lock
- end
- def self.click_lock
- @click_lock = true
- end
- def self.click_unlock
- @click_lock = false
- end
- end
- module Input
- if @self_update == nil
- @self_update = method('update')
- @self_press = method('press?')
- @self_trigger = method('trigger?')
- @self_repeat = method('repeat?')
- end
- def self.update
- @self_update.call
- Mouse.update
- end
- def self.press?(key_code)
- if @self_press.call(key_code)
- return true
- end
- if key_code == C
- return Mouse.press?(Mouse::LEFT)
- elsif key_code == B
- return Mouse.press?(Mouse::RIGHT)
- else
- return @self_press.call(key_code)
- end
- end
- def self.trigger?(key_code)
- if @self_trigger.call(key_code)
- return true
- end
- if key_code == C
- return Mouse.trigger?(Mouse::LEFT)
- elsif key_code == B
- return Mouse.trigger?(Mouse::RIGHT)
- else
- return @self_trigger.call(key_code)
- end
- end
- def self.repeat?(key_code)
- if @self_repeat.call(key_code)
- return true
- end
- if key_code == C
- return Mouse.repeat?(Mouse::LEFT)
- elsif key_code == B
- return Mouse.repeat?(Mouse::RIGHT)
- else
- return @self_repeat.call(key_code)
- end
- end
- end
- class Window_Selectable
- if @self_alias == nil
- alias self_update update
- @self_alias = true
- end
- def update
- self_update
- if self.active and @item_max > 0
- index_var = @index
- tp_index = @index
- mouse_x, mouse_y = Mouse.get_mouse_pos
- mouse_not_in_rect = true
- for i in 0...@item_max
- @index = i
- update_cursor_rect
- top_x = self.cursor_rect.x + self.x + 16
- top_y = self.cursor_rect.y + self.y + 16
- bottom_x = top_x + self.cursor_rect.width
- bottom_y = top_y + self.cursor_rect.height
- if (mouse_x > top_x) and (mouse_y > top_y) and
- (mouse_x < bottom_x) and (mouse_y < bottom_y)
- mouse_not_in_rect = false
- if tp_index != @index
- tp_index = @index
- $game_system.se_play($data_system.cursor_se)
- end
- break
- end
- end
- if mouse_not_in_rect
- @index = index_var
- update_cursor_rect
- Mouse.click_lock
- else
- Mouse.click_unlock
- end
- end
- end
- end
- class Window_NameInput
- if @self_alias == nil
- alias self_update update
- @self_alias = true
- end
- def update
- self_update
- if self.active
- index_var = @index
- mouse_x, mouse_y = Mouse.get_mouse_pos
- mouse_not_in_rect = true
- for i in (0...CHARACTER_TABLE.size).to_a.push(180)
- @index = i
- update_cursor_rect
- top_x = self.cursor_rect.x + self.x + 16
- top_y = self.cursor_rect.y + self.y + 16
- bottom_x = top_x + self.cursor_rect.width
- bottom_y = top_y + self.cursor_rect.height
- if (mouse_x > top_x) and (mouse_y > top_y) and
- (mouse_x < bottom_x) and (mouse_y < bottom_y)
- mouse_not_in_rect = false
- break
- end
- end
- if mouse_not_in_rect
- @index = index_var
- update_cursor_rect
- Mouse.click_lock
- else
- Mouse.click_unlock
- end
- end
- end
- end
- class Window_InputNumber
- if @self_alias == nil
- alias self_update update
- @self_alias = true
- end
- def update
- self_update
- mouse_x, mouse_y = Mouse.get_mouse_pos
- if self.active and @digits_max > 0
- index_var = @index
- mouse_not_in_rect = true
- for i in 0...@digits_max
- @index = i
- update_cursor_rect
- top_x = self.cursor_rect.x + self.x + 16
- bottom_x = top_x + self.cursor_rect.width
- if (mouse_x > top_x) and (mouse_x < bottom_x)
- mouse_not_in_rect = false
- break
- end
- end
- if mouse_not_in_rect
- @index = index_var
- update_cursor_rect
- Mouse.click_lock
- else
- Mouse.click_unlock
- end
- end
- if @last_mouse_y == nil
- @last_mouse_y = mouse_y
- end
- check_pos = (@last_mouse_y - mouse_y).abs
- if check_pos > 10
- $game_system.se_play($data_system.cursor_se)
- place = 10 ** (@digits_max - 1 - @index)
- n = @number / place % 10
- @number -= n * place
- n = (n + 1) % 10 if mouse_y < @last_mouse_y
- n = (n + 9) % 10 if mouse_y > @last_mouse_y
- @number += n * place
- refresh
- @last_mouse_y = mouse_y
- end
- end
- end
- class Scene_File
- if @self_alias == nil
- alias self_update update
- @self_alias = true
- end
- def update
- mouse_x, mouse_y = Mouse.get_mouse_pos
- Mouse.click_lock
- idx = 0
- for i in @savefile_windows
- top_x = i.x + 16
- top_y = i.y + 16
- bottom_x = top_x + i.width
- bottom_y = top_y + i.height
- if (mouse_x > top_x) and (mouse_y > top_y) and
- (mouse_x < bottom_x) and (mouse_y < bottom_y)
- i.selected = true
- if @file_index != idx
- @file_index = idx
- $game_system.se_play($data_system.cursor_se)
- end
- Mouse.click_unlock
- else
- i.selected = false
- end
- idx += 1
- end
- self_update
- end
- end
- class Arrow_Enemy
- if @self_alias == nil
- alias self_update update
- @self_alias = true
- end
- def update
- mouse_x, mouse_y = Mouse.get_mouse_pos
- idx = 0
- for i in $game_troop.enemies do
- if i.exist?
- top_x = i.screen_x - self.ox
- top_y = i.screen_y - self.oy
- bottom_x = top_x + self.src_rect.width
- bottom_y = top_y + self.src_rect.height
- if (mouse_x > top_x - $敌人选框扩大) and (mouse_y > top_y - $敌人选框扩大) and
- (mouse_x < bottom_x + $敌人选框扩大) and (mouse_y < bottom_y + $敌人选框扩大)
- if @index != idx
- $game_system.se_play($data_system.cursor_se)
- @index = idx
- end
- end
- end
- idx += 1
- end
- self_update
- end
- end
- class Arrow_Actor
- if @self_alias == nil
- alias self_update update
- @self_alias = true
- end
- def update
- mouse_x, mouse_y = Mouse.get_mouse_pos
- idx = 0
- for i in $game_party.actors do
- if i.exist?
- top_x = i.screen_x - self.ox
- top_y = i.screen_y - self.oy
- bottom_x = top_x + self.src_rect.width
- bottom_y = top_y + self.src_rect.height
- if (mouse_x > top_x - $角色选框扩大) and (mouse_y > top_y - $角色选框扩大) and
- (mouse_x < bottom_x + $角色选框扩大) and (mouse_y < bottom_y + $角色选框扩大)
- if @index != idx
- $game_system.se_play($data_system.cursor_se)
- @index = idx
- end
- end
- end
- idx += 1
- end
- self_update
- end
- end
- #==============================================================================
- # ■ Game_Player
- #------------------------------------------------------------------------------
- # 处理主角的类。事件启动的判定、以及地图的滚动等功能。
- # 本类的实例请参考 $game_player。
- # 鼠标控制角色的主程序
- #==============================================================================
- class Game_Player
- if @self_alias == nil
- alias self_update update
- @self_alias = true
- end
- #--------------------------------------------------------------------------
- # ● 得到鼠标的状态
- #--------------------------------------------------------------------------
- def get_mouse_sta
- return @mouse_sta
- end
- #--------------------------------------------------------------------------
- # ● 完整鼠标系统
- #--------------------------------------------------------------------------
- def update
- mouse_x, mouse_y = Mouse.get_mouse_pos
- @mtp_x = mouse_x
- @mtp_y = mouse_y
- $game_variables[20] = mouse_x
- $game_variables[21] = mouse_y
- unless $game_system.map_interpreter.running? and @mouse_sta == 2 #鼠标状态不为跟随状态
- #得到鼠标图标方向
- $mouse_icon_id = $game_map.check_event_custom(mouse_x,mouse_y) if not [11, 12, 13, 14, 16, 17, 18, 19].include?($mouse_icon_id)
- else
- #令鼠标图标为正常
- $mouse_icon_id = 0 if @mouse_sta != 2
- end
- #当20或8号开关开启,关闭鼠标寻路和移动操作
- if $game_switches[20]or$game_switches[8]
- if Mouse.press?(Mouse::LEFT)
- for event in $game_map.events.values
- if event.screen_x/32 == mouse_x/32 and event.screen_y/32-1 == mouse_y/32
- end
- end
- end
- self_update
- return
- end
- if $game_switches[21]
- if Mouse.press?(Mouse::LEFT)
- for event in $game_map.events.values
- if event.screen_x/32 == mouse_x/32 and event.screen_y/32-1 == mouse_y/32
- event.start
- end
- end
- end
- self_update
- return
- end
- #单击鼠标时进行判断寻路或跟随
- if Mouse.trigger?(Mouse::LEFT) #当点击鼠标时
- unless $game_system.map_interpreter.running? or
- @move_route_forcing or $game_temp.message_window_showing #各种无效情况的排除
- #初始化
- @mouse_sta = 1
- p_direction = 5
- #检查鼠标处能否开启事件
- event_start,p_direction = $game_map.check_event_custom_start(mouse_x, mouse_y)
- #若在移动中再次点击鼠标左键(即双击左键),则改鼠标状态为跟随状态
- @mouse_sta = 2 if @paths_id != nil and @paths_id != @paths.size
- if @mouse_sta != 2
- #鼠标状态不为跟随状态则取数据并初始化路径
- trg_x = (mouse_x + $game_map.display_x / 4) / 32
- trg_y = (mouse_y + $game_map.display_y / 4) / 32
- @paths = []
- @paths_id = 0
- if event_start == 0 #若不能开启事件
- if trg_x != $game_player.x or trg_y != $game_player.y #若目标不为自身则开始寻路
- find_path = Find_Path.new
- @paths = find_path.find_player_short_path(trg_x, trg_y, @mtp_x, @mtp_y)
- end
- else #若能开启事件则改变角色朝向
- @direction = p_direction
- end
- end
- end
- end
- #开始移动
- if @mouse_sta != nil and @mouse_sta == 1 #若鼠标状态为寻路状态
- unless moving? or $game_system.map_interpreter.running? or
- @move_route_forcing or $game_temp.message_window_showing #排除无效情况
- if @paths_id != nil and @paths != nil and @paths_id <= @paths.size #若没有完成路径
- case @paths[@paths_id] #判断路径
- when 6
- @last_move_x = true
- move_right
- @paths_id += 1
- @direction = 6
- when 4
- @last_move_x = true
- move_left
- @paths_id += 1
- @direction = 4
- when 2
- @last_move_x = false
- move_down
- @direction = 2
- @paths_id += 1
- when 8
- @last_move_x = false
- move_up
- @direction = 8
- @paths_id += 1
- end
- end
- end
- elsif @paths != nil and @mouse_sta == 2 #当鼠标状态为跟随,且在移动中
- if Mouse.press?(Mouse::LEFT) #持续按住鼠标
- unless moving? or $game_system.map_interpreter.running? or
- @move_route_forcing or $game_temp.message_window_showing #排除无效情况
- #跟随方向判断并跟随
- if @mtp_x > self.screen_x
- if @mtp_y - self.screen_y > - ( @mtp_x - self.screen_x ) and
- @mtp_y - self.screen_y < @mtp_x - self.screen_x
- move_right
- $mouse_icon_id = 16
- @direction = 6
- end
- if @mtp_y - self.screen_y > @mtp_x - self.screen_x
- move_down
- $mouse_icon_id = 12
- @direction = 2
- end
- if @mtp_y - self.screen_y < - ( @mtp_x - self.screen_x )
- move_up
- $mouse_icon_id = 18
- @direction = 8
- end
- end
- if @mtp_x < self.screen_x
- if @mtp_y - self.screen_y > - ( self.screen_x - @mtp_x ) and
- @mtp_y - self.screen_y < self.screen_x - @mtp_x
- move_left
- $mouse_icon_id = 14
- @direction = 4
- end
- if @mtp_y - self.screen_y > self.screen_x - @mtp_x
- move_down
- $mouse_icon_id = 12
- @direction = 2
- end
- if @mtp_y - self.screen_y < - ( self.screen_x - @mtp_x )
- move_up
- $mouse_icon_id = 18
- @direction = 8
- end
- end
- end
- else #没状态的情况
- $mouse_icon_id = 0
- @mouse_sta = 0
- @paths_id = @paths.size #终止寻路移动
- end
- end
- self_update
- end
- end
- Mouse.init
- END { Mouse.exit }
- #==============================================================================
- # 本脚本来自www.66RPG.com,使用和转载请保留此信息
- #==============================================================================
复制代码- #==============================================================================
- # ■ Find_Path
- #------------------------------------------------------------------------------
- # 寻路算法--完整鼠标系统(四方向)专用版
- # By whbm
- #==============================================================================
- class Find_Path
- #--------------------------------------------------------------------------
- def initialize #初始化
- @open_list = []
- @close_lise = []
- @path = []
- end #结束初始化
- #--------------------------------------------------------------------------
- def fp_passable?(x, y, d, tr_x = -2, tr_y = -2) #开始判定通行
- return false if (tr_x == @unable_xa or
- tr_x == @unable_xb or
- tr_y == @unable_ya or
- tr_y == @unable_yb)
- if [2, 4, 6, 8].include?(d)
- if $game_player.passable?(x, y, d)
- return true
- else
- return false
- end
- end
- end #结束判定通行
- #--------------------------------------------------------------------------
- def get_g(now_point) #开始计算G值
- d = now_point[2]
- return 0 if d == 5
- father_point = get_father_point(now_point)
- g = father_point[3] + 10
- return g
- end #结束计算G值
- #--------------------------------------------------------------------------
- def get_h(now_point) #开始计算H值
- now_x = now_point[0]
- now_y = now_point[1]
- #print @trg_x,now_x,@trg_y,now_y
- h = (@trg_x - now_x).abs + (@trg_y - now_y).abs
- return h * 10
- end #结束计算H值
- #--------------------------------------------------------------------------
- def get_f(now_point) #开始计算F值
- f = now_point[3] + now_point[4]
- return f
- end #结束计算F值
- #--------------------------------------------------------------------------
- def get_point(x, y) #取已知坐标点
- if @open_list.size != 0
- @open_list.each do |point|
- if point[0] == x and point[1] == y
- return point
- break
- end
- end
- end
- if @close_list.size != 0
- @close_list.each do |point|
- if point[0] == x and point[1] == y
- return point
- break
- end
- end
- end
- end #结束取已知坐标点
- #--------------------------------------------------------------------------
- def get_father_point(now_point) #取已知点的父节点
- d = now_point[2]
- return now_point if d == 5
- x = now_point[0] + (d == 6 ? 1 : (d == 4 ? -1 : 0))
- y = now_point[1] + (d == 2 ? 1 : (d == 8 ? -1 : 0))
- return get_point(x, y)
- end #结束取已知点的父节点
- #--------------------------------------------------------------------------
- def new_point(x, y, d) #开始建立新节点
- #print x,y,d
- point = [x, y, d]
- point.push get_g(point)
- point.push get_h(point)
- point.push get_f(point)
- return point
- end #结束建立新节点
- #--------------------------------------------------------------------------
- def get_direction(self_x, self_y, trg_x, trg_y)
- if trg_x > self_x
- if trg_y - self_y > - ( trg_x - self_x ) and
- trg_y - self_y < ( trg_x - self_x )
- return 6
- end
- if trg_y - self_y > ( trg_x - self_x )
- return 2
- end
- if trg_y - self_y < - ( trg_x - self_x )
- return 8
- end
- end
- if trg_x < self_x
- if trg_y - self_y > - ( self_x - trg_x ) and
- trg_y - self_y < ( self_x - trg_x )
- return 4
- end
- if trg_y - self_y > ( self_x - trg_x )
- return 2
- end
- if trg_y - self_y < - ( self_x - trg_x )
- return 8
- end
- end
- end
- #--------------------------------------------------------------------------
- def get_d_x_y(x, y, d)
- d_x = x + (d == 6 ? 1 : (d == 4 ? -1 : 0))
- d_y = y + (d == 2 ? 1 : (d == 8 ? -1 : 0))
- return d_x, d_y
- end
- #--------------------------------------------------------------------------
- def find_short_path_other(self_x, self_y, trg_x, trg_y,
- real_self_x, real_self_y, real_trg_x, real_trg_y)
- @self_x = self_x
- @self_y = self_y
- @now_x = self_x
- @now_y = self_y
- @trg_x = trg_x
- @trg_y = trg_y
- @path = []
- direction = get_direction(real_self_x, real_self_y, real_trg_x, real_trg_y)
- @now_trg_x, @now_trg_y = get_d_x_y(@self_x, @self_y, direction)
- while fp_passable?(@now_x, @now_y, direction)
- @path.push direction
- @now_x = @now_trg_x
- @now_y = @now_trg_y
- @now_trg_x, @now_trg_y = get_d_x_y(@now_x, @now_y, direction)
- end
- return @path
- end
- #--------------------------------------------------------------------------
- def find_short_path(self_x, self_y, trg_x, trg_y,
- real_self_x, real_self_y, real_trg_x, real_trg_y) #开始搜索路径
-
- return find_short_path_other(self_x, self_y, trg_x, trg_y,
- real_self_x, real_self_y, real_trg_x, real_trg_y) if not
- (fp_passable?(trg_x, trg_y + 1, 8) or
- fp_passable?(trg_x + 1, trg_y, 4) or
- fp_passable?(trg_x - 1, trg_y, 6) or
- fp_passable?(trg_x, trg_y - 1, 2)) and @goal_type != 1
-
-
- #根据屏幕限定搜索面积..加速
- @unable_xa = $game_map.display_x / 128 - 1
- @unable_ya = $game_map.display_y / 128 - 1
- @unable_xb = $game_map.display_x / 128 + 20
- @unable_yb = $game_map.display_y / 128 + 20
-
-
- @self_x = self_x
- @self_y = self_y
- @now_x = self_x
- @now_y = self_y
- @trg_x = trg_x
- @trg_y = trg_y
- @open_list = []
- @close_list = []
- #准备搜索
- #print @self_x,@self_y
- @now_point = new_point(@self_x, @self_y, 5) #令起始点为当前点
- @open_list.push @now_point #将当前点加入关闭列表
- #开始搜索
- begin
- loop do
- check_trg = check_around_point(@now_point)
- if check_trg == true
- @path = get_path
- break
- end
- @now_point = get_lowest_f_point
- if @now_point == [] or @now_point == nil
- @path = []
- break
- end
- end
- rescue Hangup
- retry
- end
- return @path
- end #结束搜索路径
- #--------------------------------------------------------------------------
- def find_player_short_path(trg_x, trg_y,
- real_trg_x, real_trg_y) #寻找角色的最短路径
- self_x = $game_player.x
- self_y = $game_player.y
- real_self_x = $game_player.screen_x
- real_self_y = $game_player.screen_y
- @goal_type, event = $game_map.check_event_custom_exist(real_trg_x, real_trg_y)
- if @goal_type == 1
- trg_x = event.x
- trg_y = event.y
- end
- return find_short_path(self_x, self_y, trg_x, trg_y,
- real_self_x, real_self_y, real_trg_x, real_trg_y)
- end #结束角色的寻找路径
- #--------------------------------------------------------------------------
- def get_path #取得最终的路径
- path = []
- now_point = @open_list[@open_list.size - 1]
- path.push(10 - now_point[2])
- last_point = now_point
- loop do
- now_point = get_father_point(now_point)
- break if now_point[2] == 5
- path.push(10 - now_point[2])
- end
- return path.reverse
- end #结束取得最终的路径
- #--------------------------------------------------------------------------
- def get_lowest_f_point #开始取得最低F值的点
- if @open_list == []
- return []
- end
- last_lowest_f_point = @open_list[0]
- @open_list.each do |point|
- last_lowest_f_point = point if point[5] < last_lowest_f_point[5]
- end
- return last_lowest_f_point
- end #结束取得最低F值点
- #--------------------------------------------------------------------------
- def check_around_point(point) #开始检查已知点的八方节点
- for d in [1, 2, 3, 4, 6, 7, 8, 9]
- x = point[0] + ((d == 9 or d == 6 or d == 3) ? 1 : ((d == 7 or d == 4 or d == 1) ? -1 : 0))
- y = point[1] + ((d == 1 or d == 2 or d == 3) ? 1 : ((d == 7 or d == 8 or d == 9) ? -1 : 0))
- if in_close_list?(x, y) #在关闭列表中
- next
- elsif in_open_list?(x, y) #在开启列表中
- get_new_g_point = new_point(x, y, 10 - d)
- get_last_g_point = get_point(x, y)
- if get_new_g_point[3] >= get_last_g_point[3]
- next
- else
- #如果改变父节点是新G值更小则确定改变
- @open_list[@open_list.index(get_last_g_point)] = get_new_g_point
- end
- else
- if fp_passable?(point[0], point[1], d, x, y)
- # 如果不在开启列表中、且不在关闭列表中、且通行则添加它到新八周节点
- @open_list.push new_point(x, y, 10 - d)
- #如果将目标点添加到了开启列表中就返回true
- return true if x == @trg_x and y == @trg_y
- return true if @goal_type == 1 and [1, 0, -1].include?(x - @trg_x) and [1, 0, -1].include?(y - @trg_y)
- end
- end
- end
- #此刻没有找到目标点并将当前点加入关闭列表并在开启列表中删除
- @close_list.push point
- @open_list.delete(point)
- #此刻没找到目标点并返回false
- return false
- end #结束计算已知点的八方节点
- #--------------------------------------------------------------------------
- def in_open_list?(x, y) #开始检查谋点是否在开启列表中
- @open_list.each do |point|
- return true if point[0] == x and point[1] == y
- end
- return false
- end #结束检查谋点是否在开启列表中
- #--------------------------------------------------------------------------
- def in_close_list?(x, y) #开始检查谋点是否在关闭列表中
- @close_list.each do |point|
- return true if point[0] == x and point[1] == y
- end
- return false
- end #结束检查谋点是否在关闭列表中
- #--------------------------------------------------------------------------
- end
复制代码- #==============================================================================
- # 本脚本来自www.66RPG.com,使用和转载请保留此信息
- #==============================================================================
- class Window_Selectable
- if @self_alias == nil
- alias self_update update
- @self_alias = true
- end
- def update
- #self.cursor_rect.empty
- self_update
- if self.active and @item_max > 0
- index_var = @index
- tp_index = @index
- mouse_x, mouse_y = Mouse.get_mouse_pos
- mouse_not_in_rect = true
- for i in 0...@item_max
- @index = i
- update_cursor_rect
- top_x = self.cursor_rect.x + self.x + 16
- top_y = self.cursor_rect.y + self.y + 16
- bottom_x = top_x + self.cursor_rect.width
- bottom_y = top_y + self.cursor_rect.height
- if (mouse_x > top_x) and (mouse_y > top_y) and
- (mouse_x < bottom_x) and (mouse_y < bottom_y)
- mouse_not_in_rect = false
- if tp_index != @index
- tp_index = @index
- $game_system.se_play($data_system.cursor_se)
- end
- break
- end
- end
- if mouse_not_in_rect
- # row = @index / @column_max
- # 当前行被显示开头行前面的情况下
- if self.top_row < row_max-page_row_max and Mouse.press?(Mouse::LEFT) and mouse_y>self.y+self.height/2
- self.top_row +=1
- end
- # 当前行被显示末尾行之后的情况下
- if self.top_row > 0 and Mouse.press?(Mouse::LEFT) and mouse_y<=self.y+self.height/2#self.top_row + (self.page_row_max - 1)
- # 从当前行向末尾滚动
- self.top_row -=1
- end
- @index = index_var
- if self.is_a?(Window_Target)
- @index=-3
- end
- update_cursor_rect
- Mouse.click_lock
- else
- Mouse.click_unlock
- end
- end
- end
- def update_cursor_rect
- # 光标位置不满 0 的情况下
- if @index < 0
- self.cursor_rect.empty
- return
- end
- # 获取当前的行
- row = @index / @column_max
- # 当前行被显示开头行前面的情况下
- if row < self.top_row
- # 从当前行向开头行滚动
- self.cursor_rect.empty
- return
- end
- # 当前行被显示末尾行之后的情况下
- if row > self.top_row + (self.page_row_max - 1)
- # 从当前行向末尾滚动
- self.cursor_rect.empty
- return
- end
- # 计算光标的宽
- cursor_width = self.width / @column_max - 32
- # 计算光标坐标
- x = @index % @column_max * (cursor_width + 32)
- y = @index / @column_max * 32 - self.oy
- # 更新光标矩形
- self.cursor_rect.set(x, y, cursor_width, 32)
- end
- end
- #==============================================================================
- # 本脚本来自www.66RPG.com,使用和转载请保留此信息
- #==============================================================================
复制代码- #格式:显示的cmd图片的命名格式为:
- # cmd公共事件ID_名字
- # cmd公共事件ID_名字_02 # 此为鼠标经过显示的图片
- #
- #
- #即,带有cmd的为可以点击的图片,点击后执行相应的公共事件.....
- #不带cmd的图片没任何影响。。。
- #脚本:
- class Game_Picture
-
- def name=(str)
- @name = str
- end
-
- end
- class Sprite_Picture
-
- alias update_old update
- def update
- update_old
- return if @picture_name == "" or @picture_name[/cmd/].nil?
- mx,my = Mouse.get_mouse_pos
- lx = self.x - self.ox
- rx = lx + self.bitmap.width
- ty = self.y - self.oy
- by = ty + self.bitmap.height
- if mx < lx or mx > rx or my < ty or my > by or
- self.bitmap.get_pixel(mx-lx,my-ty).alpha == 0
- @picture.name = @picture.name.split(/_/)[0]+"_"[email protected](/_/)[1]
- $game_switches[20] = false
- return
- end
- if @picture.name.split(/_/)[2].nil?
- $game_switches[20] = true
- @picture.name = @picture.name + "_02"
- end
- if Input.trigger?(13)
- @picture.name.split(/_/)[0].sub(/cmd([0-9]+)/,"")
- $game_temp.common_event_id = $1.to_i
- $game_switches[20] = false
- end
- end
-
- end
复制代码- #==============================================================================
- # ■ Window_Picture_Command
- #------------------------------------------------------------------------------
- =begin
- 注意,如果支持鼠标请配上鼠标脚本。
- 该脚本是用图片做命令按钮,使用起来比较简单,脚本会自动判断位置。
- 使用方法:
- 与调用一般命令窗口一样!
- type描绘类型
- type = 1 只支持键盘
- type = 2 支持键盘+鼠标
- 如:先设定一个命令按钮图片以及坐标
- p1 = ["图片名",图片X坐标,图片Y坐标]
- 范例游戏里为
- #################################################
- s1 = ["新游戏",100,0]
- s2 = ["继续游戏",200,150]
- s3 = ["离开游戏",300,200]
- @command_window = Window_Picture_Command.new([s1,s2,s3],type)
- #################################################
- 这里的type的值就是刚才所支持的
- type = 1 只支持键盘
- type = 2 支持键盘+鼠标
- #################################################
- s1 = ["新游戏",100,0]
- s2 = ["继续游戏",200,150]
- s3 = ["离开游戏",300,200]
- @command_window = Window_Picture_Command.new([s1,s2,s3],2)
- #################################################
- 大概就这样了,不明白看范例游戏吧。
- 注意,如果支持鼠标请配上鼠标脚本。
- =end
- #==============================================================================
- class Window_Picture_Command < Window_Selectable
- attr_accessor :active
- #--------------------------------------------------------------------------
- # ● 初始化对像
- # width : 窗口的宽
- # commands : 命令字符串序列
- #--------------------------------------------------------------------------
- def initialize(commands,type=1)
- # 由命令的个数计算出窗口的高
- super(0, 0, 640, 480)
- @item_max = commands.size
- @commands = commands
- @dash = []
- @sprite = []
- @active = true
- @type = type
- @move_index = self.index
- self.opacity = 0
- self.contents = Bitmap.new(width - 32, @item_max * 32)
- refresh
- self.index = 0
- end
- #--------------------------------------------------------------------------
- # ● 刷新
- #--------------------------------------------------------------------------
- def refresh
- self.contents.clear
- for i in 0...@item_max
- draw_picture_item(i, @type)
- end
- end
- #--------------------------------------------------------------------------
- # ● 释放
- #--------------------------------------------------------------------------
- def dispose
- super
- for index in @dash
- if @sprite[index] != nil
- @sprite[index].dispose
- @sprite[index].bitmap.dispose
- end
- end
- end
- #--------------------------------------------------------------------------
- # ● 描绘图片项目
- # index : 项目编号
- # type : 描绘类型
- # type = 1 只支持键盘
- # type = 2 双面支持
- #--------------------------------------------------------------------------
- def draw_picture_item(index, type)
- @sprite[index] = Sprite.new
- if @commands[index][0] == nil
- p "图片名设置有误"
- end
- if @commands[index][1] == nil
- p "图片X坐标设置有误"
- end
- if @commands[index][2] == nil
- p "图片Y坐标设置有误"
- end
- bitmap = RPG::Cache.picture(@commands[index][0])
- @sprite[index].bitmap = bitmap
- @sprite[index].x = @commands[index][1]
- @sprite[index].y = @commands[index][2]
- @sprite[index].z = 1000
- @sprite[index].index = index
- if @sprite[index].index != self.index
- @sprite[index].color = Color.new(0,0,0,100)
- else
- @sprite[index].color = Color.new(0,0,0,0)
- end
- @dash.push(index)
- end
- #--------------------------------------------------------------------------
- # ● 刷新图片项目
- #--------------------------------------------------------------------------
- def update_item
- if Mouse.get_mouse_pos != nil
- $mouse_x,$mouse_y = Mouse.get_mouse_pos
- end
- if @type == 2
- for index in @dash
- if @sprite[index] != nil
- top_x = @sprite[index].x
- top_y = @sprite[index].y
- bottom_x = top_x + @sprite[index].bitmap.width
- bottom_y = top_y + @sprite[index].bitmap.height
- if ($mouse_x > top_x) and ($mouse_y > top_y) and
- ($mouse_x < bottom_x) and ($mouse_y < bottom_y)
- self.index = @sprite[index].index
- if @move_index != self.index
- Se.ok
- @move_index = self.index
- end
- end
- if @sprite[index].index != self.index
- @sprite[index].color = Color.new(0,0,0,100)
- else
- @sprite[index].color = Color.new(0,0,0,0)
- end
- end
- end
- elsif @type == 1
- for index in @dash
- if @sprite[index].index != self.index
- @sprite[index].color = Color.new(0,0,0,100)
- else
- @sprite[index].color = Color.new(0,0,0,0)
- end
- end
- end
- end
- #--------------------------------------------------------------------------
- # ● 图片项目无效化
- # index : 项目编号
- #--------------------------------------------------------------------------
- def disable_item(index)
- @sprite[index].color = Color.new(0,0,0,100)
- end
- #--------------------------------------------------------------------------
- # ● 图片的显示读取
- #--------------------------------------------------------------------------
- def visible
- for i in 0...@item_max
- p @sprite[i].visible = visible
- end
- end
- #--------------------------------------------------------------------------
- # ● 图片的显示
- #--------------------------------------------------------------------------
- def visible=(visible)
- for i in 0...@item_max
- @sprite[i].visible = visible
- end
- end
- #--------------------------------------------------------------------------
- # ● 刷新
- #--------------------------------------------------------------------------
- alias window_picture_command_update update
- def update
- if @active == true
- window_picture_command_update
- update_item
- end
- end
- #--------------------------------------------------------------------------
- # ● 更新光标举行
- #--------------------------------------------------------------------------
- def update_cursor_rect
- if @index < 0
- self.cursor_rect.empty
- return
- end
- row = @index / @column_max
- if row < self.top_row
- self.top_row = row
- end
- if row > self.top_row + (self.page_row_max - 1)
- self.top_row = row - (self.page_row_max - 1)
- end
- cursor_width = self.width / @column_max - 32
- x = @index % @column_max * (cursor_width + 32)
- y = @index / @column_max * 32 - self.oy
- self.cursor_rect.set(x+5000, y, cursor_width, 32)
- end
- end
- #==============================================================================
- # ■ Se
- #------------------------------------------------------------------------------
- # ■ 音效模块
- #==============================================================================
- module Se
- def self.ok
- $game_system.se_play($data_system.cursor_se)
- end
- def self.no
- $game_system.se_play($data_system.cancel_se)
- end
- end
- #==============================================================================
- # ■ Sprite
- #------------------------------------------------------------------------------
- # ■ index 选择光标
- #==============================================================================
- class Sprite
- attr_accessor :index
- end
复制代码 |
评分
-
查看全部评分
|