查看: 2083|回复: 3

[交流讨论] 【JS应用题第一弹】获取与主角相距最近的事件ID

[复制链接]

21

主题

12

金币

3014

贝壳

旅行者

Rank: 1

积分
406

明灯云会员

发表于 2023-9-19 09:44:31 | 显示全部楼层 |阅读模式
本帖最后由 康娜酱 于 2023-9-19 13:24 编辑

未命名.png

鉴于提问者已用不明方法让主角能自动跑到指定事件ID的事件,因此本文着重探讨如何获取与主角相距最近的可交互NPC的事件ID

  1. // 第一段
  2. function distance(px, py, ex, ey) {
  3.     var d = Math.sqrt(Math.pow(Math.abs(px - ex), 2) + Math.pow(Math.abs(py - ey), 2));
  4.     return d;
  5. };

  6. // 第二段
  7. var eventsDistance = [];
  8. var eventList = $gameMap.events().filter(e => e.event().meta.point);
  9. for (var i = 0; i < eventList.lenght; i++){
  10.     eventsDistance.push(distance($gamePlayer.screenX(), $gamePlayer.screenY(), eventList[i].screenX(), eventList[i].screenY()));
  11. };

  12. // 第三段
  13. const index = eventsDistance.indexOf(Math.min.apply(null, eventsDistance));
  14. console.log(eventList[index].eventId());
复制代码

学习重点:

1. 代码中第一段 - 编写出一个求两点距离的函数
勾股定理:两个点,点一的坐标是(x3, y3),点二的坐标是(x6, y7),距离就会是(6-3)^2+(7-3)^2的开方=5
本段所编写的function distance(px, py, ex, ey) {......}函数所返回(return)的d就是这个5

1a. Math.abs的意思是在取绝对值,比如Math.abs(6 - 3)是Math.abs(3)得出正3,Math.abs(3 - 7)是Math.abs(-4)得出正4
测验题:Math.abs(123 - 4) + 5 - Math.abs(67 - 89)等于几?(反白查看答案:105)

1.b Math.pow(x, y)的意思x的y次幂,比如Math.pow(4, 2)是16,Math.pow(2, 8)是256
测验题:Math.pow(Math.abs(3 - 6), 2) + Math.pow(Math.abs(3 - 7), 2)等于几?(反白查看答案:25)

1.c Math.sqrt(x)的意思x的平方根,比如Math.sqrt(81)是9,Math.sqrt(144)是12
测验题:Math.sqrt(Math.pow(Math.abs(3 - 6), 2) + Math.pow(Math.abs(3 - 7), 2))等于几?(反白查看答案:5)

恭喜你已经学会了如何编写出一个求两点距离的函数
收起


未命名2.png

鉴于提问者没有说明可「交互NPC」的定义,因此本文以「在事件备注栏填写<point>」作为可交互的标记

2. 接下来,轮到讲解第二段 — 如何求得每个可交互的NPC与玩家之间的距离
2a. var eventsDistance = []的意思是声明一个名为eventsDistance的变量,同时赋值它为一个空数组[]

2b. var eventList = $gameMap.events().filter(e => e.event().meta.point)的意思是声明一个名为eventList的变量,
同时赋值它的值为$gameMap.events().filter(e => e.event().meta.point)

2b1. $gameMap.events()是一个RM內置于Game_Map的函数,作用是返回一个数组,数组当中包含了当前地图內,所有事件(Game_Event)的实例

2b2. array.fliter(元素e => 条件)是一个与数组(array)相关的內置函数,中文可以理解为「过滤器」。
能夠根据自定义的条件,从数组array中过滤出一个包含了「符合条件的元素e」的数组

2b3. e.event().meta.point的值在事件的备注栏有填写<point>时返回true,无填写<point>时返回undefined

2c. for循环不多赘述。而array.push(元素e)也是一个与数组(array)相关的內置函数,作用是往数组array的末尾添加元素e

综合以上內容,本文第二段的实际运作情境:

假设当前地图有三个事件,其中2号事件的备注栏无填写<point>
在var eventList = $gameMap.events().filter(e => e.event().meta.point)过后,
eventList的值会是[1号事件, 3号事件]

假设玩家的画面 X 坐标, 画面 Y 坐标是(408, 330),1号事件是(456, 522),3号事件是(504, 282)
在for循环两次eventsDistance.push(distance(408, 330, n号事件的画面 X 坐标, n号事件的画面 Y 坐标))过后,
eventsDistance的值会是[197.9090700296477, 107.33126291998991]

以下是玩家与1号事件之间距离的计算
 Math.sqrt(Math.pow(Math.abs(408 - 456), 2) + Math.pow(Math.abs(330 - 522), 2))
=Math.sqrt(Math.pow(Math.abs(-48), 2) + Math.pow(Math.abs(-192), 2))
=Math.sqrt(48^2 + 192^2)
=Math.sqrt(39168)
=197.9090700296477
收起


回复

使用道具 举报

21

主题

12

金币

3014

贝壳

旅行者

Rank: 1

积分
406

明灯云会员

 楼主| 发表于 2023-9-19 09:44:49 | 显示全部楼层
本帖最后由 康娜酱 于 2023-9-19 13:21 编辑

3. 最后,从这个包含了「各个可交互事件与玩家之间的距离」的数组eventsDistance中,找出是哪个事件与玩家最相近
3a. const index = n的意思是声明一个名为index的变量,同时赋值它的值为n

3b. Math.min.apply(null, array)可以找出数组array內,数值最小的元素

3c. array.indexOf(元素e)会返回元素e在数组array中的位置,首位是0,次位是1

综合以上內容,本文第三段第一行的实际运作情境
const index = eventsDistance.indexOf(Math.min.apply(null, eventsDistance))
const index = [197.9090700296477, 107.33126291998991].indexOf(107.33126291998991)
const index = 1

3d. 第三段第二行console.log(eventList[index].eventId())会在控制台(F8=>Console)中输出eventList[index].eventId()的值

其中eventList是第二段里经filter过滤器得出的[1号事件, 3号事件],index是第三段第一行得出的1,所以eventLists[index]即是[1号事件, 3号事件][1]也就是3号事件

eventList[index].eventId()的意思是返回eventList[index]的事件ID,那么3号事件.eventId()当然是3了,所以距离玩家最近的事件的事件ID就是3了
收起


4. 总结一下
本次教学可以学习到的JS知识:
1. Math.abs
2. Math.pow
3. Math.sqrt
4. filter
5. for循环
6. push
7. indexOf
8. Math.min.apply
9. console.log输出控制台

本次教学可以学习到的MV知识:
1. $gameMap.events()
2. e.event().meta
3. $gamePlayer指玩家
4. screenX()指画面 X 坐标
5. screenY()指画面 Y 坐标
收起





回复

使用道具 举报

0

主题

0

金币

3

贝壳

旅行者

Rank: 1

积分
1
发表于 2023-9-19 11:35:31 | 显示全部楼层
赞赞赞
回复

使用道具 举报

2

主题

0

金币

37

贝壳

旅行者

Rank: 1

积分
12
发表于 2023-10-11 09:36:46 | 显示全部楼层
头好疼啊,要长脑子了
600h+rmmv萌新,爱好是ps启动,恐解爱好者,正在自己制作恐怖游戏,美化插件的堆积者
回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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