Project1

标题: 【更新x2】鼠标优化及按钮v0.9 [打印本页]

作者: 一箭烂YiJL    时间: 2011-2-26 14:11
标题: 【更新x2】鼠标优化及按钮v0.9
本帖最后由 一箭烂YiJL 于 2011-5-15 17:11 编辑

版本前言:
这次更新是和DK的Phantom有关。
具体就是完成了Mouse.clip(x, y, width, height),
改写REG的.init,两个合并了,还有舍弃了class << Mouse用于alias update......
详细自己看工程。
几乎什么都搞定,只是那个Roll_Spriteset不愿搞了= =。

先是预览:
[attach]48673[/attach]

然后关于仿真按钮
[attach]48674[/attach]

其实这样的,仿真按钮源文件:
[attach]48675[/attach]

工程(包括锁匙.rgek):
[attach]56398[/attach]

之后就是手册(直接拿了工程的来):
  1. #==============================================================================
  2. # ■ 鼠标优化   by 一箭烂
  3. #------------------------------------------------------------------------------
  4. #   为鼠标作强化及美化的工作。
  5. #------------------------------------------------------------------------------
  6. # 使用说明:
  7. #
  8. #   强化部分使用:
  9. #
  10. #     key:
  11. #       (左键 Mouse::Left)   (右键 Mouse::Right)   (中键 Mouse::Middle)
  12. #
  13. #     Mouse.x = / Mouse.y =
  14. #       修改x坐标 / 修改y坐标
  15. #
  16. #     Mouse.area?(rect)
  17. #       判断鼠标是否在参数rect范围内
  18. #
  19. #     Mouse.up?(key)
  20. #       鼠标按键是否处在"松开"的瞬间,不输入参数,表示任意鼠标键
  21. #
  22. #     Mouse.down?(key)
  23. #       鼠标按键是否处在"按下"的瞬间,不输入参数,表示任意鼠标键
  24. #
  25. #     Mouse.click?(key)
  26. #       鼠标按键单击,按下再弹上
  27. #
  28. #     Mouse.double_click?(key)
  29. #       鼠标按键双击
  30. #
  31. #     Mouse.press?(key)
  32. #       鼠标按键是否处在"按下"的状态
  33. #
  34. #     Mouse.scroll
  35. #       返回鼠标滚轮的滚动值.1表示向前,-1表示向后,0表示未发生滚动
  36. #
  37. #     Mouse.move?(frame)
  38. #       返回鼠标某帧内的平均移动速度数字,不输入参数,表示判断是否移动(true/false)
  39. #
  40. #     Mouse.clip(x, y, width, height)
  41. #       锁死鼠标在指定区域范围内,省略参数时解除锁定
  42. #       (现在已经做好了)
  43. #
  44. #   美化部分使用:
  45. #
  46. #     Mouse.cursor([name, x, y, width, height, no, time])
  47. #       修改鼠标参数,对照表:
  48. #        - name        =>   鼠标档名
  49. #        - x           =>   按下位置x坐标
  50. #        - y           =>   按下位置y坐标
  51. #        - width       =>   每鼠标长度
  52. #        - height      =>   每鼠标高度
  53. #        - no          =>   动态鼠标数量
  54. #        - time        =>   动态时间(帧)
  55. #
  56. #     Mouse.Aft_Img = true/false
  57. #        残影模式:开启/关闭
  58. #
  59. #     Mouse.Aft_Img_chage
  60. #        残影模式:更变
  61. #
  62. #==============================================================================
  63. #==============================================================================
  64. # ■ (鼠标)按钮   by 一箭烂
  65. #------------------------------------------------------------------------------
  66. # 使用说明:
  67. #
  68. #   类方法:
  69. #
  70. #     Button.new(image[,x , y])
  71. #       image   : 处于Image\Button\下的文件名字
  72. #       x       : x坐标
  73. #       y       : y坐标
  74. #
  75. #   属性  :
  76. #
  77. #     function  : 方法,例如:"p 'string'"
  78. #
  79. #     其余的参数与对应的Mouse方法一样
  80. #
  81. #     set_click(key, function)
  82. #     set_double_click(key, function)
  83. #     set_double_down(key, function)
  84. #     set_scroll(key, function)
  85. #     set_area(function)
  86. #
  87. #     * 这两个属性谨Button类拥有
  88. #     set_move_out(function, speed, time)
  89. #       移出当范围时返回true
  90. #       speed:返回true的速度条件   time:平均移动速度的时间(帧),默认为5
  91. #
  92. #     set_press_out(key, function, speed, time)
  93. #       拖出当范围时返回true       key:默认为左键
  94. #       speed:返回true的速度条件   time:平均移动速度的时间(帧),默认为5
  95. #
  96. #     其余属性与Sprite一样
  97. #
  98. #==============================================================================
复制代码

作者: david50407    时间: 2011-2-26 19:50
很NICE~  
作者: 一箭烂YiJL    时间: 2011-2-26 20:07
回复 david50407 的帖子

咱感动~
Davy是DK叫的。move_out和press_out(移离和拖离)没开放的原因是:
1.使用move_out和press_out时才开始判断
2.使用实例变量/开关判断,在Mouse的update里无法更新(rect太多可能性的缘故)
3.正因为是实例变量的关系,所以不能判断多于一个范围
虽然还勉强能用于一个范围,可是还是不建议使用。

而关于clip非常粗糙的原因是:
1.因为懒的关系,没有判断窗口外也弄鼠标回来
2.做法为直接控制坐标= =(所以做得好要dll)

关于移离和拖离,david(前辈)可否提出解决办法?
顺便还有要期待一下RGE核心2.0
(的强大功能及Mouse.clip、Mouse.move_out和Mouse.press_out)
顺便给2.0的意见,发现1.01的bitmap是没有blur和射线模糊,对于写出发光字、背景等等比较困难。
作者: david50407    时间: 2011-2-26 21:19
移离跟脱离是一样的
你可以尝试记录前几步的pos
做计算(就像你写残影一样)

或者是移到 Button 之类的控件
由他来update就不用烦恼Mouse的部分了
作者: 一箭烂YiJL    时间: 2011-2-26 22:03
回复 david50407 的帖子

残影是update把当前坐标弄Sprite。速度是update里记录(100帧内的)pos然后计算平均速度。
如果用第一个方法有几个要注意:
1.还要记录press时候的坐标
2.还有要跟移动记录同一时间,也就是需要判断时略过空的数组内容
3.要判断press时候坐标和移动记录的匹配(好高的思维操作,暂时想不到怎么判断)
4.判断移离和拖离时开始记录press坐标?如果不是,随时之前做过的,现在马上return true了

如果采用方法二,的确是没什么可以担忧的,
但是Mouse就少了两个功能了。(不过其实Button类是没什么东西的,
目前主要功能是设置指令,把""去掉为一个指令执行)

如果从Mouse下手就尽量不要改变实例变量了,唯一方法就像第一个方法一样。

之后更大挑战的是以Roll_Spriteset(可滚动的类窗口)来管理Button类,
还有就是用鼠标挪移滚轮块和鼠标滚轮达到同比例滚上下。
作者: DeathKing    时间: 2011-2-28 22:37
我也不能评价太多了……{:nm_9:}
因为自己这方面也没有做出啥贡献{:nm_7:}
大概……大概是我太懒了吧{:nm_6:}
作者: 一箭烂YiJL    时间: 2011-3-2 22:11
仪式上顶一下。

1.如果Roll_Spriteset是在类中的数组变量管理,外界push后会有两个Sprite。
2.如果Roll_Spriteset只是负责管理xy坐标,那么怎么上层控制?
或者用1.然后可以用"."的实力变量为数组控制,如:
a = Roll_Spriteset.new
a.Sprite_Array = [Button.new(arg)]
a.Sprite_Array[0].set_click(arg)
然而这样很麻烦...
作者: david50407    时间: 2011-3-2 23:25
学一下Viewport与Sprite的关系
  1. class Rollable
  2. ...
  3. end

  4. class Button < Rollable
  5. ...
  6. end
复制代码
然后Button#new(Roll_Spriteset)时自动向Roll_Spriteset注册
Roll_Spriteset记录并在Roll_Spriteset#Update时check stauts
set_click就还是由Button提供
作者: 一箭烂YiJL    时间: 2011-5-15 17:12
因为更新,所以顶上来,不过也没有人用的了,
这次更新主要是为了DK的Phantom需要加入。
作者: 1370528656    时间: 2011-11-26 22:03
很不错的说!顶!
作者: 认真的学    时间: 2012-6-28 11:22
在刷新的时候Mouse.area?的判断没有考虑按钮是否有viewport。
这样获得的是相对坐标,判断的却是整个窗口的坐标。
所以得加上对viewport的判断,把相对坐标变成整个窗口的坐标。
作者: summer92    时间: 2013-1-29 08:50
能不能回复




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