Project1

标题: 如何让图片始终指向鼠标位置的问题 [打印本页]

作者: yanzhllwc    时间: 2019-12-25 14:04
标题: 如何让图片始终指向鼠标位置的问题
我想做一个ARPG小游戏,在玩家身上有一张指针的图片始终指向鼠标的方向,但是这个问题困扰了我很久,用了Drill_up大佬翻译与制作的插件,我知道可以让图片一直跟随在玩家身上,也知道了使用脚本可以让图片旋转到某个角度,
但是实在想不出如何获得鼠标位置xy,并让图片的旋转角度和鼠标xy相关联,所以想求助一下大家,看看有什么办法、、
作者: Zeldashu    时间: 2019-12-25 14:38
好问题,等一个数学大佬。如果是以画面中心为原点建立直角坐标系,感觉判断角度应该还是挺简单的。
问题是如何获取鼠标当前位置的坐标,我只知道一个脚本在鼠标点击时获取其xy。
作者: yanzhllwc    时间: 2019-12-25 15:11
看到一个插件是这么写的,但是我不明白是什么意思
/*:
* @plugindesc マウス座標取得用プラグイン
* マウスの座標を取得するためのプラグインです。
* @author Kiyohara
* @help
*/


(function() {
    'use strict';
    var _TouchInput__onMouseMove = TouchInput._onMouseMove;
    TouchInput._onMouseMove = function(event) {
        _TouchInput__onMouseMove.apply(this, arguments);
        this.mouseX = Graphics.pageToCanvasX(event.pageX);
        this.mouseY = Graphics.pageToCanvasY(event.pageY);
    };
})();
作者: 白嫩白嫩的    时间: 2019-12-25 16:19
题主说已解决,未实验,可以试试

关于获取鼠标当前坐标的交流讨论
作者: 芯☆淡茹水    时间: 2019-12-25 16:38
本帖最后由 芯☆淡茹水 于 2019-12-25 16:41 编辑

默认鼠标是有点击才更新坐标,你首先需要加 实时坐标 。
你把默认的坐标改为实时的也可以。


然后是 已知两点求角度 ,这个在我以前的帖子里有问过并且解决了。
作者: yanzhllwc    时间: 2019-12-25 16:52
白嫩白嫩的 发表于 2019-12-25 16:19
题主说已解决,未实验,可以试试

关于获取鼠标当前坐标的交流讨论

是一些关于获取实时鼠标的主题,谢谢
作者: yanzhllwc    时间: 2019-12-25 16:54
本帖最后由 yanzhllwc 于 2019-12-25 17:00 编辑
芯☆淡茹水 发表于 2019-12-25 16:38
默认鼠标是有点击才更新坐标,你首先需要加 实时坐标 。
你把默认的坐标改为实时的也可以。


再冒昧问一下,请问要加 实时坐标 ,是在哪个文件里加入呢?直接做一个.JS放进插件里吗?实在不懂程序,抱歉、、
作者: yanzhllwc    时间: 2019-12-25 17:32
yanzhllwc 发表于 2019-12-25 16:54
再冒昧问一下,请问要加 实时坐标 ,是在哪个文件里加入呢?直接做一个.JS放进插件里吗?实在不懂程序, ...

好,不管怎样,真的感谢大佬解答,晚点去试试
作者: 白嫩白嫩的    时间: 2019-12-25 17:59
本帖最后由 白嫩白嫩的 于 2019-12-25 18:31 编辑
yanzhllwc 发表于 2019-12-25 16:52
是一些关于获取实时鼠标的主题,谢谢


不客气,嘻嘻
作者: yanzhllwc    时间: 2019-12-25 18:15
本帖最后由 yanzhllwc 于 2019-12-25 18:18 编辑
白嫩白嫩的 发表于 2019-12-25 17:59
你认真看了没 就谢谢

第一个帖子写的就是不点击的实时坐标


我在一起结合着看啊,我不能等我看后全部理解消化完再来和你说谢谢吧,那要等什么时候去了,我觉得先谢过再看不是什么失礼的举动吧、、、、、
大佬理解过了,我真的是先大致看了一下是说获取实时鼠标的主题,觉得很有用,马上来说谢谢的,没有别的意思
作者: 白嫩白嫩的    时间: 2019-12-25 18:30
yanzhllwc 发表于 2019-12-25 18:15
我在一起结合着看啊,我不能等我看后全部理解消化完再来和你说谢谢吧,那要等什么时候去了,我觉得先谢过 ...

我晕,是我理解错了,我以为【你说要的是实时鼠标坐标,而我给的不是】

我错了,可能最近打lol经常跟人对喷,我整个人都敏感暴躁了
作者: yanzhllwc    时间: 2019-12-25 18:59
白嫩白嫩的 发表于 2019-12-25 18:30
我晕,是我理解错了,我以为【你说要的是实时鼠标坐标,而我给的不是】

我错了,可能最近打lol经常跟人 ...

没有没有,经常看到大佬帮助别人解决问题,我是个美术,只能看懂大佬们写的if是如果,var是定义临时变量,之后其他什么的就只能半猜半蒙去理解,怕你误会我是想等你帮我什么都弄好,我就直接用而生气赶快解释一下
作者: 白嫩白嫩的    时间: 2019-12-25 20:31
yanzhllwc 发表于 2019-12-25 18:59
没有没有,经常看到大佬帮助别人解决问题,我是个美术,只能看懂大佬们写的if是如果,var是定义临时变量 ...

为了表示歉意,再给你抛砖引玉一个
人物朝向鼠标
作者: wabcmcc    时间: 2019-12-27 15:37
Mog有整套插件RMV – Chrono Engine
單條插件工具(回力鏢,鏈子槍......)網址
插件TsumioActions.js
示例項目示例項目

作者: yanzhllwc    时间: 2019-12-28 01:01
本帖最后由 yanzhllwc 于 2019-12-28 01:02 编辑
wabcmcc 发表于 2019-12-27 15:37
Mog有整套插件RMV – Chrono Engine
單條插件工具(回力鏢,鏈子槍......)網址
插件TsumioActions.js


厉害了,哈哈哈,谢谢啦,我现在使用着另一个ABS的插件,我都不知道原来还有这么多这样的插件,现在基本的功能还是能做的,现在就是卡在这里,试了很久,小白的我根本不懂JS的书写规则,看大佬写的很多函数不知道是怎么调用的,应该是自己定义的,可是自己又不懂怎么改才能引用到游戏里,苦手、、哈哈
作者: 白嫩白嫩的    时间: 2019-12-28 08:12
本帖最后由 白嫩白嫩的 于 2019-12-28 08:56 编辑
yanzhllwc 发表于 2019-12-28 01:01
厉害了,哈哈哈,谢谢啦,我现在使用着另一个ABS的插件,我都不知道原来还有这么多这样的插件,现在基本 ...


14楼大神提起了mog,让我想起了指南针插件,通过这个插件再加上鼠标变量估计可以做成指向鼠标的小玩意,待我一会儿试试

不行,指南针只能指向事件id,指南针指针和表盘位置也是固定坐标,算了。。。
作者: yanzhllwc    时间: 2019-12-29 00:26
白嫩白嫩的 发表于 2019-12-28 08:12
14楼大神提起了mog,让我想起了指南针插件,通过这个插件再加上鼠标变量估计可以做成指向鼠标的小玩意, ...


是呢,一开始我也是这么想的,我先把指南针固定在屏幕中间,但是角色到达地图边缘时就不匹配了,事件跟随鼠标倒是应该可以的,但效果估计差点,因为之前试过让事件跟随玩家,反响不行,因为玩家是像素移动,而那个事件是按格子跟随,匹配不上、、、、
作者: yanzhllwc    时间: 2019-12-29 02:49
本帖最后由 yanzhllwc 于 2019-12-29 02:59 编辑

由于不会程序,所以尝试了很多写法,总之是不成功,最后决定把里面的内容简单化,写成了下面的样子:

(function () {
       
        var _TouchInput__onMouseMove = TouchInput._onMouseMove;
    TouchInput._onMouseMove = function(event) {
        _TouchInput__onMouseMove.apply(this, arguments);
        this.mouseX = Graphics.pageToCanvasX(event.pageX);
        this.mouseY = Graphics.pageToCanvasY(event.pageY);
    };
       
        var px = $gamePlayer._realX;
        var py = $gamePlayer._realY;
        var mx = TouchInput.mouseX;
        var my = TouchInput.mouseY;
        var targetShuttle = 0;
       
        if(px <= mx) {
                if (py >= my) {
                        targetShuttle = 45;
                } else {
                        targetShuttle = 135;
                }
        } else {
                if (py >= my) {
                        targetShuttle = 315;
                } else {
                        targetShuttle = 225;
                }
        };
       
        $gameScreen.picture(5)._angle = targetShuttle;
       
})();

存了一个js放在了插件目录并在游戏中开启,自我感觉是先定义了鼠标的移动时XY坐标,之后用px,py,mx,my分别代表玩家XY坐标和鼠标XY坐标,引用 芯☆淡茹水 大佬的区域判断,让那个5号图片的角度值呈现45,135,225,315的变化,可是这样都不成功,那张图片完全没有变化、、不知道有没有大佬能帮我看看是什么小白问题导致了不成功、、、、、
作者: 在野月光族    时间: 2019-12-31 01:38
瞎猜一下,可能是长这样子的。

作者: play337    时间: 2019-12-31 17:05
下面這個官方插件 可以做到 月光大的功能
不過 他只可以 4個方向轉而已
就是無法像 下面這兩個一樣 可以 全方向.... 而且跟很多插件衝突....

01.本來找到GLV的MV Map Projectiles,但是相當難設定..
https://galvs-scripts.com/2016/09/13/mv-map-projectiles/

02. 日本人做的這個 看起來很厲害...不過也是很難設定
https://tm.lucky-duet.com/viewtopic.php?t=7121
https://game.nicovideo.jp/atsumaru/games/gm9334

-----------------------------------
//=============================================================================
// PlayerPointerTurn.js
// ----------------------------------------------------------------------------
// Copyright (c) 2015 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.1.0 2018/02/10 PD_8DirDash.js?券€????游????孵??怠紋敹????賬?餈賢??????
// 1.0.0 2016/02/23 ??
// ----------------------------------------------------------------------------
// [Blog]   : https://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================

/*:
* @plugindesc ??喋餈質楚??啜??
* @author ??U?喋??
*
* @help 蝘餃??航?芸???扎?潦?
* ??嫘??扎?踴?嫘????整???
*
* ???啜?喋?胯??押?扎?喋??喋??胯??????
*
* ?拍閬?嚗?
*  雿€?⊥?扳憭€?????賬??典耦?????8蝳?函?嚗?
*  ?怒??????整??€?
*  ???啜?喋??????扼???
*/
(function() {

    var isExistPlugin = function(pluginName) {
        return PluginManager._parameters.hasOwnProperty([pluginName.toLowerCase()]);
    };

    //=============================================================================
    // Game_Player
    //  ??喋?格????
    //=============================================================================
    var _Game_Player_moveByInput      = Game_Player.prototype.moveByInput;
    Game_Player.prototype.moveByInput = function() {
        if (!this.isMoving() && this.canMove() && TouchInput.isMoved()) {
            this.turnToPointer();
        }
        _Game_Player_moveByInput.apply(this, arguments);
    };

    Game_Player._8dirTable = [6, 9, 8, 7, 4, 1, 2, 3, 6];
    Game_Player.prototype.turnToPointer = function() {
        var tx = TouchInput.x, ty = TouchInput.y, sx = this.screenX(), sy = this.screenY();
        var dir;
        if (isExistPlugin('PD_8DirDash') && this._characterName.indexOf('Q') !== -1) {
            var degree = (Math.atan2(ty - sy, -(tx - sx)) / Math.PI + 1) / 2 * 8;
            dir        = Game_Player._8dirTable[Math.round(degree)];
        } else {
            dir = Math.abs(tx - sx) > Math.abs(ty - sy) ? (tx > sx ? 6 : 4) : (ty > sy ? 2 : 8);
        }
        this.setDirection(dir);
    };

    //=============================================================================
    // TouchInput
    //  ??喋?桐?蝵柴?撣詻閮
    //=============================================================================
    TouchInput._onMouseMove = function(event) {
        var x = Graphics.pageToCanvasX(event.pageX);
        var y = Graphics.pageToCanvasY(event.pageY);
        this._onMove(x, y);
    };
})();

作者: yanzhllwc    时间: 2020-1-1 21:13
哇~谢谢各位大大了!容我研究一下下!!
作者: yanzhllwc    时间: 2020-1-1 21:21
在野月光族 发表于 2019-12-31 01:38
瞎猜一下,可能是长这样子的。

月光大大,其实我自己发的18楼那个代码就是全部了,并没有上下文、、、不知道是哪里错了,大大提到的rotation值,请问是什么呢?
作者: yanzhllwc    时间: 2020-1-1 21:46
现在是这样的状态,我只能用事件来做,代码不会用,其实是8方向的箭头,由于那个像素必须要玩家X和鼠标X或Y绝对一致才会出现90,180那几个角度,所以可以忽略不计。。。
但是这样只能有这么几个方向,不能一直指向鼠标,如果不行我就只能先放弃这个功能了,先做别的

测试.gif (1.52 MB, 下载次数: 13)

现在的状态

现在的状态

作者: yanzhllwc    时间: 2020-1-5 20:38
本帖最后由 yanzhllwc 于 2020-1-5 20:59 编辑

没想到做出来了,真的很感谢大家的帮助!!
使用了月光大大提到的Math.atan2公式,因为写在JS里我做不出来,最后尝试在公共事件中制作,把JS的这个公式写在事件中的脚本中,结果就实现了,效果如下
这里给出公式:Math.atan2(y2-y1,x2-x1)*180/Math.PI+90,这里+90度是因为,不知道为啥MV里出来的效果就是差着这个90度,所以加上就正常了。
参考贴子:https://blog.csdn.net/pecke/article/details/41014069

测试1.gif (650.56 KB, 下载次数: 21)

测试1.gif

作者: yanzhllwc    时间: 2020-1-5 22:45
虽然研究了很久,但实际却很简单,我不会JS,所以做不成插件,我用的是事件。
方法就是像上面说的一样,先定义4个变量,分别是鼠标的XY和玩家的XY坐标。之后就用脚本,需要旋转的图片角度=那个公式。
$gameScreen.picture(5)._angle = Math.atan2($gameVariables.value(38) - $gameVariables.value(40), $gameVariables.value(37) - $gameVariables.value(39)) * (180 / Math.PI)+90;

QQ图片20200105222203.png (35.29 KB, 下载次数: 16)

QQ图片20200105222203.png

作者: 白嫩白嫩的    时间: 2020-1-5 23:26
yanzhllwc 发表于 2020-1-1 21:46
现在是这样的状态,我只能用事件来做,代码不会用,其实是8方向的箭头,由于那个像素必须要玩家X和鼠标X或Y ...

顺便问下楼主怎么实现例图中角色只有左右没有上下动作图的?




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