设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2025|回复: 2
打印 上一主题 下一主题

[已经过期] 如何能把鼠标脚本 加上能全方位移动的算法。

[复制链接]

Lv4.逐梦者

梦石
8
星屑
6347
在线时间
1025 小时
注册时间
2010-7-26
帖子
1404
跳转到指定楼层
1
发表于 2010-9-2 11:01:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
下了个 支持鼠标的 脚 本,,但 他只是4方向  要斜着走的话,来回拐的很不好看,,我想改成 能全方位移动的,但还用4方向的那种伪 全方位的素材效果,,,,想问下 这我怎么入手改,,?或有简单点的方法,,我脚本不是很熟,,

以下是脚本。。。

#==============================================================================

# 本脚本来自www.66RPG.com,使用和转载请保留此信息

#==============================================================================



#=================以下两个用来调整战斗时的手感问题,可以自己试试。

$敌人选框扩大 = 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')

#$FindWindow = Win32API.new("user32", "FindWindow", 'pp', 'i')

#$HookStart  = Win32API.new("mouse_hook.dll", "HookStart", 'i', nil)

#$HookEnd  = Win32API.new("mouse_hook.dll", "HookEnd", nil, nil)

#$GetMouseStatus  = Win32API.new("mouse_hook.dll", "GetMouseStatus", 'i', 'i')

#$Window_HWND = $FindWindow.call(nil, 'mousetry')



module Mouse  

  LEFT = 0x01

  RIGHT = 0x02



  def self.init(sprite = nil)

#   $HookStart.call($Window_HWND)

    $ShowCursor.call(0)

   

    @show_cursor = false

   

    @mouse_sprite = Sprite.new

    @mouse_sprite.z = 99999

    @mouse_sprite.bitmap = Bitmap.new('Graphics/Icons/001-Weapon01.png')

    #@mouse_sprite.bitmap.fill_rect(Rect.new(0, 0, 32, 32), Color.new(0, 0, 0))



    @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

#    $HookEnd.call

    $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)

   

    @click_lock = false

    mouse_x, mouse_y = self.get_mouse_pos

    if @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.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

        @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.cursor_rect.empty

    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.cursor_rect.empty

    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

class Game_Player

  if @self_alias == nil

    alias self_update update

    @self_alias = true

  end

  def update

    mouse_x, mouse_y = Mouse.get_mouse_pos



    if @last_move_x == nil

      @last_move_x = false

    end

if $game_switches[50]

     if Mouse.trigger?(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.press?(Mouse::LEFT)

      last_moving = moving?

      last_direction = @direction

      unless moving? or $game_system.map_interpreter.running? or

             @move_route_forcing or $game_temp.message_window_showing

        last_x = @x

        if @last_move_x

          @last_move_x = false

        elsif mouse_x > screen_x + 16

          move_right

        elsif mouse_x < screen_x - 16

          move_left

        end

        last_y = @y

        if last_x != @x

          @last_move_x = true

        elsif mouse_y > screen_y

          move_down

        elsif mouse_y < screen_y - 32

          move_up

        end

        if last_y != @y

          @last_move_x = false

        elsif not @last_move_x

          case last_direction

          when 2

            turn_down

          when 4

            turn_left

          when 6

            turn_right

          when 8

            turn_up

          end

        end

      end

    end

    self_update

  end

end

Mouse.init

END { Mouse.exit }









#==============================================================================

# 本脚本来自www.66RPG.com,使用和转载请保留此信息

#==============================================================================

Lv1.梦旅人

尽头

梦石
0
星屑
119
在线时间
278 小时
注册时间
2010-6-20
帖子
1280
2
发表于 2010-9-2 12:42:52 | 只看该作者
复制脚本的时候请用[code]包住.
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
320
在线时间
2 小时
注册时间
2010-8-18
帖子
3
3
发表于 2010-9-2 17:51:50 | 只看该作者
给你个八方向的 完整鼠标系统(八方向)V2.0.rar (502.99 KB, 下载次数: 532)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-23 19:34

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表