查看: 5105|回复: 26

[有事请教] 如何才能判定玩家鼠标右键是否长按

[复制链接]
梦石
0
星屑
25352
在线时间
1136 小时
注册时间
2019-3-5
回帖
1303
发表于 2020-4-8 23:29:20 | 显示全部楼层 |阅读模式

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

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

×
唯独找不到判断鼠标右键长按的脚本……

TouchInput.isTriggered()
  
  判断鼠标是否有左击
  
TouchInput._cancelled
  
  判断鼠标是否按下右键
   
Input.isTriggered('down')
  按钮单击判断
  
  括号里面的是按键的代号。
  up
  down
  right
  left
  pagedown
  pageup
  ok
  menu
梦石
0
星屑
3486
在线时间
294 小时
注册时间
2020-1-27
回帖
180
发表于 2020-4-9 00:06:52 | 显示全部楼层
本帖最后由 zths 于 2020-4-9 20:50 编辑

[pre lang="javascript"]
keys = [];
longPressTime = 1000;
mouseLpressd = false;
mouseRpressd = false;
mouseMpressd = false;
mouseLLongpressd = false;
mouseRLongpressd = false;
mouseMLongpressd = false;
function isKeyPressed(kc){
        if(typeof(kc) == "undefined"){
                return false
        }
        return keys[kc] > 0
}
function isKeyLongPressed(kc){
        if(typeof(kc) == "undefined"){
                return false
        }
        return keys[kc] > longPressTime
}
mouseLLongpressdT = 0;
mouseRLongpressdT = 0;
mouseMLongpressdT = 0;
if(typeof(handleWkd) === "undefined"){
    handleWkd = true
    window.addEventListener("keydown",function(ev) {
        keys[ev.keyCode] = 1;
    });
    window.addEventListener("keyup",function(ev) {
        keys[ev.keyCode] = undefined;
    });
    window.addEventListener("mousedown",function(ev) {
        if(ev.button === 0){
            mouseLpressd = true;
            mouseLLongpressd = false;
            mouseLLongpressdT = 0;
        }
        if(ev.button === 2){
            mouseRpressd = true;
            mouseRLongpressd = false;
            mouseRLongpressdT = 0;
        }
        if(ev.button === 1){
            mouseMpressd = true;
            mouseMLongpressd = false;
            mouseMLongpressdT = 0;
        }
    });
    window.addEventListener("mouseup",function(ev) {
        if(ev.button === 0){
            mouseLpressd = false;
            mouseLLongpressd = false;
            mouseLLongpressdT = 0;
        }
        if(ev.button === 2){
            mouseRpressd = false;
            mouseRLongpressd = false;
            mouseRLongpressdT = 0;
        }
        if(ev.button === 1){
            mouseMpressd = false;
            mouseMLongpressd = false;
            mouseMLongpressdT = 0;
        }
    });
}
if(typeof(handleWkdInv) !== "undefined"){
    clearInterval(handleWkdInv)
}
handleWkdInv = setInterval(function(){
    keys.forEach(function(v,i){
        if(v){
            keys+=longPressTime/3;
        }
    });
    if(mouseLpressd){mouseLLongpressdT+=longPressTime/3;mouseLLongpressd = (mouseLLongpressdT >= longPressTime) ? true : false;}
    if(mouseRpressd){mouseRLongpressdT+=longPressTime/3;mouseRLongpressd = (mouseRLongpressdT >= longPressTime) ? true : false;}
    if(mouseMpressd){mouseMLongpressdT+=longPressTime/3;mouseMLongpressd = (mouseMLongpressdT >= longPressTime) ? true : false;}
},longPressTime/3);[/pre]
没测试过。。原生js
大概就是上面的意思。。
实际用应该会报错。。
mouseLpressd//鼠标左键按下
mouseRpressd//鼠标右键按下
mouseMpressd//鼠标中键按下
mouseLLongpressd//鼠标左键长按
mouseRLongpressd //鼠标右键长按
mouseMLongpressd //鼠标中键长按
isKeyPressed(keycode) //键盘按键按下
isKeyLongPressed(keycode)//键盘按键长按
longPressTime = 1000;//长按阈值 毫秒

鼠标按下判断部分其实可以写好点。。冗余太多了。。。

点评

这我得单回复说。  发表于 2020-4-10 20:53
不是,我只是有些疑惑而已。  发表于 2020-4-10 20:50
我觉得问题出在后续判断上。TouchInput.isTriggered()就是单击(即使按住)后不会继续触发。  发表于 2020-4-10 20:48
( mouseLpressd && !mouseLLongpressd ) 就是 触发了按下,但没触发长按  发表于 2020-4-10 20:46
你使用的时候如果仅判断长按那就不用管短按 如果需要排除长按那就 mouseLpressd && !mouseLLongpressd  发表于 2020-4-10 20:45
回复

使用道具 举报

梦石
0
星屑
6515
在线时间
886 小时
注册时间
2018-1-16
回帖
136
发表于 2020-4-9 10:21:16 | 显示全部楼层

点评

单纯看描述的话,和我的需求不太兼容。他这个似乎是根据格子或者屏幕xy来确认点击的。  发表于 2020-4-9 13:03
回复

使用道具 举报

梦石
0
星屑
25352
在线时间
1136 小时
注册时间
2019-3-5
回帖
1303
 楼主| 发表于 2020-4-9 13:35:14 | 显示全部楼层
shantianzu 发表于 2020-4-9 10:21
这个你有没有用。https://rpg.blue/forum.php?mod=viewthread&tid=399598&extra=page%3D2%26filter%3Dtypei ...

测试完发现两点:
1.他这个插件判断点击的方法确实和事件坐标和屏幕坐标有关。而我想要的是能在屏幕任意地方长按右键进行判定。
2.它这个虽然描述有“长按鼠标右键”的判断方式,但我查看代码发现其实就是“单击”的判定。有点挂羊头卖狗肉的意思。而单击无法实现我想要的“按住按键进行蓄力攻击”。
回复

使用道具 举报

梦石
0
星屑
39236
在线时间
11155 小时
注册时间
2009-3-15
回帖
4768
发表于 2020-4-9 14:19:52 | 显示全部楼层
本帖最后由 soulsaga 于 2020-4-9 14:29 编辑

按下和长按..
不是一个意思吗..还是说长按会判断按下的时间达到一定值才符合?不过真这样的话时间判断就不合适了吧
只要判断右键持续按下有效达到指定的时间就可以了吧..
一般不都这样做的么
回复

使用道具 举报

梦石
0
星屑
25352
在线时间
1136 小时
注册时间
2019-3-5
回帖
1303
 楼主| 发表于 2020-4-9 15:05:32 | 显示全部楼层
本帖最后由 Zeldashu 于 2020-4-9 15:06 编辑
soulsaga 发表于 2020-4-9 14:19
按下和长按..
不是一个意思吗..还是说长按会判断按下的时间达到一定值才符合?不过真这样的话时间判断就不合 ...


长按的意思是按住的过程一直生效。比如说默认的分歧“按键【确认】正被按着”。这代表只要你按住确认键,分歧后面的内容就会一直被触发。

简单来说,目前我做出来的效果就是:只要玩家按住按键,变量1就会一直被增加。而这个过程的判断是依靠并行处理的,所以当玩家松开按键时,分歧自然变为了false的内容。这样就实现了一个蓄力攻击的效果。

现在的问题就是似乎没有针对鼠标右键长按的脚本。只有右键单击的。
回复

使用道具 举报

梦石
0
星屑
39236
在线时间
11155 小时
注册时间
2009-3-15
回帖
4768
发表于 2020-4-9 15:09:16 | 显示全部楼层
本帖最后由 soulsaga 于 2020-4-9 15:10 编辑
Zeldashu 发表于 2020-4-9 15:05
长按的意思是按住的过程一直生效。比如说默认的分歧“按键【确认】正被按着”。这代表只要你按住确认键, ...

TouchInput._cancelled
  
  判断鼠标是否按下右键
不是有按下吗..按下不是指右键被按下中的状态吗..
应该会和单击不同

这个按下不是和默认的分岐按键正被按着时一样吗
回复

使用道具 举报

梦石
0
星屑
25352
在线时间
1136 小时
注册时间
2019-3-5
回帖
1303
 楼主| 发表于 2020-4-9 16:10:34 | 显示全部楼层
soulsaga 发表于 2020-4-9 15:09
TouchInput._cancelled
  
  判断鼠标是否按下右键

哦。你说的是我写的注释啊。

是这样的,我有一个习惯就是把一些脚本记在小本本上,然后为了自己方便回忆会写上自己的注释。
一楼里的注释就是为了方便我自己理解写的,要是严谨些描述的话,内容应该是:【判断鼠标是否单机右键】

也就是说TouchInput._cancelled只会判定一次右键单击。无法实现长按一直触发。
回复

使用道具 举报

梦石
0
星屑
3486
在线时间
294 小时
注册时间
2020-1-27
回帖
180
发表于 2020-4-10 21:00:43 | 显示全部楼层
本帖最后由 zths 于 2020-4-10 21:37 编辑

[pre lang="javascript"]/**
* Checks whether a key is just pressed.
*
* @static
* @method isTriggered
* @param {String} keyName The mapped name of the key
* @return {Boolean} True if the key is triggered
*/
Input.isTriggered = function(keyName) {
    if (this._isEscapeCompatible(keyName) && this.isTriggered('escape')) {
        return true;
    } else {
        return this._latestButton === keyName && this._pressedTime === 0;
    }
};[/pre]
上面是游戏的 isTriggered  逻辑
可以看到 他是 取得最后一个按下的键,并且是该帧按下的。才会返回 true...

所以他叫 isTriggered , 表达的意思是 在该帧被触发了.

我写的是浏览器原生方法,不需要 mv 核心的参与..
实现是判断被下的时间大于(所需值)....
如果需要修改为和他一样的实现的的话. 需要把 setInterval 的 func hook 至 图形更新方法下面。。
然后判断的时候把 大于 改为 等于 就可以了。。。(时间处理部分也需要修改成帧计数)

[pre lang="javascript"]/**
* Checks whether a key is currently pressed down.
*
* @static
* @method isPressed
* @param {String} keyName The mapped name of the key
* @return {Boolean} True if the key is pressed
*/
Input.isPressed = function(keyName) {
    if (this._isEscapeCompatible(keyName) && this.isPressed('escape')) {
        return true;
    } else {
        return !!this._currentState[keyName];
    }
};[/pre]

我审题有点问题。因为我实现的是 isPressed...

顺便
[pre lang="javascript"]/**
* Checks whether a key is kept depressed.
*
* @static
* @method isLongPressed
* @param {String} keyName The mapped name of the key
* @return {Boolean} True if the key is long-pressed
*/
Input.isLongPressed = function(keyName) {
    if (this._isEscapeCompatible(keyName) && this.isLongPressed('escape')) {
        return true;
    } else {
        return (this._latestButton === keyName &&
                this._pressedTime >= this.keyRepeatWait);
    }
};[/pre]
对着这个逻辑改改你就能得到你所有想要的了。。。

点评

非常感谢!学到不少东西  发表于 2020-4-10 21:45
回复

使用道具 举报

梦石
0
星屑
1518
在线时间
167 小时
注册时间
2025-2-15
回帖
67
发表于 2025-4-9 00:20:13 | 显示全部楼层
挖坟。
https://developer.rpgmakerweb.com/rpg-maker-mz/Input.html这里的下面这几个不知道可不可以。
就是判断TouchInput.isCancelled()这个按下的时候,有没有弹起或者是重复的间隔和重复的等待时间。
我不知道,我是来这里抄TouchInput.isCancelled()这个脚本的。

Input.gamepadMapper 对象 静态的
要从游戏手柄按钮转换为映射键名称的哈希表。

Input.keyMapper 对象 静态的
一个哈希表,用于将虚拟密钥代码转换为映射的密钥名称。

Input.keyRepeatInterval 数字 静态的
关键帧重复的间隔(以帧为单位)。

Input.keyRepeatWait 数字 静态的
关键帧重复的等待时间(以帧为单位)。
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部