Project1

标题: 鼠标响应图片菜单时不触发自动寻径 [打印本页]

作者: 奶油Da蛋糕    时间: 2009-8-5 16:41
标题: 鼠标响应图片菜单时不触发自动寻径
本帖最后由 奶油Da蛋糕 于 2009-8-8 12:50 编辑


做了一个纯鼠标的菜单。
把原来的X的菜单删掉了。
基本上兼容的问题差不多解决了。
但是还有两个问题。
这个菜单有三态效果哟,美观度还是挺好的。
这个菜单就是用简单的鼠标响应事件做的。
就是键盘的update里面判定鼠标位置和鼠标是否按下而已。
但是我发现一个问题。
就是点了这个菜单之后。
鼠标仍然会触发自动寻径。
这样很麻烦。
明明点的是菜单。
但是角色却会往那边跑。
我想过把这几个有鼠标响应图片的坐标排除出去。这样就不会触发自动寻径了。
但是。
如果这样的话。
在图片菜单不显示的时候也不会触发自动寻径了。
(因为有的时候禁止菜单呀,还有主角没有选择的时候,右上角和右下角的菜单都会不显示。)
有什么办法可以只在图片显示的时候把自动寻径DEL掉呢?

另外。
还有一个比较严重。
但是偶然性比较大的问题。
就是。
如果你鼠标点的次数多。
移动的快了的话。
游戏可能会发生意外。
(可能是反复判定那么多图片菜单的问题)
导致可能会在游戏中随机出现
(多数是鼠标忙的情况下)
不过几率比较大,基本上5分钟内必出。
没法儿玩。

---------------------------
梦想逍遥游
---------------------------
脚本 '完整鼠标系统(四方向)' 的 39 行 发生了 NoMethodError。

undefined method `size' for nil:NilClass
---------------------------
确定   
---------------------------
  1. #--------------------------------------------------------------------------
  2.   # ● 检查鼠标处是否有自定义的事件并返回类型
  3.   #--------------------------------------------------------------------------
  4.   def check_event_custom(mouse_x, mouse_y)
  5.     for event in $game_map.events.values #循环所有事件检查
  6.       event_width = RPG::Cache.character(event.character_name,event.character_hue).width / 4
  7.       event_height = RPG::Cache.character(event.character_name,event.character_hue).height / 4
  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.         for i in 0...event.list.size
  10.           if event.list[i].parameters[0] == "Item" #类型判断
  11.             event.flag = 1
  12.           elsif event.list[i].parameters[0] == "Npc" #类型判断
  13.             event.flag = 2
  14.           else
  15.             event.flag = 0 if $game_player.get_mouse_sta != 2 #无标志
  16.           end
  17.           return event.flag #返回事件类型标志
  18.         end
  19.       end
  20.     end
  21.     return 0 if $game_player.get_mouse_sta != 2 #如果不是在跟随鼠标状态,则返回无标志
  22.     return $mouse_icon_id #使鼠标图不变化
  23.   end
复制代码
SIZE没理由会nil啊。
怎么回事

奇怪。
奇怪。
奇怪。
作者: IamI    时间: 2009-8-5 17:01
Scene_Map的update内刷新窗口以前写入
假设你的窗口叫做@command_window
x,y = Mouse.get_mouse_pos(或类似的名字)
if x > @command_window.x and x < @command_window.x + @command_window.width and y > @command_window.y and y < @command_window.y + @command_window.height (断行自己去掉回车)
Mouse.lock(或类似名字)
else
Mouse.unlock(或类似名字)
end

作者: 君少    时间: 2009-8-5 17:02
游戏很华丽
作者: veal    时间: 2009-8-5 17:06
我想过把这几个有鼠标响应图片的坐标排除出去。这样就不会触发自动寻径了。
但是。
如果这样的话。
在图片菜单不显示的时候也不会触发自动寻径了。
(因为有的时候禁止菜单呀,还有主角没有选择的时候,右上角和右下角的菜单都会不显示。)
有什么办法可以只在图片显示的时候把自动寻径DEL掉呢?
既然能把坐标排除出去,就也能判断现在是否已经禁用菜单,只有在菜单可用的时候才排除某些坐标

至于第二个,你有用什么人物跟随脚本吗?
作者: 奶油Da蛋糕    时间: 2009-8-5 17:15
既然能把坐标排除出去,就也能判断现在是否已经禁用菜单,只有在菜单可用的时候才排除某些坐标

至于第二个,你有用什么人物跟随脚本吗?
veal 发表于 2009-8-5 17:06


呃,那个只是“我想”罢了。实践起来还是很混沌。只是把自己的想法和需要注意的事情告诉一下而已。( = =因为其实我是只脚本盲!)
关于人物跟随脚本,我不太明白是什么诶。
貌似没用哟。
不过在上个月有打算用,一直没时间用。
作者: 奶油Da蛋糕    时间: 2009-8-5 18:43
Scene_Map的update内刷新窗口以前写入
假设你的窗口叫做@command_window
IamI 发表于 2009-8-5 17:01


X坐标是nil

和解???
作者: 咳嗽的夜鸟    时间: 2009-8-6 10:08
提示: 作者被禁止或删除 内容自动屏蔽
作者: 咳嗽的夜鸟    时间: 2009-8-6 10:13
提示: 作者被禁止或删除 内容自动屏蔽
作者: 奶油Da蛋糕    时间: 2009-8-6 10:40
第一个问题解决思路:
先定义一个变量:attr_accessor :menu_showing
在你的鼠标菜单中写一个@menu_showing的函数,打开菜单时是true,否则为false
在你的鼠标update里面判断他$xxxx.menu_showing为true时就return ...
咳嗽的夜鸟 发表于 2009-8-6 10:08


这个思路不能理解。
请宽恕我只是脚本盲。
第二个问题已经解决了。
在for i in 0...event.list.size前面加了条件分歧if event.list.size != nil
作者: 奶油Da蛋糕    时间: 2009-8-6 15:05
自顶一次
作者: 奶油Da蛋糕    时间: 2009-8-6 18:52
自顶两次
作者: redant    时间: 2009-8-6 21:10
if trg_x != $game_player.x or trg_y != $game_player.y #若目标不为自身则开始寻路
            if trg_x < 11 or trg_y <=12
             find_path = Find_Path.new
             @paths = find_path.find_player_short_path(trg_x, trg_y, @mtp_x, @mtp_y)
             end
           end

好像还差不太多

Scene_Mouse 593行左右
iam 那个方法 菜单好像就屏蔽 不管用了= =

这个每改一个数字 就是屏幕32 像素
作者: 奶油Da蛋糕    时间: 2009-8-7 10:23
if trg_x != $game_player.x or trg_y != $game_player.y #若目标不为自身则开始寻路
            if trg_x < 11 or trg_y
redant 发表于 2009-8-6 21:10

if trg_x < 11 or trg_y <=12
所表示的屏蔽的坐标为11*32=352 12*32=384。也就是鼠标的所在X小于352,Y小于或等于384的地方才能实现自动寻径。否则不能自动寻径吗?
为何使用后我无论点哪里。每个角落都点遍了,还是没有自动寻径??
作者: azuredam    时间: 2009-8-7 10:51
提示: 作者被禁止或删除 内容自动屏蔽
作者: 奶油Da蛋糕    时间: 2009-8-7 11:11
http://rpg.blue/viewthread.php?tid=116771&highlight=%E4%BA%8B%E4%BB%B6%2B%E7%8E%84%E6%9C%88
详情请参考某人第一个教程 = =
另外注意看最后的补充说明,前面基本作废
只要地图不刷新的话,就算你输入再多 ...
azuredam 发表于 2009-8-7 10:51


对不起,可能是标题误导了你吧。
这个菜单不是用事件做的。
是在SCENE_MAP里面用简单的方法显示图片。然后UPDATA里面鼠标判定图片做出来的菜单。
你那个貌似跟我这个无关的。
貌似我没看出什么关联。
作者: 奶油Da蛋糕    时间: 2009-8-7 16:57
自顶三次
作者: 奶油Da蛋糕    时间: 2009-8-7 19:59
if trg_x != $game_player.x or trg_y != $game_player.y #若目标不为自身则开始寻路
            if trg_x < 11 or trg_y
redant 发表于 2009-8-6 21:10



我知道为什么搬回我的游戏里就点哪里都不能生效了。
您写的是屏蔽的图块而不是屏幕坐标。
也就是把那几个地图图块屏蔽不能自动寻径。
但是当地图比较大的时候。
(比如您可以把原工程的地图换成2倍的宽和高)
初始点不同的时候。
点的位置就不同了。
我那游戏刚好整块屏幕都在屏幕范围内。
因为那个图块都超过了11格。
只有在最左上角的11格以内才可以自动寻径。

明白我的意思了吗?
所以这个方法行不通。
不能光屏蔽图块,
而是要屏蔽屏幕的具体坐标。
作者: 99儿时路    时间: 2009-8-7 22:18
提示: 作者被禁止或删除 内容自动屏蔽
作者: 后知后觉    时间: 2009-8-7 22:30
本帖最后由 后知后觉 于 2009-8-7 22:46 编辑

鼠标脚本我还没看过
思路就是 点击左键在地图上为走路
那你就在Scene_Map里搜索对鼠标左键按下的判断
不管你是点菜单还是点地面 最初的都是要先点 鼠标左键 这是大前提
只要找到这个判断的地方
再找到设置移动的地方  move_to之类的句子 又或者是自动寻路的方法
对这些东西进行鼠标当前坐标的判断就行了- -
现在没空看脚本- -

如果你实在是看不懂哪一行是设置移动的语句的话
有一个比较恶劣的招
把你自己写的判断鼠标左键被按下的内容和
默认的鼠标左键被按下的判断的内容融合
但是一定要把你写的内容放在最上面
在切换$scene的下面加一行 return
这样就是当鼠标左键被按下的时候
首先判断的就是你自己的坐标范围响应菜单的东西
如果条件成立 这个时候就会对$scene进行改变
改变了这个$scene之后立即用return结束这个方法
这样就拦截了鼠标被按下左键的信息
也就不会再执行后面的东西了
而且这样只有在改变了$scene之后才会拦截
意思就是说你要把自己的内容先进行是否可见的判断
在可见的情况下再进行坐标范围的判断
这样子在这些东西不可见的时候 按那个地方左键也可以正常行走
作者: 奶油Da蛋糕    时间: 2009-8-8 12:49
感谢后知后觉的提示。
已经成功解决了,其实也挺简单的嘛,哈哈,只要找到了合适的地方。




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