Project1

标题: 鼠标系统beta1#减肥更新版# by H [打印本页]

作者: hitlerson    时间: 2008-5-28 03:56
标题: 鼠标系统beta1#减肥更新版# by H
我学习RM才2个月吧,当然还是小菜鸟一个,整天在向高人们讨教,66RPG给了我很大的帮助~
我网游的年龄和中国网游的年龄一样大了,但现在差不多放弃了,想做个自己的游戏,觉得卡拍游戏比较有意思,所以一直在想做个自己的游戏王,哈哈。可惜到现在还不能完成,还有很多路要走哈~~~
在论坛贴了我的签名之后有好多人想要我的这个系统,非常难为情的说这个系统还没有做完整,最近一直在为战斗系统努力着呢!不过我想作为鼠标系统的话,还是能给大家做为一点借鉴的,所以这次就发出来给大家吧,可能有人需要。
PS: 我是初学者,所以写的这个系统也不是很好,只给大家学习用吧,很多都是用论坛上的脚本修改的,所以有被抄袭的,别来找我哈,我付不起责来,只能感谢各位前辈高人了!!!


系统名   : 鼠标操作系统
脱离RM   : NO
实现功能 : 全鼠标操作
已知BUG  : 窗口拖拉到X、Y为负值时,可能引起窗口的不能控制
            Secen_map在菜单中操作的时候,人物还会在地图上走路

当然希望有高人能帮我完善这个系统了,还有完善这个窗口的算法,当然更希望能发出来给我们学习你们的更好的系统~~~~在此拜望!





因为系统只是简单开发的,我想实现了战斗在完善全部系统的,所以很多系统功能模块都没有加上去,所以不能算是个完整的系统,所以有想用这个的还要先自己完善哦~~~(当然先得看明白我写的,完善其实不难,呵呵)

另外送大家看看我做的游戏王的这个界面,哈哈,不知道啥时候才能完成呢,我的游戏!
素材都是游戏王城之内的。。。(我可没用于商业用途哦!)

减肥更新版 3.73M
http://rpg.blue/upload_program/files/mouse_0530_93058312.rar

作者: hitlerson    时间: 2008-5-28 03:57
7.81M,传不上。。。。。

请斑竹帮忙了~
作者: 柳之一    时间: 2008-5-28 04:17
以下引用hitlerson于2008-5-27 19:57:21的发言:

7.81M,传不上。。。。。

请斑竹帮忙了~


[本贴由作者于 2008-5-27 20:13:28 最后编辑]

rar分卷压缩就行了
作者: hitlerson    时间: 2008-5-28 04:23
竟然还要用这招,天。。。。。。。。。{/fd}
作者: 柳之一    时间: 2008-5-28 04:33
刚才我还看到图片呢,怎么看不到了{/fd}
作者: hitlerson    时间: 2008-5-28 04:37
不知道,看来要重新传了,,,,{/ll}
作者: 柳之一    时间: 2008-5-28 04:46
如果我猜得没有错的话,一些战斗特效,例如翻转效果(不知道中文是不是这么叫),一些特殊的陷阱卡,魔法卡,尤其是连锁的时候,这部分的效果还没有实现吧。
作者: hitlerson    时间: 2008-5-28 04:48
哈哈,对的,游戏王真的是个很庞大的工程,呵呵,对我来说~~~~~

(这个论坛的贴图帖子重新编辑了就没了,还望网页设计解决哈!)
作者: 柳之一    时间: 2008-5-28 04:54
因为之前曾经做过游戏王的系统,头疼的就是牌太多了,效果太多,根本做不过来。而且有的牌我都不知道怎么用,至今还不知道 便乘 怎么用。

建议最好要一点一点作,先做一些怪兽牌。

另外电脑的ai也是个大问题。游戏王的经典之处就是战术。如果ai不行的话,做出来也会被骂的。心血没有少费,还不如做个泛滥的仙剑吃香。{/gg}
作者: hitlerson    时间: 2008-5-28 05:03
呵呵,这就是见仁见智了。。。
用绚丽的界面来博得青睐,这种事就留给美工吧。
我们写程序的还是用系统来说话。

现在怪兽的召唤、反转召唤、祭品召唤、融合召唤、仪式召唤都基本解决了
基本的魔法、陷阱、场地牌也都没有问题
当然如你说的,那么多魔法只能先挑简单的开始
AI确实大问题,想先让AI用一个牌组实现一个比较好的AI
现在我的AI只会招怪、攻击,致死方休!!!

PS: 游戏里用到大量的判断,觉得算法也很是问题,有改之再改的必要(拿到烂的电脑就觉得有点慢)
作者: hitlerson    时间: 2008-5-28 05:08
便乘  :   你的牌给对方怪物攻击打死的情况下,可以发动,找对方的任意怪兽破坏
作者: 2288809    时间: 2008-5-28 05:12
没传上来!可惜啊~~~~
我也很喜欢这东西,希望你快点完善了发上来,很期待啊 !
作者: hitlerson    时间: 2008-5-28 05:14
昏。。。。下载的连接没了。。。。

决定不再修改此贴了。。。。
作者: 禾西    时间: 2008-5-28 21:12
偷偷地提供一個站外上傳地址:
http://www.megaupload.com/cn/

爲甚麼不修改呢?鼠標系統的複雜程度很大的,多一個人的思路就多一份力量。用兩個月時間可以寫出一個初具規模的鼠標系統眞的不簡單耶!禾西手上的工程寫了一個月才差不多完成(本來已經完成得差不多,誰知道睡了一覺又有新的想法。所有Scene重新寫過 Orz)

不知道這個工程裏面實現了用鼠標控制說明沒有?禾西寫了一個判斷用的方法,可以老是覺得很繁複 |||
鼠標與鍵盤的糅合也還沒有很好地實現。不知道從這裏能不能找到啓發
作者: hitlerson    时间: 2008-5-28 21:33
我也觉得我写的很复杂,尤其是窗口的判断,窗口深度的控制.
还是拜求高人给出更好的算法~~
作者: 禾西    时间: 2008-5-28 21:46
這個是禾西的算法,不知道有沒有跟你的有多大差異==a
以分類物品界面爲例:


  1. #------------------------------------------------------------------------------
  2. # 確認鼠標是否在點擊範圍之內
  3. #------------------------------------------------------------------------------
  4. def compare(pos, area)
  5.   area.size.times do |i|
  6.     ox = area[i][0]
  7.     oy = area[i][1]
  8.     lx = ox + area[i][2]
  9.     ly = oy + area[i][3]
  10.     if (ox..lx) === pos[0] and (oy..ly) === pos[1]
  11.       index = i
  12.       return index
  13.     end
  14.   end
  15.   return false
  16. end
  17. #------------------------------------------------------------------------------
  18. # 取得當前點擊窗口範圍
  19. #------------------------------------------------------------------------------
  20. def get_warea(window)
  21.   x = window.x
  22.   y = window.y
  23.   w = window.width
  24.   h = window.height
  25.   return [x,y,w,h]
  26. end#==============================================================================
  27. # ■ Scene_Base
  28. #------------------------------------------------------------------------------
  29. #  模仿 VX 寫的游戲界面超級類
  30. #==============================================================================
  31. class Scene_Base
  32.   #--------------------------------------------------------------------------
  33.   # ● 主處理
  34.   #--------------------------------------------------------------------------
  35.   def main
  36.     Input.update        #刷新「輸入信息」
  37.     @wins = Hash.new    #生成窗口儲存
  38.     @active_window = nil#初始化窗口激活指令
  39.     start               #生成窗口
  40.     Graphics.transition #執行過渡
  41.     loop do
  42.       loop_do           #主循環
  43.       #如果切換畫面就中斷循環
  44.       break if $scene != self
  45.     end
  46.     Graphics.freeze     #準備過渡
  47.     # 釋放所有窗口
  48.     @wins.each_value{|i|i.dispose if i != nil}
  49.     terminate           #結束行爲
  50.   end
  51.   #--------------------------------------------------------------------------
  52.   # ● 主循環
  53.   #--------------------------------------------------------------------------
  54.   def loop_do
  55.     Input.update      #刷新「輸入信息」
  56.     Graphics.update   #刷新「游戏畫面」
  57.     mouse             #鼠標刷新
  58.     update            #刷新畫面
  59.   end
  60.   #--------------------------------------------------------------------------
  61.   # ● 鼠標刷新
  62.   #--------------------------------------------------------------------------
  63.   def mouse
  64. #==============================================================================
  65.     if @active_window != nil                            #截獲激活指令
  66.       @wins.each_value{|i|i.active = false if i.active} #凍結所有窗口
  67.       @wins[@active_window].active = true               #激活指定窗口
  68.       if defined? @wins[@active_window].mouse_area      #如果指定窗口存在鼠標感應範圍
  69.         @index_window = @wins[@active_window]           #監視鼠標活動
  70.       else                                              #否則
  71.         @index_window = nil                             #取消鼠標監視
  72.       end
  73.       @active_window = nil                              #銷毀激活指令
  74.     end
  75. #==============================================================================
  76.     @clicked     = false if @clicked                    #初始化鼠標點擊
  77.     if Input.click?(Input::Mouse_Left)                  #如果鼠標進行點擊行動
  78.       @clicked = true                                   #點擊爲眞
  79.       return if @index_window == nil                    #如果不存在感應範圍,結束
  80.       index = compare(Mouse.mouse_pos, @index_window.mouse_area) #確定鼠標是否在感應範圍
  81.       return if index == false                          #如果否,結束
  82.       @index_window.index = index                       #否則,修正index
  83.       Input.push(Input::C)                              #鼠標擊中爲眞
  84.       return                                            #過程結束
  85.     end
  86. #==============================================================================
  87.   end
  88.   #--------------------------------------------------------------------------
  89.   # ● 生成主要窗口
  90.   #--------------------------------------------------------------------------
  91.   def start
  92.   end
  93.   #--------------------------------------------------------------------------
  94.   # ● 刷新畫面
  95.   #--------------------------------------------------------------------------
  96.   def update
  97.   end
  98.   #--------------------------------------------------------------------------
  99.   # ● 釋放
  100.   #--------------------------------------------------------------------------
  101.   def terminate
  102.   end
  103. end
  104. #==============================================================================
  105. # ■ Window_Item
  106. #------------------------------------------------------------------------------
  107. #  顯示瀏覽物品的窗口(分類)
  108. #==============================================================================

  109. class Window_Item < Window_Selectable
  110.   #--------------------------------------------------------------------------
  111.   # ● 幫助文本
  112.   #--------------------------------------------------------------------------
  113.   def update_help
  114.     if defined? new_help
  115.       new_help
  116.     else
  117.       @help_window.set_text(self.item == nil ? "" : self.item.description)
  118.     end
  119.   end
  120.   attr_reader :data
  121.   attr_accessor :hindex
  122.   def new_help
  123.     if @hindex == nil
  124.       @help_window.set_text(nil)
  125.     else
  126.       @help_window.set_text(@data[@hindex])
  127.       #校正帮助窗口位置
  128.       @help_window.set_pos(self.x,self.y,self.width,self.oy,@hindex,@column_max)
  129.     end
  130.   end
  131. end
  132. #==============================================================================
  133. # ■ Scene_Item
  134. #------------------------------------------------------------------------------
  135. #  物品界面的类。
  136. #==============================================================================

  137. class Scene_Item < Scene_Base
  138.   #-----------------------
  139.   # 返回菜單的 index 位置:
  140.   #-----------------------
  141.   ReturnIndex = 1
  142.   #--------------------------------------------------------------------------
  143.   # ● 生成主要窗口
  144.   #--------------------------------------------------------------------------
  145.   def start
  146.     #----------------------------
  147.     # 背景圖(地圖畫面)
  148.     #----------------------------
  149.     @spriteset = Spriteset_Map.new
  150.     #----------------------------
  151.     # 生成指令窗口
  152.     #----------------------------
  153.     @wins[:command] = Window_Item_Commands.new
  154.     #----------------------------
  155.     # 生成幫助窗口
  156.     #----------------------------
  157.     @wins[:help] = Window_Help.new
  158.     @wins[:help].visible = false
  159.     #----------------------------
  160.     # 生成物品窗口
  161.     #----------------------------
  162.     @wins[:items] = Window_Item.new
  163.     @wins[:items].visible = false
  164.     @wins[:items].index = 0
  165.     @wins[:items].help_window = @wins[:help]
  166.     @help_area = []
  167.     @help_area << get_warea(@wins[:items])
  168.     #----------------------------
  169.     # 生成使用目標窗口 (设置为不可见・不活动)
  170.     #----------------------------
  171.     @wins[:target] = Window_Target.new
  172.     @wins[:target].visible = false
  173.     #----------------------------
  174.     # 激活指定窗口
  175.     #----------------------------
  176.     @active_window = :command
  177.     #----------------------------
  178.     # 鼠標停留計數
  179.     #----------------------------
  180.     @pos =[Mouse.mouse_pos,Mouse.mouse_pos,Mouse.mouse_pos,Mouse.mouse_pos]
  181.   end
  182.   #--------------------------------------------------------------------------
  183.   # ● 刷新画面
  184.   #--------------------------------------------------------------------------
  185.   def update
  186.     # 刷新窗口
  187.     @wins[:help].update
  188.     mouse_help
  189.     if @wins[:command].active
  190.       @wins[:command].update
  191.       (command_Input(:C);return) if Input.trigger?(Input::C)
  192.       (command_Input(:B);return) if Input.trigger?(Input::B)
  193.       return
  194.     end
  195.     if @wins[:items].active
  196.       @wins[:items].update
  197.       (items_Input(:C);return) if Input.trigger?(Input::C)
  198.       (items_Input(:B);return) if Input.trigger?(Input::B)
  199.       return
  200.     end
  201.     if @wins[:target].active
  202.       @wins[:target].update
  203.       (target_Input(:C);return) if Input.trigger?(Input::C)
  204.       (target_Input(:B);return) if Input.trigger?(Input::B)
  205.       return
  206.     end
  207.   end
  208.   #--------------------------------------------------------------------------
  209.   # ● 隨著鼠標移動的幫助
  210.   #--------------------------------------------------------------------------
  211.   def mouse_help
  212.     if compare(Mouse.mouse_pos, @help_area)
  213.       index = compare(Mouse.mouse_pos, @wins[:items].mouse_area)
  214.       if index
  215.         if @pos[0] != Mouse.mouse_pos or
  216.            @pos[1] != Mouse.mouse_pos or
  217.            @pos[2] != Mouse.mouse_pos or
  218.            @pos[3] != Mouse.mouse_pos
  219.            @pos.shift
  220.            @pos << Mouse.mouse_pos
  221.         elsif @wins[:items].hindex != index
  222.           @wins[:items].hindex = index
  223.         end
  224.       else
  225.         @wins[:items].hindex = nil if @wins[:items].hindex != nil
  226.       end
  227.     else
  228.       @wins[:items].hindex = nil if @wins[:items].hindex != nil
  229.     end
  230.   end
  231.   #--------------------------------------------------------------------------
  232.   # ● [指令窗口]下的輸入反應(鍵位)
  233.   #--------------------------------------------------------------------------
  234.   def command_Input(key)
  235.     case key
  236.     when :C
  237.       # 命令窗口光标位置分支
  238.       @wins[:items].refresh(@wins[:command].index) # 刷新物品窗口
  239.       @wins[:items].visible = true                 # 打開物品窗口
  240.       @wins[:items].index = 0                      # 初始化光標
  241.       @wins[:items].update                         # 更新物品窗口一次
  242.       @active_window = :items                      # 激活指定窗口
  243.     when :B
  244.       $game_system.se_play($data_system.cancel_se) # 演奏取消 SE
  245.       $scene = Scene_Menu.new(ReturnIndex)         # 切換到菜單畫面
  246.       return
  247.     end
  248.   end
  249.   #--------------------------------------------------------------------------
  250.   # ● [物品窗口]下的輸入反應(鍵位)
  251.   #--------------------------------------------------------------------------
  252.   def items_Input(key)
  253.     case key
  254.     when :C
  255.       #----------------------------
  256.       # 获取物品窗口当前选中的物品数据
  257.       #----------------------------
  258.       @item = @wins[:items].item
  259.       #----------------------------
  260.       # 不使用物品的情况下
  261.       #----------------------------
  262.       unless @item.is_a?(RPG::Item)
  263.         # 演奏冻结 SE
  264.         $game_system.se_play($data_system.buzzer_se)
  265.         return
  266.       end
  267.       #----------------------------
  268.       # 不能使用的情况下
  269.       #----------------------------
  270.       unless $game_party.item_can_use?(@item.id)
  271.         # 演奏冻结 SE
  272.         $game_system.se_play($data_system.buzzer_se)
  273.         return
  274.       end
  275.       # 演奏确定 SE
  276.       $game_system.se_play($data_system.decision_se)
  277.       #----------------------------
  278.       # 效果范围是我方的情况下
  279.       #----------------------------
  280.       if @item.scope >= 3
  281.         # 激活目標窗口
  282.         @wins[:target].x = 0#(@wins[:items].index + 1) * 304
  283.         @wins[:target].visible = true
  284.         @active_window = :target                    # 激活指定窗口
  285.         # 设置效果范围 (单体/全体) 的对应光标位置
  286.         if @item.scope == 4 || @item.scope == 6
  287.           @wins[:target].index = -1
  288.         else
  289.           @wins[:target].index = 0
  290.         end
  291.       #----------------------------
  292.       # 效果在我方以外的情况下
  293.       #----------------------------
  294.       else
  295.         # 公共事件 ID 有效的情况下
  296.         if @item.common_event_id > 0
  297.           # 预约调用公共事件
  298.           # 演奏物品使用时的 SE
  299.           $game_temp.common_event_id = @item.common_event_id
  300.           $game_system.se_play(@item.menu_se)
  301.           # 消耗品的情况下
  302.           if @item.consumable
  303.             # 使用的物品数减 1
  304.             # 再描绘物品窗口的项目
  305.             $game_party.lose_item(@item.id, 1)
  306.             @wins[:items].draw_item(@wins[:items].index)
  307.           end
  308.           $scene = Scene_Map.new
  309.           #--->切換回地圖畫面
  310.           return
  311.         end
  312.       end
  313.     when :B
  314.       $game_system.se_play($data_system.cancel_se) # 演奏取消 SE
  315.       @wins[:items].visible = false                # 關閉物品窗口
  316.       @wins[:items].refresh(6)                     # 重新刷新物品窗口
  317.       @wins[:items].index = 0                      # 初始化物品窗口的光標
  318.       @wins[:help].visible = false                 # 關閉幫助窗口
  319.       @active_window = :command                    # 激活指定窗口
  320.     end
  321.   end
  322.   #--------------------------------------------------------------------------
  323.   # ● [使用目標窗口]下的輸入反應(鍵位)
  324.   #--------------------------------------------------------------------------
  325.   def target_Input(key)
  326.     case key
  327.     when :C
  328.       #----------------------------
  329.       # 如果物品用完的情况下
  330.       #----------------------------
  331.       if $game_party.item_number(@item.id) == 0
  332.         # 演奏冻结 SE
  333.         $game_system.se_play($data_system.buzzer_se)
  334.         return
  335.       end
  336.       #----------------------------
  337.       # 目标是全体的情况下
  338.       #----------------------------
  339.       if @wins[:target].index == -1
  340.         # 对同伴全体应用物品使用效果
  341.         used = false
  342.         $game_party.actors.each do |i| used |= i.item_effect(@item) end
  343.       end
  344.       #----------------------------
  345.       # 目标是单体的情况下
  346.       #----------------------------
  347.       if @wins[:target].index >= 0
  348.         # 对目标角色应用物品的使用效果
  349.         target = $game_party.actors[@wins[:target].index]
  350.         used = target.item_effect(@item)
  351.       end
  352.       #----------------------------
  353.       # 使用物品的情况下
  354.       #----------------------------
  355.       if used
  356.       # 演奏物品使用时的 SE
  357.         $game_system.se_play(@item.menu_se)
  358.         # 消耗品的情况下
  359.         if @item.consumable
  360.           # 使用的物品数减 1
  361.           $game_party.lose_item(@item.id, 1)
  362.           # 再描绘物品窗口的项目
  363.           @wins[:items].draw_item(@wins[:items].index)
  364.         end
  365.         # 再生成目标窗口的内容
  366.         @wins[:target].refresh
  367.         # 全灭的情况下
  368.         if $game_party.all_dead?
  369.           $scene = Scene_Gameover.new
  370.           #--->切換回遊戲結束畫面
  371.           return
  372.         end
  373.         # 公共事件 ID 有效的情况下
  374.         if @item.common_event_id > 0
  375.           # 预约调用公共事件
  376.           $game_temp.common_event_id = @item.common_event_id
  377.           $scene = Scene_Map.new
  378.           #--->切換回地圖畫面
  379.           return
  380.         end
  381.         #----------------------------
  382.         # 重刷新物品欄
  383.         #----------------------------
  384.         @wins[:items].refresh(@wins[:command].index)
  385.       end
  386.       #----------------------------
  387.       # 无法使用物品的情况下
  388.       #----------------------------
  389.       unless used
  390.         # 演奏冻结 SE
  391.         $game_system.se_play($data_system.buzzer_se)
  392.       end
  393.     when :B
  394.       $game_system.se_play($data_system.cancel_se) # 演奏取消 SE
  395.       #----------------------------
  396.       # 由于物品用完而不能使用的场合
  397.       #----------------------------
  398.       unless $game_party.item_can_use?(@item.id)
  399.         # 再次生成物品窗口的内容
  400.         if Input.trigger?(Input::C)
  401.           @wins[:items].refresh(@wins[:command].index)
  402.         end
  403.       end
  404.       @wins[:target].visible = false               # 關閉目標窗口
  405.       @active_window = :items                      # 激活指定窗口
  406.     end
  407.   end
  408.   #--------------------------------------------------------------------------
  409.   # ● 釋放
  410.   #--------------------------------------------------------------------------
  411.   def terminate
  412.     @spriteset.dispose
  413.   end
  414. end
复制代码

作者: 柳之一    时间: 2008-5-28 22:35
以下引用hitlerson于2008-5-27 19:56:22的发言:


已知BUG  : 1  窗口拖拉到X、Y为负值时,可能引起窗口的不能控制
            2   Secen_map在菜单中操作的时候,人物还会在地图上走路

[本贴由作者于 2008-5-28 10:37:07 最后编辑]

bug 2原因找到,解决方案如下:
以状态栏为例子,当你点到状态的时候,应该跳转到新的场景sence—status,
然后在新的场景里面建立你的物品窗口,然后在写上@spriteset = Spriteset_Map.new,这样,map的背景就有了,人物也不会动了。
原来的人物移动是通过鼠标的xy来判断的,你的窗口也是,所以有的时候同时满足人物移动和你窗口选东西的条件,人物自然就会动了。其他同理。

bug1试了试,当上,左 ,右,出边界的时候好用。就是在下面的时候,会失控,尤其是鼠标的位置在右下角的那个物品状态栏的时候,100%失控。原因估计是你判断的时候,当鼠标在那个位置的时候刷新了物品栏装备栏,而没有让弹出来的窗口active。

由此可见,鼠标系统好像只是从鼠标的xy的区域判断的。而不是判断窗体的。不过前面的bug解决了的话,这个bug就不会出现了。本来想给你改来着,不过东西太多,主要不是按照我的思路,改起来反而可能有bug。还是自己改吧。
问题就是这样了。
作者: hitlerson    时间: 2008-5-29 02:46
谢谢楼上的回答!
不过我想提几个我的看法
BUG1: 右下的菜单窗口是在我的控制之内的,我说的是,当窗口拖到如下状态的时候

在重新点击窗口的下半部分进行拖动的时候,就会拖不动,只能拖窗口上半福分才能动

BUG2: 玩游戏的时候,总是想一边往目的地走,一边查看状态等属性,所以切换Secen就没有意思了,所以我没有用Secen。想在地图上实现鼠标在窗口中的时候,就不判断在地图上行走的点击!
作者: 柳之一    时间: 2008-5-29 03:28
以下引用hitlerson于2008-5-28 18:46:11的发言:

谢谢楼上的回答!
不过我想提几个我的看法
BUG1: 右下的菜单窗口是在我的控制之内的,我说的是,当窗口拖到如下状态的时候

在重新点击窗口的下半部分进行拖动的时候,就会拖不动,只能拖窗口上半福分才能动

BUG2: 玩游戏的时候,总是想一边往目的地走,一边查看状态等属性,所以切换Secen就没有意思了,所以我没有用Secen。想在地图上实现鼠标在窗口中的时候,就不判断在地图上行走的点击!


[本贴由作者于 2008-5-28 18:47:50 最后编辑]

那就加2个开关,当菜单打开的时候,鼠标寻路的为off。寻路的为on的时候,菜单为off.
bug1那个下面的确是拖不动,

说白了,这个bug的原因,就是鼠标脚本的缺点所导致的。只好全盘否定那个鼠标脚本,重新写个了。寻路的我这我有现成的,鼠标的就得重写了。而且每个场景都要重写一些东西。浩大的工程。由于我主要研究的arpg方向,对鼠标脚本不是很需要,没有动力重写啊……
作者: hitlerson    时间: 2008-5-29 03:36
禾西的脚本我看了,哈哈,谁叫是个才鸟嫩,看不明白
@wins.each_value{|i|i.dispose if i != nil}不理解
大致看了下,鼠标判断的思路应该差不多吧~都是捕捉窗口范围
这个脚本偶就回去研究下,不客气啦,呵呵!!!{/tp}
作者: 柳之一    时间: 2008-5-29 03:45
以下引用hitlerson于2008-5-28 19:36:46的发言:

禾西的脚本我看了,哈哈,谁叫是个才鸟嫩,看不明白
@wins.each_value{|i|i.dispose if i != nil}不理解
大致看了下,鼠标判断的思路应该差不多吧~都是捕捉窗口范围
这个脚本偶就回去研究下,不客气啦,呵呵!!!

等 禾西 的脚本出来吧。应该是个工程浩大的脚本。{/cy}
作者: 禾西    时间: 2008-5-29 10:17
以下引用柳之一于2008-5-28 19:28:48的发言:


说白了,这个bug的原因,就是鼠标脚本的缺点所导致的。

也不一定,我覺得是RGSS本身的窗口判斷問題。Scene的編寫邏輯不是很好...不然我就不要花費這麽多精力重寫了 Orz
可以用這個思路,判斷鼠標是否在窗口當中。如果是的話就停止尋路。不是的話就繼續尋路好了。這個應該比較邏輯...
以下引用hitlerson于2008-5-28 19:36:46的发言:

禾西的脚本我看了,哈哈,谁叫是个才鸟嫩,看不明白
@wins.each_value{|i|i.dispose if i != nil}不理解
大致看了下,鼠标判断的思路应该差不多吧~都是捕捉窗口范围
这个脚本偶就回去研究下,不客气啦,呵呵!!!

那個是禾西懶啦...不想寫dispose就寫個語句把全部窗口dispose掉
@wins 是記載了所有窗口數據的 Hash 表
存儲方式爲
@wins{ Symbol=>Window }
作者: bububinghe    时间: 2008-5-29 14:33
很棒啊!那个鼠标点击后拖动的效果不错!
作者: 越前リョーマ    时间: 2008-5-30 02:39
游戏王卡片系统的界面很强大……!{/qiang}
作者: suicaoya123    时间: 2008-6-1 01:27
发现    bug         !!!!!{/fd}

请修改:

就是当行数不够的时候也能移动,而且对位也不准.


作者: 禾西    时间: 2008-6-4 23:44
這個東西好像很難發布的樣子...可以抽出有用語句出來嗎==a比如窗口拖動,圖片拖動,等等基本語句
作者: hitlerson    时间: 2008-6-5 08:45
是不是说这个文件太大了?瘦身的话我还是乐意做的
作者: 禾西    时间: 2008-6-5 08:50
一個是文件太大,另一個是系統沒有完成,第三個是整個發布意義不大
作者: hitlerson    时间: 2008-6-5 08:55
那日后再说吧,说不定有人会先我发出来的呢~~~~
作者: 禾西    时间: 2008-6-5 08:57
裏面有幾個單獨腳本創意還是不錯的。如果你喜歡的話,把當中一些腳本應用的方法公布出來比較不錯。比較那個滾動條甚麽的。至少禾西現在沒有頭緒
作者: hitlerson    时间: 2008-6-5 09:02
重写了Seleteable
  1. #==============================================================================
  2. # ■ Window_Selectable
  3. #------------------------------------------------------------------------------
  4. #  拥有光标的移动以及滚动功能的窗口类。
  5. #==============================================================================

  6. class Window_Selectable_Cardhelp < Window_Base
  7.   #--------------------------------------------------------------------------
  8.   # ● 定义实例变量
  9.   #--------------------------------------------------------------------------
  10.   attr_reader   :index                    # 光标位置
  11.   attr_reader   :help_window              # 帮助窗口
  12.   #--------------------------------------------------------------------------
  13.   # ● 初始画对像
  14.   #     x      : 窗口的 X 坐标
  15.   #     y      : 窗口的 Y 坐标
  16.   #     width  : 窗口的宽
  17.   #     height : 窗口的高
  18.   #--------------------------------------------------------------------------
  19.   def initialize(x, y, width, height)
  20.     super(x, y, width, height)
  21.     @item_max = 1
  22.     @column_max = 6
  23.     @index = -1
  24.     @a = 0
  25.   end
  26.   #--------------------------------------------------------------------------
  27.   # ● 设置光标的位置
  28.   #     index : 新的光标位置
  29.   #--------------------------------------------------------------------------
  30.   def index=(index)
  31.     @index = index
  32.     # 刷新帮助文本 (update_help 定义了继承目标)
  33.     if self.active and @help_window != nil
  34.       update_help
  35.     end
  36.     # 刷新光标矩形
  37.     update_cursor_rect
  38.   end
  39.   #--------------------------------------------------------------------------
  40.   # ● 获取行数
  41.   #--------------------------------------------------------------------------
  42.   def row_max
  43.     # 由项目数和列数计算出行数
  44.     return 10
  45.   end
  46.   #--------------------------------------------------------------------------
  47.   # ● 获取开头行
  48.   #--------------------------------------------------------------------------
  49.   def top_row
  50.     # 将窗口内容的传送源 Y 坐标、1 行的高 32 等分
  51.     return self.oy / 32
  52.   end
  53.   #--------------------------------------------------------------------------
  54.   # ● 设置开头行
  55.   #     row : 显示开头的行
  56.   #--------------------------------------------------------------------------
  57.   def top_row=(row)
  58.     # row 未满 0 的场合更正为 0
  59.     if row < 0
  60.       row = 0
  61.     end
  62.     # row 超过 row_max - 1 的情况下更正为 row_max - 1
  63.     if row > row_max - 1
  64.       row = row_max - 1
  65.     end
  66.     # row 1 行高的 32 倍、窗口内容的传送源 Y 坐标
  67.     self.oy = row * 32
  68.   end
  69.   #--------------------------------------------------------------------------
  70.   # ● 获取 1 页可以显示的行数
  71.   #--------------------------------------------------------------------------
  72.   def page_row_max
  73.     # 窗口的高度,设置画面的高度减去 32 ,除以 1 行的高度 32
  74.     return 20
  75.   end
  76.   #--------------------------------------------------------------------------
  77.   # ● 获取 1 页可以显示的项目数
  78.   #--------------------------------------------------------------------------
  79.   def page_item_max
  80.     # 将行数 page_row_max 乘上列数 @column_max
  81.     return page_row_max * @column_max
  82.   end
  83.   #--------------------------------------------------------------------------
  84.   # ● 帮助窗口的设置
  85.   #     help_window : 新的帮助窗口
  86.   #--------------------------------------------------------------------------
  87.   def help_window=(help_window)
  88.     @help_window = help_window
  89.     # 刷新帮助文本 (update_help 定义了继承目标)
  90.     if self.active and @help_window != nil
  91.       update_help
  92.     end
  93.   end
  94.   #--------------------------------------------------------------------------
  95.   # ● 更新光标举行
  96.   #--------------------------------------------------------------------------
  97.   def update_cursor_rect
  98.     x0 = Z::PWx0 ; y0 = Z::PWy0 #坐标偏量
  99.     # 光标位置不满 0 的情况下
  100.     if @index < 0
  101.       self.cursor_rect.empty
  102.       return
  103.     end
  104.     # 获取当前的行
  105.     row = @index / @column_max
  106.     # 计算光标的宽
  107.     cursor_width = 9
  108.     if @index == 10000
  109.       x, y = self.width - 40, -3
  110.       self.cursor_rect.set(x-3, y, 10, 15)
  111.     else
  112.       x, y = 34, 29 + 254 + @index * 16     # 计算光标坐标
  113.       self.cursor_rect.set(x-3, y, cursor_width, 9)   # 更新国标矩形
  114.     end
  115.    
  116.   end
  117.   #---------------------------------------------------------------------------
  118.   def inside(x0,y0,x1,y1)
  119.     if (@mouse_x > x0) and (@mouse_y > y0) and (@mouse_x < x1) and (@mouse_y < y1)
  120.       return true
  121.     else
  122.       return false
  123.     end
  124.   end
  125.   #--------------------------------------------------------------------------
  126.   # ● 刷新画面
  127.   #--------------------------------------------------------------------------
  128.   def update
  129.     super
  130.     x = 22 ; y = 30
  131.     if self.active
  132.       if @item_max > 0   #鼠标刷新
  133.         @mouse_x, @mouse_y = Mouse.get_mouse_pos
  134.         tp_index = @index
  135.         mouse_not_in_rect = true
  136.         top_x = self.x + 43
  137.         top_y = self.y + 298
  138.         bottom_x = top_x + 13
  139.         bottom_y = top_y + 13
  140.         #----
  141.         for i in 0..3
  142.           if inside(top_x, top_y+16*i, bottom_x, bottom_y+16*i)
  143.             @index = i
  144.             mouse_not_in_rect = false
  145.             if tp_index != @index
  146.               tp_index = @index
  147.               @a = 0
  148.               $game_system.se_play($data_system.cursor_se)
  149.             end
  150.           end
  151.           if mouse_not_in_rect
  152.             @index = -1
  153.           end
  154.         end
  155.         #----
  156.         if inside(self.x + self.width - 32, self.y + 7, self.x + self.width - 16, self.y + 24)
  157.           @index = 10000
  158.           mouse_not_in_rect = false
  159.           if tp_index != @index
  160.             tp_index = @index
  161.             @a = 1
  162.             $game_system.se_play($data_system.cursor_se)
  163.           end
  164.           if mouse_not_in_rect
  165.             @index = -1
  166.           end
  167.         end
  168.         #----
  169.       end
  170.     end
  171.    
  172.     # 刷新帮助文本 (update_help 定义了继承目标)
  173.     if self.active and @help_window != nil
  174.       update_help
  175.     end
  176.     # 刷新光标矩形
  177.     update_cursor_rect
  178.   end
  179. end
复制代码


window_里面加上读取滚动条Y坐标的语句
  1.     if @item_max > 10
  2.       bitmap_gdt = RPG::Cache.picture("gundongtiao")
  3.       self.contents.blt(self.width - 42, 50+@lan1_y, bitmap_gdt, Rect.new(0, 0, 20, 100), 255)
  4.     end
复制代码


没什么花头的

其实这整个就是个大范例,WIN窗口层叠拖动效果,滚动条效果,物品拖动效果,快捷栏的实现。
要拿出来真不容易,MAP、WINDOW、SCENE、SELETEABLE都改光了
功能不全是有些SCENE还没改,现在给战斗搞的很疲惫,没心情搞这个了
作者: 訫﹎森    时间: 2008-6-5 18:58
很强大{/hx}``其实我也想要这个拖动窗口的效果```但``谁叫偶是脚本盲{/gg}




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