查看: 3389|回复: 17

[有事请教] 自己写的事件视野脚本无法运行

[复制链接]
梦石
0
星屑
115
在线时间
19 小时
注册时间
2018-7-30
回帖
15
发表于 2019-1-26 18:13:25 | 显示全部楼层 |阅读模式

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

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

×
脚本如下
脚本Game_Interpreter.prototype.pluginCommand = function(command, width, range){

    if(command == "eyesight"){

        var self_x = $gameMap.event(this.eventId()).x;
        var self_y = $gameMap.event(this.eventId()).y;
        var self_d = $gameMap.event(this.eventId()).direction;
        var player_x = $gameParty.x;
        var player_y = $gameParty.y;
        var eare_x1;
        var eare_x2;
        var eare_y1;
        var eare_y2;
        var judger_x;
        var judger_y;
        // gain eyesight eare
        switch (self_d)
        {
        case 2:
            eare_x1 = self_x - width;
            eare_x2 = self_x + width;
            eare_y1 = self_y;
            eare_y2 = self_y + range;
            break;
        case 4:
            eare_x1 = self_x - range;
            eare_x2 = self_x;
            eare_y1 = self_y - width;
            eare_y2 = self_y + width;
            break;
        case 6:
            eare_x1 = self_x;
            eare_x2 = self_x + range;
            eare_y1 = self_y - width;
            eare_x2 = self_y + width;
            break;
        case 8:
            eare_x1 = self_x - width;
            eare_x2 = self_x + width;
            eare_y1 = self_y - range;
            eare_y2 = self_y;
            break;
        }
        //judge if player in eyesight eare or wall block eyesight
        switch (self_d)
        {
        case 2:
            eyesight_x:
            for (judger_x = eare_x1; judger_x <= eare_x2; judger_x ++)
            {
                eyesight_y:
                for(judger_y = eare_y1; judger_y <= eare_y2; judger_y ++)
                {
                    if ($gameMap.terrainTag(judger_x,judger_y) = 1)
                    {
                        break eyesight_y;   
                    }
                    else if(judger_y == player_y && judger_x == player_x)
                    {
                        $gameSelfSwitches.setValue("A",true);
                        break eyesight_x;
                    }
                }
            }
            break;
        case 4:
            eyesight_x:
            for (judger_y = eare_y1; judger_y <= eare_y2; judger_y ++)
            {
                eyesight_y:
                for(judger_x = eare_x2; judger_x >= eare_x1; judger_x --)
                {
                    if ($gameMap.terrainTag(judger_x,judger_y) = 1)
                    {
                        break eyesight_y;   
                    }
                    else if(judger_y == player_y && judger_x == player_x)
                    {
                        $gameSelfSwitches.setValue("A",true);
                        break eyesight_x;
                    }
                }
            }
            break;
            case 6:
            eyesight_x:
            for (judger_y = eare_y1; judger_y <= eare_y2; judger_y ++)
            {
                eyesight_y:
                for(judger_x = eare_x1; judger_x <= eare_x2; judger_x ++)
                {
                    if ($gameMap.terrainTag(judger_x,judger_y) = 1)
                    {
                        break eyesight_y;   
                    }
                    else if(judger_y == player_y && judger_x == player_x)
                    {
                        $gameSelfSwitches.setValue("A",true);
                        break eyesight_x;
                    }
                }
            }
            break;
        case 8:
            eyesight_x:
            for (judger_x = eare_x1; judger_x <= eare_x2; judger_x ++)
            {
                eyesight_y:
                for(judger_y = eare_y2; judger_y >= eare_y1; judger_y --)
                {
                    if ($gameMap.terrainTag(judger_x,judger_y) = 1)
                    {
                        break eyesight_y;   
                    }
                    else if(judger_y == player_y && judger_x == player_x)
                    {
                        $gameSelfSwitches.setValue("A",true);
                        break eyesight_x;
                    }
                }
            }
            break;
        }
   
   

    }

}


问题是做成插件放到游戏里面以后没有报错但是没有效果。有大佬知道原因吗?

点评

按F12看看,是不是有提示错误  发表于 2019-1-26 19:00
梦石
0
星屑
34465
在线时间
5096 小时
注册时间
2012-11-19
回帖
4715

开拓者

发表于 2019-1-26 19:07:52 | 显示全部楼层
1, 自开关的key不是单独的字母,他是一个包含 地图ID,事件ID,字母 的数组。
2, 不知道你要计算什么,如果只是是简单的判断事件与角色的格子距离的话,直接用 Game_Map 的 distance 就行了。
比如可以像这样少于10格算进入视线:
var x1 = $gameMap.event(eventId).x;
var y1 = $gameMap.event(eventId).y;
var x2 = $gamePlayer.x;
var y2 = $gamePlayer.y;
var key = [$gameMap.mapId(), eventId, 'A'];
$gameSelfSwitches.setValue(key, $gameMap.distance(x1, y1, x2, y2) < 10);
xp vx va mv  va mz 各类型脚本/插件定制
回复

使用道具 举报

梦石
0
星屑
115
在线时间
19 小时
注册时间
2018-7-30
回帖
15
 楼主| 发表于 2019-1-26 19:10:16 | 显示全部楼层
芯☆淡茹水 发表于 2019-1-26 19:07
1, 自开关的key不是单独的字母,他是一个包含 地图ID,事件ID,字母 的数组。
2, 不知道你要计算什么,如 ...

如果是要打开当前事件的独立开关呢?
回复

使用道具 举报

梦石
0
星屑
115
在线时间
19 小时
注册时间
2018-7-30
回帖
15
 楼主| 发表于 2019-1-26 19:14:20 | 显示全部楼层
芯☆淡茹水 发表于 2019-1-26 19:07
1, 自开关的key不是单独的字母,他是一个包含 地图ID,事件ID,字母 的数组。
2, 不知道你要计算什么,如 ...

我是想做单方向的,会被带特定地形标志图块阻挡的事件视野

点评

直接简化成几条线段,判断从玩家到支线尽头的位置有没有墙,有的话就跳到下一条线段  发表于 2019-1-26 20:14
用格子判断不太现实。如果是斜方向非45度时,你的视野是从上弯过去到角色呢?还是从下弯过去?  发表于 2019-1-26 19:23
回复

使用道具 举报

梦石
0
星屑
34465
在线时间
5096 小时
注册时间
2012-11-19
回帖
4715

开拓者

发表于 2019-1-26 19:20:10 | 显示全部楼层
沙皇蘑菇 发表于 2019-1-26 19:10
如果是要打开当前事件的独立开关呢?

如果是在 Game_Interpreter 里,就直接
var event = $gameMap.event(this._eventId);
或
var event = $gameMap.event(this.eventId());
都行。
如果事件解释器运行的是地图事件以外的其他事件,就不能获取地图事件。

点评

谢谢  发表于 2019-1-26 19:21
xp vx va mv  va mz 各类型脚本/插件定制
回复

使用道具 举报

梦石
0
星屑
115
在线时间
19 小时
注册时间
2018-7-30
回帖
15
 楼主| 发表于 2019-1-26 19:27:29 | 显示全部楼层
芯☆淡茹水 发表于 2019-1-26 19:20
如果是在 Game_Interpreter 里,就直接
var event = $gameMap.event(this._eventId);
或

这个 event是替换$gameMap.mapId()和eventide吗?

点评

如果js有goto就好写多了……现在我都不懂break会跳到哪里  发表于 2019-1-26 19:54
不知道,没有细看。个人有轻微的强迫症,各种缩进太长的代码看着眼睛比较疼。  发表于 2019-1-26 19:49
放到我那个脚本里还是无效,我break的部分是不是写错了?  发表于 2019-1-26 19:43
建议用 this.eventId() ,最好不要直接获取它的内变量,这个习惯是有好处的。  发表于 2019-1-26 19:32
谢谢  发表于 2019-1-26 19:31
回复

使用道具 举报

梦石
0
星屑
115
在线时间
19 小时
注册时间
2018-7-30
回帖
15
 楼主| 发表于 2019-1-26 20:58:39 | 显示全部楼层
芯☆淡茹水 发表于 2019-1-26 19:20
如果是在 Game_Interpreter 里,就直接
var event = $gameMap.event(this._eventId);
或

[pre lang="javascript"]eyesight_x:
            for (judger_y = eare_y1; judger_y <= eare_y2; judger_y ++)
            {
                $gameVariables.setValue(32, 1);/*  */
                for(judger_x = eare_x2; judger_x >= eare_x1; judger_x --)
                {
                    $gameVariables.setValue(33, 1);/*  */
                    if ($gameMap.terrainTag(judger_x,judger_y) = 1)
                    {
                        continue eyesight_x;  
                    }
                    else if(judger_y == player_y && judger_x == player_x)
                    {
                        $gameSelfSwitches.setValue(key,true);
                        break eyesight_x;
                    }
                }
            }
            break;[/pre]

eare_y2 > eare_y1 , eare_x2 > eare_x1,现在发现是这个部分没有执行,大佬能帮我看下原因吗?跪谢。

点评

if = ?  发表于 2019-1-26 22:16
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部