设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 4739|回复: 7
打印 上一主题 下一主题

[有事请教] 请问MV有8方向走的插件吗?

[复制链接]

Lv4.逐梦者

梦石
0
星屑
19270
在线时间
2307 小时
注册时间
2015-7-4
帖子
937
跳转到指定楼层
1
发表于 2017-11-3 13:42:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
如题,超讨厌有直线距离不走非走个直角弯道,个人有点强迫症,网上找来找去总找不到。有的请帮忙,感谢!

Lv4.逐梦者

梦石
10
星屑
7697
在线时间
690 小时
注册时间
2017-1-9
帖子
636

我没有哭开拓者

2
发表于 2017-11-3 17:10:28 | 只看该作者
萌新要善用搜索&优先去本区图书馆里查查
下面是大佬的插件集合的链接https://rpg.blue/thread-384599-1-1.html
这个B天天摸鱼,快点来个谁把他从被窝里拖出来
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
19270
在线时间
2307 小时
注册时间
2015-7-4
帖子
937
3
 楼主| 发表于 2017-11-3 21:41:35 | 只看该作者
世界第一中二 发表于 2017-11-3 17:10
萌新要善用搜索&优先去本区图书馆里查查
下面是大佬的插件集合的链接https://rpg.blue/thread-384599-1-1.h ...

这个试过了,鼠标点击还是绕弯路啊!有没有鼠标8方向寻路的?论坛有些隐藏的搜不到啊!
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
210
在线时间
252 小时
注册时间
2010-10-30
帖子
51
4
发表于 2017-11-5 15:06:00 | 只看该作者
像素移动?!
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7427
在线时间
948 小时
注册时间
2017-9-27
帖子
583
5
发表于 2017-11-5 17:17:22 | 只看该作者
我把手头收集的几个同类插件挨个试了一遍,感觉这个用起来是最舒服的。
GALV_DiagonalMovement.7z (3.35 KB, 下载次数: 125)


JAVASCRIPT 代码复制下载
  1. //-----------------------------------------------------------------------------
  2. //  Galv's Diagonal Movement
  3. //-----------------------------------------------------------------------------
  4. //  For: RPGMAKER MV
  5. //  GALV_DiagonalMovement.js
  6. //-----------------------------------------------------------------------------
  7. //  2017-01-16 - Version 1.5 - added diagonal charset in the 'turn toward
  8. //                           - character' move route command
  9. //  2016-10-05 - Version 1.4 - modified how diag speed was coded for
  10. //                             compatibility purposes
  11. //  2016-08-26 - Version 1.3 - changed alias methods
  12. //                           - fixed turn direction move route after diag move
  13. //  2016-05-17 - Version 1.2 - diagonal block option added to prevent moving
  14. //                           - diagonally past blocking tiles.
  15. //                           - added ability to disable diagonal movement
  16. //                           - during game
  17. //  2016-02-04 - Version 1.1 - added option to slow diagonal move speed
  18. //  2015-12-12 - Version 1.0 - release
  19. //-----------------------------------------------------------------------------
  20. //  Terms can be found at:
  21. //  galvs-scripts.com
  22. //-----------------------------------------------------------------------------
  23.  
  24. var Imported = Imported || {};
  25. Imported.Galv_DiagonalMovement = true;
  26.  
  27. var Galv = Galv || {};
  28. Galv.DM = Galv.DM || {};
  29.  
  30. //-----------------------------------------------------------------------------
  31. /*:
  32.  * @plugindesc (v.1.5) Just a basic diagonal movement plugin. Written for compatibility with other Galv plugins.
  33.  *
  34.  * @author Galv - galvs-scripts.com
  35.  *
  36.  * @param Diagonal Mouse
  37.  * @desc true or false for diagonal pathfinding movement on mouse click. true may conflict with pathfinding plugins.
  38.  * @default false
  39.  *
  40.  * @param Diagonal Charset
  41.  * @desc true or false if you want to use diagonal charactersets (see help for more)
  42.  * @default true
  43.  *
  44.  * @param Diagonal Speed
  45.  * @desc % of move speed characters move while travelling diagonally
  46.  * @default 90
  47.  *
  48.  * @param Block Diagonal
  49.  * @desc true or false - if diagonal movement is blocked when moving past an impassable tile or not.
  50.  * @default false
  51.  *
  52.  * @help
  53.  *   Galv's Diagonal Movement
  54.  * ----------------------------------------------------------------------------
  55.  * Plug and play. If this doesn't play nice with other plugins, try putting it
  56.  * at the top of the plugin list. It overwrites the default diagonal function.
  57.  *
  58.  * If this conflicts with other pathfinding plugins you might have, change
  59.  * 'Diagonal Mouse' setting to false.
  60.  *
  61.  * When 'Diagonal Charsets' is true, the plugin will change the sprite if the
  62.  * character is on a diagonal. The new sprite used will be in the position
  63.  * directly below the selected character graphic. This means that only sprites
  64.  * on the top of a character sheet will be able to have diagonal graphics.
  65.  *
  66.  * Sprites on the bottom will not have diagonal graphics.
  67.  * ----------------------------------------------------------------------------
  68.  *   SCRIPT CALL
  69.  * ----------------------------------------------------------------------------
  70.  *
  71.  *   $gameSystem.disableVert = true;   // DISABLE diagonal movement
  72.  *
  73.  *   $gameSystem.disableVert = false;  // ENABLE diagonal movement
  74.  *
  75.  * ----------------------------------------------------------------------------
  76.  */
  77.  
  78.  
  79. //-----------------------------------------------------------------------------
  80. //  CODE STUFFS
  81. //-----------------------------------------------------------------------------
  82.  
  83.  
  84.  
  85. (function() {
  86. Galv.DM.mouseMove = PluginManager.parameters('Galv_DiagonalMovement')["Diagonal Mouse"].toLowerCase() == 'true';
  87. Galv.DM.diagGraphic = PluginManager.parameters('Galv_DiagonalMovement')["Diagonal Charset"].toLowerCase() == 'true';
  88. Galv.DM.diagMod = Number(PluginManager.parameters('Galv_DiagonalMovement')["Diagonal Speed"]) * 0.01;       
  89. Galv.DM.diagBlocked = PluginManager.parameters('Galv_DiagonalMovement')["Block Diagonal"].toLowerCase() == 'true';
  90.  
  91. Game_CharacterBase.prototype._cframes = 3;
  92.  
  93. Galv.DM.Game_CharacterBase_realMoveSpeed = Game_CharacterBase.prototype.realMoveSpeed;
  94. Game_CharacterBase.prototype.realMoveSpeed = function() {
  95.         var spd = Galv.DM.Game_CharacterBase_realMoveSpeed.call(this);
  96.         return this._diagDir ? spd * Galv.DM.diagMod : spd;
  97. };
  98.  
  99. // overwrite
  100. Game_Follower.prototype.realMoveSpeed = function() {
  101.         return $gamePlayer.realMoveSpeed();
  102. };
  103.  
  104. Galv.DM.getHorzVertDirs = function(direction) {
  105.         switch (direction) {
  106.                 case 1: return [4,2];
  107.                 case 3: return [6,2];
  108.                 case 7: return [4,8];
  109.                 case 9: return [6,8];
  110.                 default: return [0,0];
  111.         };
  112. };
  113.  
  114. Galv.DM.getDir = function(horz,vert) {
  115.         if (horz == 4 && vert == 2) return 1;
  116.         if (horz == 6 && vert == 2) return 3;
  117.         if (horz == 4 && vert == 8) return 7;
  118.         if (horz == 6 && vert == 8) return 9;
  119.         return 0;
  120. };
  121.  
  122. Galv.DM.diagRow = {
  123.         3: 0,
  124.         1: 1,
  125.         9: 2,
  126.         7: 3
  127. };
  128.  
  129. Galv.DM.Game_CharacterBase_moveStraight = Game_CharacterBase.prototype.moveStraight;
  130. Game_CharacterBase.prototype.moveStraight = function(d) {
  131.         this._diagDir = false;
  132.         Galv.DM.Game_CharacterBase_moveStraight.call(this,d);
  133. };
  134.  
  135. Galv.DM.Game_CharacterBase_setDirection = Game_CharacterBase.prototype.setDirection;
  136. Game_CharacterBase.prototype.setDirection = function(d) {
  137.         if (this._diagStraigten) this._diagDir = false;
  138.         Galv.DM.Game_CharacterBase_setDirection.call(this,d);
  139. };
  140.  
  141. if (Galv.DM.diagBlocked) {
  142.         Game_Player.prototype.canPassDiagonally = function(x, y, horz, vert) {
  143.                 var x2 = $gameMap.roundXWithDirection(x, horz);
  144.                 var y2 = $gameMap.roundYWithDirection(y, vert);
  145.                 if (this.canPass(x, y, vert) && this.canPass(x, y2, horz) && this.canPass(x, y, horz) && this.canPass(x2, y, vert)) {
  146.                         return true;
  147.                 };
  148.                 return false;
  149.         };
  150. };
  151.  
  152. Galv.DM.Game_Player_canPassDiagonally = Game_Player.prototype.canPassDiagonally;
  153. Game_Player.prototype.canPassDiagonally = function(x, y, horz, vert) {
  154.         if ($gameSystem.disableVert) return false;
  155.         return Galv.DM.Game_Player_canPassDiagonally.call(this,x,y,horz,vert);
  156. };
  157.  
  158. // OVERWRITE
  159. Game_CharacterBase.prototype.moveDiagonally = function(horz, vert) {
  160.         var diag = this.canPassDiagonally(this._x, this._y, horz, vert);
  161.     var norm = this.canPass(this._x, this._y, horz) || this.canPass(this._x, this._y, vert);
  162.  
  163.         if (diag) {
  164.                 this._diagDir = Galv.DM.getDir(horz,vert);
  165.         this._x = $gameMap.roundXWithDirection(this._x, horz);
  166.         this._y = $gameMap.roundYWithDirection(this._y, vert);
  167.         this._realX = $gameMap.xWithDirection(this._x, this.reverseDir(horz));
  168.         this._realY = $gameMap.yWithDirection(this._y, this.reverseDir(vert));
  169.         this.increaseSteps();
  170.         } else if (norm) {
  171.                 this._diagDir = false;
  172.                 this.moveStraight(this.getOtherdir(horz,vert));
  173.     };
  174.  
  175.         this._diagStraigten = false;
  176.     if (this._direction === this.reverseDir(horz)) this.setDirection(horz);
  177.     if (this._direction === this.reverseDir(vert)) this.setDirection(vert);
  178.         this._diagStraigten = true;
  179. };
  180.  
  181. Game_CharacterBase.prototype.getOtherdir = function(horz, vert) {
  182.     return this.canPass(this._x, this._y, horz) ? horz : vert;
  183. };
  184.  
  185. // OVERWRITE
  186. Game_Player.prototype.getInputDirection = function() {
  187.     return Input.dir8;
  188. };
  189.  
  190. Galv.DM.Game_Player_executeMove = Game_Player.prototype.executeMove;
  191. Game_Player.prototype.executeMove = function(direction) {
  192.         if (direction % 2 == 0) {
  193.             Galv.DM.Game_Player_executeMove.call(this,direction);
  194.         } else if (Math.abs(direction % 2) == 1) {
  195.                 var dirArray = Galv.DM.getHorzVertDirs(direction);
  196.                 this.moveDiagonally(dirArray[0],dirArray[1]);
  197.         };
  198. };
  199.  
  200.  
  201.  
  202. // If using Diaonal Charset
  203. if (Galv.DM.diagGraphic) {
  204. Galv.DM.Sprite_Character_characterPatternY = Sprite_Character.prototype.characterPatternY;
  205. Sprite_Character.prototype.characterPatternY = function() {
  206.         if (!this._isBigCharacter && this._character._diagDir && this._character.characterIndex() < 4) {
  207.                 return Galv.DM.diagRow[this._character._diagDir];
  208.         } else {
  209.             return Galv.DM.Sprite_Character_characterPatternY.call(this);
  210.         };
  211. };
  212.  
  213. Galv.DM.Sprite_Character_characterBlockX = Sprite_Character.prototype.characterBlockX;
  214. Sprite_Character.prototype.characterBlockX = function() {
  215.         if (!this._isBigCharacter && this._character._diagDir && this._character.characterIndex() < 4) {
  216.                 var index = this._character.characterIndex() + 4;
  217.         return index % 4 * this._character._cframes;
  218.         } else {       
  219.             return Galv.DM.Sprite_Character_characterBlockX.call(this);
  220.         };
  221.  
  222. };
  223.  
  224. Galv.DM.Sprite_Character_characterBlockY = Sprite_Character.prototype.characterBlockY;
  225. Sprite_Character.prototype.characterBlockY = function() {
  226.         if (!this._isBigCharacter && this._character._diagDir && this._character.characterIndex() < 4) {
  227.                 var index = this._character.characterIndex() + 4;
  228.         return Math.floor(index / 4) * 4;
  229.         } else {       
  230.             return Galv.DM.Sprite_Character_characterBlockY.call(this);
  231.         };
  232.  
  233. };
  234. };
  235. // end if using diagonal charset
  236.  
  237.  
  238. // turn toward character on diagonal
  239. // OVERWRITE
  240. Game_Character.prototype.turnTowardCharacter = function(character) {
  241.     var sx = this.deltaXFrom(character.x);
  242.     var sy = this.deltaYFrom(character.y);
  243.  
  244.         var absSx = Math.abs(sx);
  245.         var absSy = Math.abs(sy);
  246.  
  247.         if (absSx == absSy) {
  248.                 if (sx < 0) {
  249.                         this._diagDir = sy > 0 ? 9 : 3;
  250.                 } else if (sx > 0) {
  251.                         this._diagDir = sy > 0 ? 7 : 1;
  252.                 }
  253.         } else {
  254.                 this._diagDir = 0;
  255.         };
  256.         if (absSx > absSy) {
  257.                this.setDirection(sx > 0 ? 4 : 6);
  258.     } else if (sy !== 0) {
  259.         this.setDirection(sy > 0 ? 8 : 2);
  260.     }
  261. };
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268. // If using diagonal mouse movement:
  269.  
  270. if (Galv.DM.mouseMove) {
  271. Galv.DM.Game_Character_findDirectionTo = Game_Character.prototype.findDirectionTo;
  272. // OVERWRITE
  273. Game_Character.prototype.findDirectionTo = function(goalX, goalY) {
  274.         if ($gameSystem.disableVert) {
  275.                 return Galv.DM.Game_Character_findDirectionTo.call(this,goalX,goalY);
  276.         } else {
  277.                 var searchLimit = this.searchLimit();
  278.                 var mapWidth = $gameMap.width();
  279.                 var nodeList = [];
  280.                 var openList = [];
  281.                 var closedList = [];
  282.                 var start = {};
  283.                 var best = start;
  284.  
  285.                 if (this.x === goalX && this.y === goalY) {
  286.                         return 0;
  287.                 }
  288.  
  289.                 start.parent = null;
  290.                 start.x = this.x;
  291.                 start.y = this.y;
  292.                 start.g = 0;
  293.                 start.f = $gameMap.distance(start.x, start.y, goalX, goalY);
  294.                 nodeList.push(start);
  295.                 openList.push(start.y * mapWidth + start.x);
  296.  
  297.                 while (nodeList.length > 0) {
  298.                         var bestIndex = 0;
  299.                         for (var i = 0; i < nodeList.length; i++) {
  300.                                 if (nodeList[i].f < nodeList[bestIndex].f) {
  301.                                         bestIndex = i;
  302.                                 }
  303.                         }
  304.  
  305.                         var current = nodeList[bestIndex];
  306.                         var x1 = current.x;
  307.                         var y1 = current.y;
  308.                         var pos1 = y1 * mapWidth + x1;
  309.                         var g1 = current.g;
  310.  
  311.                         nodeList.splice(bestIndex, 1);
  312.                         openList.splice(openList.indexOf(pos1), 1);
  313.                         closedList.push(pos1);
  314.  
  315.                         if (current.x === goalX && current.y === goalY) {
  316.                                 best = current;
  317.                                 goaled = true;
  318.                                 break;
  319.                         }
  320.  
  321.                         if (g1 >= searchLimit) {
  322.                                 continue;
  323.                         }
  324.  
  325.  
  326.                         for (var j = 0; j < 9; j++) {
  327.                                 var direction = 1 + j;
  328.  
  329.                                 if (direction === 5) continue;
  330.  
  331.                                 var diag = Math.abs(direction % 2) == 1;
  332.                                 var dirs = Galv.DM.getHorzVertDirs(direction);
  333.                                 var horz = dirs[0];
  334.                                 var vert = dirs[1];
  335.  
  336.                                 if (diag && this.canPassDiagonally(x1, y1, horz, vert) && (this.canPass(x1, y1, horz) || this.canPass(x1, y1, vert))) {
  337.                                         // If can go diagonally and a horizontal dir isn't blocking
  338.                                         var x2 = $gameMap.roundXWithDirection(x1, horz);
  339.                                         var y2 = $gameMap.roundYWithDirection(y1, vert);
  340.                                 } else if (this.canPass(x1, y1, direction)) {
  341.                                         var x2 = $gameMap.roundXWithDirection(x1, direction);
  342.                                         var y2 = $gameMap.roundYWithDirection(y1, direction);
  343.                                 } else {
  344.                                         continue;
  345.                                 };
  346.  
  347.                                 var pos2 = y2 * mapWidth + x2;
  348.  
  349.                                 if (closedList.contains(pos2)) {
  350.                                         continue;
  351.                                 }
  352.  
  353.                                 var g2 = g1 + 1;
  354.                                 var index2 = openList.indexOf(pos2);
  355.  
  356.                                 if (index2 < 0 || g2 < nodeList[index2].g) {
  357.                                         var neighbor;
  358.                                         if (index2 >= 0) {
  359.                                                 neighbor = nodeList[index2];
  360.                                         } else {
  361.                                                 neighbor = {};
  362.                                                 nodeList.push(neighbor);
  363.                                                 openList.push(pos2);
  364.                                         }
  365.                                         neighbor.parent = current;
  366.                                         neighbor.x = x2;
  367.                                         neighbor.y = y2;
  368.                                         neighbor.g = g2;
  369.                                         neighbor.f = g2 + $gameMap.distance(x2, y2, goalX, goalY);
  370.                                         if (!best || neighbor.f - neighbor.g < best.f - best.g) {
  371.                                                 best = neighbor;
  372.                                         }
  373.                                 }
  374.                         }
  375.                 }
  376.  
  377.                 var node = best;
  378.                 while (node.parent && node.parent !== start) {
  379.                         node = node.parent;
  380.                 }
  381.  
  382.                 var deltaX1 = $gameMap.deltaX(node.x, start.x);
  383.                 var deltaY1 = $gameMap.deltaY(node.y, start.y);
  384.  
  385.  
  386.                 if (deltaY1 > 0 && deltaX1 > 0) {
  387.                         return 3;
  388.                 } else if (deltaY1 > 0 && deltaX1 < 0) {
  389.                         return 1;
  390.                 } else if (deltaY1 < 0 && deltaX1 < 0) {
  391.                         return 7;
  392.                 } else if (deltaY1 < 0 && deltaX1 > 0) {
  393.                         return 9;
  394.                 };
  395.  
  396.  
  397.                 if (deltaY1 > 0) {
  398.                         return 2;
  399.                 } else if (deltaX1 < 0) {
  400.                         return 4;
  401.                 } else if (deltaX1 > 0) {
  402.                         return 6;
  403.                 } else if (deltaY1 < 0) {
  404.                         return 8;
  405.                 }
  406.  
  407.                 var deltaX2 = this.deltaXFrom(goalX);
  408.                 var deltaY2 = this.deltaYFrom(goalY);
  409.  
  410.  
  411.                 if (Math.abs(deltaX2) > Math.abs(deltaY2)) {
  412.                         return deltaX2 > 0 ? 4 : 6;
  413.                 } else if (deltaY2 !== 0) {
  414.                         return deltaY2 > 0 ? 8 : 2;
  415.                 }
  416.  
  417.                 return 0;
  418.         };
  419. };
  420. };
  421.  
  422. })();

回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
19270
在线时间
2307 小时
注册时间
2015-7-4
帖子
937
6
 楼主| 发表于 2017-11-20 11:12:39 | 只看该作者
梦想家大魔王 发表于 2017-11-5 17:17
我把手头收集的几个同类插件挨个试了一遍,感觉这个用起来是最舒服的。

哎呀!插件好是好,但是跟Alpha ABS有冲突呀,求个兼容版。通通拜谢!
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
16044
在线时间
3992 小时
注册时间
2015-9-14
帖子
1337

开拓者

7
发表于 2017-11-20 16:03:30 | 只看该作者
最好用.有開關4方/8方通行插件.
Yami_8DirEx.js Yami_8DirEx.zip (2.72 KB, 下载次数: 155)
回复 支持 1 反对 0

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
19270
在线时间
2307 小时
注册时间
2015-7-4
帖子
937
8
 楼主| 发表于 2017-11-20 21:45:38 | 只看该作者
wabcmcc 发表于 2017-11-20 16:03
最好用.有開關4方/8方通行插件.
Yami_8DirEx.js

谢谢!又一个作者,又多了冲突的可能,前面那个我已经解决兼容性问题了,这个留以后研究。
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-17 06:36

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表