Project1

标题: 判断地图图块是否可以通行 [打印本页]

作者: 79160475    时间: 2016-5-12 09:46
标题: 判断地图图块是否可以通行
就比如说判断角色上方4个的图块是否可以通行,如果可以,就跳过去(类似弹簧)。
可以做的吗?
各位大神帮忙回答一下谢谢。
作者: lirn    时间: 2016-5-12 22:55
应该有类似的脚本吧
作者: 79160475    时间: 2016-5-13 22:48
有谁帮忙发一下。谢谢
作者: r901042004    时间: 2016-5-14 14:26
本帖最后由 r901042004 于 2016-5-14 15:15 编辑

內建判定通行方向的腳本代碼如下
x, y座標及其要通行的方向(d)
JAVASCRIPT 代码复制
  1. Game_CharacterBase.prototype.isMapPassable = function(x, y, d) {
  2.     var x2 = $gameMap.roundXWithDirection(x, d);
  3.     var y2 = $gameMap.roundYWithDirection(y, d);
  4.     var d2 = this.reverseDir(d);
  5.     return $gameMap.isPassable(x, y, d) && $gameMap.isPassable(x2, y2, d2);
  6. };

在你要判定通行度的地方加入以下腳本
JAVASCRIPT 代码复制
  1. var x = $gamePlayer.x;
  2. var y = $gamePlayer.y;
  3. var d = 2; //2:下 4:左 6:右 8:上
  4. var distance = 4; //距離4格
  5. var passable = false;
  6. if (d == 2) {
  7.     y += distance;
  8.     passable = $gamePlayer.isMapPassable(x, y-1, d);
  9. }
  10. else if (d == 4) {
  11.     x -= distance;
  12.     passable = $gamePlayer.isMapPassable(x+1, y, d);
  13. }   
  14. else if (d == 6) {   
  15.     x += distance;
  16.     passable = $gamePlayer.isMapPassable(x-1, y, d);
  17. }
  18. else if (d == 8) {
  19.     y -= distance;
  20.     passable = $gamePlayer.isMapPassable(x, y+1, d);
  21. }
  22. if (passable)
  23.     $gamePlayer.jump(x-$gamePlayer.x, y-$gamePlayer.y);

理論上可以用

補充一點
isMapPassable主要是判定
某一格是否可以通行到給定的方向
以及到下一格是否可以通行回來
所以要孤島式的跳躍就要從
Game_Map.prototype.checkPassage = function(x, y, bit) 下手
作者: 79160475    时间: 2016-5-14 14:58
本帖最后由 79160475 于 2016-5-14 15:02 编辑
r901042004 发表于 2016-5-14 14:26
內建判定通行方向的腳本代碼如下
x, y座標及其要通行的方向(d)
Game_CharacterBase.prototype.isMapPassabl ...


可是我有点看不懂,有详细的解释吗?
还有好像会出错
插不进去那么多怎么办



var x = $gamePlayer.x;
var y = $gamePlayer.y;
var d = 2; //2:下 4:左 6:右 8:上
var distance = 4; //距離4格
var passable = false;
if (d == 2) {
    y += distance;
    passable = $gamePlayer.isMapPassable(x, y-1);
}
else if (d == 4) {
    x -= distance;
    passable = $gamePlayer.isMapPassable(x+1, y);

只能到这了
作者: r901042004    时间: 2016-5-14 15:14
■ 目標
▲ 輔助點


★ 玩家
以上是你舉例的情形
 8
4▲6
 2
我們可以簡單利用輔助點判定上方(8)是否可以通行
else if (d == 8) {
    y -= distance;
    passable = $gamePlayer.isMapPassable(x, y+1);
}
利用以上代碼,往上x座標不會改變,y座標會變少
所以(x, y-distance) 是目標點的座標
(x, y-distance+1)是輔助點的座標
■ (x, y-distance)
▲ (x, y-distance+1)


★ (x, y)

我代碼的部分有一些打錯
等等修改
作者: 79160475    时间: 2016-5-14 15:34
本帖最后由 79160475 于 2016-5-14 15:38 编辑

內建判定通行方向的腳本代碼如下
x, y座標及其要通行的方向(d)

JAVASCRIPT 代码复制打印

6388.Game_CharacterBase.prototype.isMapPassable = function(x, y, d) {

6389.    var x2 = $gameMap.roundXWithDirection(x, d);

6390.    var y2 = $gameMap.roundYWithDirection(y, d);

6391.    var d2 = this.reverseDir(d);

6392.    return $gameMap.isPassable(x, y, d) && $gameMap.isPassable(x2, y2, d2);

6393.};


先把上面的变成插件插进去









var x = $gamePlayer.x;

02.var y = $gamePlayer.y;

03.var d = 2; //2:下 4:左 6:右 8:上

04.var distance = 4; //距離4格

05.var passable = false;

06.if (d == 2) {

07.    y += distance;

08.    passable = $gamePlayer.isMapPassable(x, y-1, d);

09.}

10.else if (d == 4) {

11.    x -= distance;

12.    passable = $gamePlayer.isMapPassable(x+1, y, d);

13.}   

14.else if (d == 6) {   

15.    x += distance;

16.    passable = $gamePlayer.isMapPassable(x-1, y, d);

17.}

18.else if (d == 8) {

19.    y -= distance;

20.    passable = $gamePlayer.isMapPassable(x, y+1, d);

21.}

22.if (passable)

23.    $gamePlayer.jump(x-$gamePlayer.x, y-$gamePlayer.y);



然后在事件中插入脚本(以上),对吧










03.var d = 2; //2:下 4:左 6:右 8:上
好像这一行怪怪的
作者: r901042004    时间: 2016-5-14 15:47
本帖最后由 r901042004 于 2016-5-14 17:46 编辑

製作了一個小插件
使用方法:
在事件的腳本中輸入 this.jumpDistance(4);
就可以往面對的方向跳4格


JAVASCRIPT 代码复制下载
  1. Game_Interpreter.prototype.jumpDistance = function(distance) {
  2.     if (!$gamePlayer.isMoving() && $gamePlayer.canMove())
  3.     {
  4.         var x = $gamePlayer.x;
  5.         var y = $gamePlayer.y;
  6.         var d = $gamePlayer.direction();
  7.         var passable = false;
  8.         if (d == 2) {
  9.             y += distance;            
  10.         }
  11.         else if (d == 4) {
  12.             x -= distance;
  13.         }   
  14.         else if (d == 6) {   
  15.             x += distance;
  16.         }
  17.         else if (d == 8) {
  18.             y -= distance;
  19.         }
  20.         passable = $gameMap.checkPassage(x, y, 0x0f);
  21.         for (var i=1; i<=4; i++)
  22.             passable = passable || $gameMap.checkPassage(x, y, (1 << (i - 1)) & 0x0f);
  23.         if (passable && $gameMap.isValid(x, y))
  24.             $gamePlayer.jump(x-$gamePlayer.x, y-$gamePlayer.y);
  25.     }
  26. };
受限於腳本不能打太多行
所以還是做了這個比較快




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