Project1

标题: 想要一个鼠标操作的脚本 [打印本页]

作者: 然然    时间: 2009-1-31 06:09
提示: 作者被禁止或删除 内容自动屏蔽
作者: dbshy    时间: 2009-2-1 06:37
  1. class Game_Map
  2.   def check_event_custom_start(mouse_x, mouse_y)
  3.     for event in $game_map.events.values #循环所有事件检查
  4.       #事件角色图片宽度、高度
  5.       event_width = RPG::Cache.character(event.character_name,event.character_hue).width/4
  6.       event_height = RPG::Cache.character(event.character_name,event.character_hue).height/4
  7.       #判断是否鼠标在事件上
  8.       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
  9.        event.start #开启事件
  10.         end
  11.       end
  12.     end
  13.   end

  14. class Mouse  
  15. LEFT = 0x01
  16. RIGHT = 0x02

  17. def init(sprite = nil)
  18.    $ShowCursor = Win32API.new("user32", "ShowCursor", 'i', 'l')
  19.    $GetCursorPos = Win32API.new("user32", "GetCursorPos", 'p', 'i')
  20.    $ScreenToClient = Win32API.new("user32", "ScreenToClient", 'ip', 'i')
  21.    $GetActiveWindow = Win32API.new("user32", "GetActiveWindow", nil, 'l')
  22.    $Window_HWND = $GetActiveWindow.call
  23.    $GetKeyState = Win32API.new("user32", "GetKeyState", 'i', 'i')
  24.    $ShowCursor.call(0)
  25.    
  26.    @show_cursor = false
  27.    
  28.    @mouse_sprite = Sprite.new
  29.    @mouse_sprite.z = 99999
  30.    @mouse_sprite.bitmap = Bitmap.new('Graphics/Icons/001-Weapon01.png')

  31.    @left_press = false
  32.    @right_press = false
  33.    @left_trigger = false
  34.    @right_trigger = false
  35.    @left_repeat = false
  36.    @right_repeat = false
  37.    @click_lock = false
  38.    
  39.    update
  40. end
  41. def self.exit
  42.    @mouse_sprite.bitmap.dispose
  43.    @mouse_sprite.dispose
  44.    @show_cursor = true
  45.    $ShowCursor.call(1)
  46. end
  47. def self.mouse_debug
  48.    return @mouse_debug.bitmap
  49. end
  50. def self.update
  51.    left_down = $GetKeyState.call(0x01)
  52.    right_down = $GetKeyState.call(0x02)
  53.    if Graphics.frame_count * 3 / Graphics.frame_rate != @total_sec
  54.      @total_sec = Graphics.frame_count * 3 / Graphics.frame_rate
  55.      @a = !@a
  56.    end
  57.    if $scene.is_a?(Scene_Map) == false
  58.      $mouse_icon_id = 0
  59.    end
  60.    
  61.    @click_lock = false
  62.    mouse_x, mouse_y = self.get_mouse_pos
  63.    if @mouse_sprite != nil
  64.      @mouse_sprite.x = mouse_x
  65.      @mouse_sprite.y = mouse_y
  66.    end
  67.    if left_down[7] == 1
  68.      @left_repeat = (not @left_repeat)
  69.      @left_trigger = (not @left_press)
  70.      @left_press = true
  71.    else
  72.      @left_press = false
  73.      @left_trigger = false
  74.      @left_repeat = false
  75.    end
  76.    if right_down[7] == 1
  77.      @right_repeat = (not @right_repeat)
  78.      @right_trigger = (not @right_press)
  79.      @right_press = true
  80.    else
  81.      @right_press = false
  82.      @right_trigger = false
  83.      @right_repeat = false
  84.    end
  85. end
  86. def self.get_mouse_pos
  87.    point_var = [0, 0].pack('ll')
  88.    if $GetCursorPos.call(point_var) != 0
  89.      if $ScreenToClient.call($Window_HWND, point_var) != 0
  90.        x, y = point_var.unpack('ll')
  91.        if (x < 0) or (x > 10000) then x = 0 end
  92.        if (y < 0) or (y > 10000) then y = 0 end
  93.        if x > 640 then x = 640 end
  94.        if y > 480 then y = 480 end
  95.        return x, y
  96.      else
  97.        return 0, 0
  98.      end
  99.    else
  100.      return 0, 0
  101.    end
  102. end
  103. def self.press?(mouse_code)
  104.    if mouse_code == LEFT
  105.      if @click_lock
  106.        return false
  107.      else
  108.        return @left_press
  109.      end
  110.    elsif mouse_code == RIGHT
  111.      return @right_press
  112.    else
  113.      return false
  114.    end
  115. end
  116. def self.trigger?(mouse_code)
  117.    if mouse_code == LEFT
  118.      if @click_lock
  119.        return false
  120.      else
  121.        return @left_trigger
  122.      end
  123.    elsif mouse_code == RIGHT
  124.      return @right_trigger
  125.    else
  126.      return false
  127.    end
  128. end
  129. def self.repeat?(mouse_code)
  130.    if mouse_code == LEFT
  131.      if @click_lock
  132.        return false
  133.      else
  134.        return @left_repeat
  135.      end
  136.    elsif mouse_code == RIGHT
  137.      return @right_repeat
  138.    else
  139.      return false
  140.    end
  141. end
  142. def self.click_lock?
  143.    return @click_lock
  144. end
  145. def self.click_lock
  146.    @click_lock = true
  147. end
  148. def self.click_unlock
  149.    @click_lock = false
  150. end
  151. end

  152. #这是INPUT模块
  153. module Input
  154. if @self_update == nil
  155.    @self_update = method('update')
  156.    @self_press = method('press?')
  157.    @self_trigger = method('trigger?')
  158.    @self_repeat = method('repeat?')
  159. end
  160. def self.update
  161.    @self_update.call
  162.    Mouse.update
  163. end
  164. def self.press?(key_code)
  165.    if @self_press.call(key_code)
  166.      return true
  167.    end
  168.    if key_code == C
  169.      return Mouse.press?(Mouse::LEFT)
  170.    elsif key_code == B
  171.      return Mouse.press?(Mouse::RIGHT)
  172.    else
  173.      return @self_press.call(key_code)
  174.    end
  175. end
  176. def self.trigger?(key_code)
  177.    if @self_trigger.call(key_code)
  178.      return true
  179.    end
  180.    if key_code == C
  181.      return Mouse.trigger?(Mouse::LEFT)
  182.    elsif key_code == B
  183.      return Mouse.trigger?(Mouse::RIGHT)
  184.    else
  185.      return @self_trigger.call(key_code)
  186.    end
  187. end
  188. def self.repeat?(key_code)
  189.    if @self_repeat.call(key_code)
  190.      return true
  191.    end
  192.    if key_code == C
  193.      return Mouse.repeat?(Mouse::LEFT)
  194.    elsif key_code == B
  195.      return Mouse.repeat?(Mouse::RIGHT)
  196.    else
  197.      return @self_repeat.call(key_code)
  198.    end
  199. end
  200. end

  201. Mouse.init
  202. class Game_Player < Game_Character
  203. alias old_update update
  204.     def update
  205.       old_update
  206.       if Mouse.trigger?(Mouse::LEFT) then
  207.       mouse_x, mouse_y = Mouse.get_mouse_pos
  208.       $game_map.check_event_custom_start(mouse_x, mouse_y)
  209.     end
  210.     end
  211. end
复制代码


当某开关打开时,鼠标操作脚本起作用,开关关闭时就没用了
这个没实现,等高手前辈{/ll}{/ll}
水平越来越废柴 - -bb
作者: kaien    时间: 2009-2-1 07:43
提示: 作者被禁止或删除 内容自动屏蔽
作者: goahead    时间: 2009-2-1 17:03
提示: 作者被禁止或删除 内容自动屏蔽
作者: 804018514    时间: 2009-2-1 17:05
提示: 作者被禁止或删除 内容自动屏蔽
作者: goahead    时间: 2009-2-1 17:20
提示: 作者被禁止或删除 内容自动屏蔽
作者: 804018514    时间: 2009-2-1 17:27
提示: 作者被禁止或删除 内容自动屏蔽
作者: IamI    时间: 2009-2-1 17:34
dbshy下面全都是self定义方法还用class= =既然决心class到底Init又不加self= =
另外狠狠的掐把visible拼成visivle的那位
修改如下
22行改成
def self.init(sprite = nil)
58行改成
   @mouse_sprite.visible = $need_mouse
作者: goahead    时间: 2009-2-1 17:35
提示: 作者被禁止或删除 内容自动屏蔽
作者: IamI    时间: 2009-2-1 17:37
以下引用goahead于2009-2-1 9:35:42的发言:

class mouse改成moudle mouse
def ini 改成def self.ini

class可以不改,反正class也可以定义公有方法,并非一定要module
作者: goahead    时间: 2009-2-1 17:39
提示: 作者被禁止或删除 内容自动屏蔽
作者: 804018514    时间: 2009-2-1 17:40
提示: 作者被禁止或删除 内容自动屏蔽
作者: IamI    时间: 2009-2-1 17:44
以下引用804018514于2009-2-1 9:40:15的发言:

可是改了之后就无法使用鼠标了

执行$need_mouse = true
作者: 804018514    时间: 2009-2-1 17:46
提示: 作者被禁止或删除 内容自动屏蔽
作者: 804018514    时间: 2009-2-1 17:48
提示: 作者被禁止或删除 内容自动屏蔽
作者: 804018514    时间: 2009-2-1 18:07
提示: 作者被禁止或删除 内容自动屏蔽
作者: IamI    时间: 2009-2-1 18:43
LS连了三贴,而且经测试,可以成功,请点击事件下部32*32的区域
作者: 804018514    时间: 2009-2-1 18:47
提示: 作者被禁止或删除 内容自动屏蔽
作者: IamI    时间: 2009-2-1 18:54
  1. ###########
  2. $need_mouse = true
  3. ###########
  4. class Game_Map
  5.   def check_event_custom_start(mouse_x, mouse_y)
  6.     for event in $game_map.events.values #循环所有事件检查
  7.       #事件角色图片宽度、高度
  8.       event_width = RPG::Cache.character(event.character_name,event.character_hue).width/4
  9.       event_height = RPG::Cache.character(event.character_name,event.character_hue).height/4
  10.       #判断是否鼠标在事件上
  11.       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
  12.        event.start #开启事件
  13.         end
  14.       end
  15.     end
  16.   end

  17. class Mouse  
  18. LEFT = 0x01
  19. RIGHT = 0x02

  20. def self.init(sprite = nil)
  21.    $ShowCursor = Win32API.new("user32", "ShowCursor", 'i', 'l')
  22.    $GetCursorPos = Win32API.new("user32", "GetCursorPos", 'p', 'i')
  23.    $ScreenToClient = Win32API.new("user32", "ScreenToClient", 'ip', 'i')
  24.    $GetActiveWindow = Win32API.new("user32", "GetActiveWindow", nil, 'l')
  25.    $Window_HWND = $GetActiveWindow.call
  26.    $GetKeyState = Win32API.new("user32", "GetKeyState", 'i', 'i')
  27.    $ShowCursor.call(0)
  28.    
  29.    @show_cursor = false
  30.    
  31.    @mouse_sprite = Sprite.new
  32.    @mouse_sprite.z = 99999
  33.    @mouse_sprite.bitmap = Bitmap.new('Graphics/Icons/001-Weapon01.png')

  34.    @left_press = false
  35.    @right_press = false
  36.    @left_trigger = false
  37.    @right_trigger = false
  38.    @left_repeat = false
  39.    @right_repeat = false
  40.    @click_lock = false
  41.    
  42.    update
  43. end
  44. def self.exit
  45.    @mouse_sprite.bitmap.dispose
  46.    @mouse_sprite.dispose
  47.    @show_cursor = true
  48.    $ShowCursor.call(1)
  49. end
  50. def self.mouse_debug
  51.    return @mouse_debug.bitmap
  52. end
  53. def self.update
  54.    ###############
  55.    @mouse_sprite.visible = $need_mouse
  56.    return unless $need_mouse
  57.    ###############
  58.    left_down = $GetKeyState.call(0x01)
  59.    right_down = $GetKeyState.call(0x02)
  60.    if Graphics.frame_count * 3 / Graphics.frame_rate != @total_sec
  61.      @total_sec = Graphics.frame_count * 3 / Graphics.frame_rate
  62.      @a = !@a
  63.    end
  64.    if $scene.is_a?(Scene_Map) == false
  65.      $mouse_icon_id = 0
  66.    end
  67.    
  68.    @click_lock = false
  69.    mouse_x, mouse_y = self.get_mouse_pos
  70.    if @mouse_sprite != nil
  71.      @mouse_sprite.x = mouse_x
  72.      @mouse_sprite.y = mouse_y
  73.    end
  74.    if left_down[7] == 1
  75.      @left_repeat = (not @left_repeat)
  76.      @left_trigger = (not @left_press)
  77.      @left_press = true
  78.    else
  79.      @left_press = false
  80.      @left_trigger = false
  81.      @left_repeat = false
  82.    end
  83.    if right_down[7] == 1
  84.      @right_repeat = (not @right_repeat)
  85.      @right_trigger = (not @right_press)
  86.      @right_press = true
  87.    else
  88.      @right_press = false
  89.      @right_trigger = false
  90.      @right_repeat = false
  91.    end
  92. end
  93. def self.get_mouse_pos
  94.    point_var = [0, 0].pack('ll')
  95.    if $GetCursorPos.call(point_var) != 0
  96.      if $ScreenToClient.call($Window_HWND, point_var) != 0
  97.        x, y = point_var.unpack('ll')
  98.        if (x < 0) or (x > 10000) then x = 0 end
  99.        if (y < 0) or (y > 10000) then y = 0 end
  100.        if x > 640 then x = 640 end
  101.        if y > 480 then y = 480 end
  102.        return x, y
  103.      else
  104.        return 0, 0
  105.      end
  106.    else
  107.      return 0, 0
  108.    end
  109. end
  110. def self.press?(mouse_code)
  111.    if mouse_code == LEFT
  112.      if @click_lock
  113.        return false
  114.      else
  115.        return @left_press
  116.      end
  117.    elsif mouse_code == RIGHT
  118.      return @right_press
  119.    else
  120.      return false
  121.    end
  122. end
  123. def self.trigger?(mouse_code)
  124.    if mouse_code == LEFT
  125.      if @click_lock
  126.        return false
  127.      else
  128.        return @left_trigger
  129.      end
  130.    elsif mouse_code == RIGHT
  131.      return @right_trigger
  132.    else
  133.      return false
  134.    end
  135. end
  136. def self.repeat?(mouse_code)
  137.    if mouse_code == LEFT
  138.      if @click_lock
  139.        return false
  140.      else
  141.        return @left_repeat
  142.      end
  143.    elsif mouse_code == RIGHT
  144.      return @right_repeat
  145.    else
  146.      return false
  147.    end
  148. end
  149. def self.click_lock?
  150.    return @click_lock
  151. end
  152. def self.click_lock
  153.    @click_lock = true
  154. end
  155. def self.click_unlock
  156.    @click_lock = false
  157. end
  158. end

  159. #这是INPUT模块
  160. module Input
  161. if @self_update == nil
  162.    @self_update = method('update')
  163.    @self_press = method('press?')
  164.    @self_trigger = method('trigger?')
  165.    @self_repeat = method('repeat?')
  166. end
  167. def self.update
  168.    @self_update.call
  169.    Mouse.update
  170. end
  171. def self.press?(key_code)
  172.    if @self_press.call(key_code)
  173.      return true
  174.    end
  175.    if key_code == C
  176.      return Mouse.press?(Mouse::LEFT)
  177.    elsif key_code == B
  178.      return Mouse.press?(Mouse::RIGHT)
  179.    else
  180.      return @self_press.call(key_code)
  181.    end
  182. end
  183. def self.trigger?(key_code)
  184.    if @self_trigger.call(key_code)
  185.      return true
  186.    end
  187.    if key_code == C
  188.      return Mouse.trigger?(Mouse::LEFT)
  189.    elsif key_code == B
  190.      return Mouse.trigger?(Mouse::RIGHT)
  191.    else
  192.      return @self_trigger.call(key_code)
  193.    end
  194. end
  195. def self.repeat?(key_code)
  196.    if @self_repeat.call(key_code)
  197.      return true
  198.    end
  199.    if key_code == C
  200.      return Mouse.repeat?(Mouse::LEFT)
  201.    elsif key_code == B
  202.      return Mouse.repeat?(Mouse::RIGHT)
  203.    else
  204.      return @self_repeat.call(key_code)
  205.    end
  206. end
  207. end

  208. Mouse.init
  209. class Game_Player < Game_Character
  210. alias old_update update
  211.     def update
  212.       old_update
  213.       if Mouse.trigger?(Mouse::LEFT) then
  214.       mouse_x, mouse_y = Mouse.get_mouse_pos
  215.       $game_map.check_event_custom_start(mouse_x, mouse_y)
  216.     end
  217.     end
  218. end
复制代码

直接打进去就能看到效果
不过这里鼠标只有启动事件的效果,其他什么都没有~ [LINE]1,#dddddd[/LINE]系统信息:本贴由楼主认可为正确答案,66RPG感谢您的热情解答~
作者: 804018514    时间: 2009-2-1 18:56
提示: 作者被禁止或删除 内容自动屏蔽
作者: dbshy    时间: 2009-2-1 20:20
{/ll}{/ll}{/ll}
看到改的地方,我泪流满面
昨天不知怎么想的,人老了......
作者: 然然    时间: 2009-2-1 22:06
提示: 作者被禁止或删除 内容自动屏蔽
作者: goahead    时间: 2009-2-2 01:04
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1