Project1

标题: 关于地图建造的问题,如何识别事件范围内有无其他事件 [打印本页]

作者: DEX310    时间: 2023-12-8 15:35
标题: 关于地图建造的问题,如何识别事件范围内有无其他事件
本帖最后由 DEX310 于 2024-1-23 00:08 编辑

1.就是像要实现红警。帝国时代。星际。魔兽争霸。类似那种造房子的功能,如果范围内有其他建筑就无法再建造,否则玩家可任意地点 自由建造。如何用事件实现?或者插件
2.2024.1.23 遇到个新问题,我写了一个随地种树的事件,但现在的问题是一个事件只能随地种一颗,我要种10棵的话就必须要写10个事件?有没有更简单或者一劳永逸的方法?(我用的是替换事件位置)

作者: 蹲厕所的女孩    时间: 2023-12-8 15:35
第2个问题,我第一反应想到的是将做好的事件进行动态复制,我给你一个解决方案吧

  1. // 获取变量参数
  2. const eventId = $gameVariables.value(10);
  3. const targetX = $gameVariables.value(11);
  4. const targetY = $gameVariables.value(12);

  5. // 生成新事件
  6. const dataEvent = $dataMap.events[eventId];
  7. const gameEvent = new Game_Event($gameMap.mapId, dataEvent.id);
  8. gameEvent.locate(targetX, targetY);
  9. $gameMap._events.push(gameEvent);

  10. // 在地图上绘制新事件
  11. const spriteEvent = new Sprite_Character(gameEvent);
  12. SceneManager._scene._spriteset._characterSprites.push(spriteEvent);
  13. SceneManager._scene._spriteset._tilemap.addChild(spriteEvent);
复制代码


上面这段代码直接复制,然后在事件里调用脚本,粘进去
下面说一下具体用法,每次调用上面这段代码的时候会根据你变量中的参数来进行复制并生成新的事件
脚本前三行最末尾,有个$gameVariables.value(10)、后面两行是11和12,这三个值代表的是你变量的序号,我这里用的是10.11.12,你可以任意选择三个,只用把代码里的这个数字改成你对应的即可
其中第一个变量代表你需要复制的事件ID,这个你在地图编辑器上切换到事件模式时左边就有你当前地图上的所有事件ID及事件名,选择你要复制的那个事件ID即可
第二个和第三个变量分别是你要复制的目标位置XY
因此每次调用之前先在这段代码前面修改一下这三个变量的值为你想要的事件ID、位置X和Y即可

下面放一张我的示例参考:


像我图上这个就是把事件ID为1的事件,也就是我图上这个事件本身,进行复制,目标位置每次执行一次就XY各加1,你可以完全复刻后试试效果,不明白的再问我
作者: 214555558    时间: 2023-12-9 19:14
你这个星屑有点太少了,可能不会有人回答的吧┐(─__─)┌
作者: 4887441    时间: 2023-12-9 19:44
给每一个房子都设个碰撞体积?房子就占一格倒不是没法做,用独立开关控制建成不同房子就行,不上插件顶多顶多四种建筑。位置摆放也可以考虑用事件移动试试。
作者: DEX310    时间: 2024-1-22 23:53
214555558 发表于 2023-12-9 19:14
你这个星屑有点太少了,可能不会有人回答的吧┐(─__─)┌

我也不懂,以为是个随手解决的小问题,难度很大吗?
作者: DEX310    时间: 2024-1-23 00:00
4887441 发表于 2023-12-9 19:44
给每一个房子都设个碰撞体积?房子就占一格倒不是没法做,用独立开关控制建成不同房子就行,不上插件顶多顶 ...

碰撞体积先不考虑了用事件的话,怎么复制调用同种建筑?我大概试了下。比如要随地种10棵相同的树,我写一个事件,只能种一颗。要分别写10个事件才能实现吗?本来还想着3棵树围起来变成一间房子之类的。现在连造多个树都成问题
作者: shiroin    时间: 2024-1-23 00:41
function isEventsNearEvent(x, y, range) {
    var eventExists = false;

    for (var offsetY = -range; offsetY <= range; offsetY++) {
        for (var offsetX = -range; offsetX <= range; offsetX++) {
            // 确保坐标在地图范围内
            var checkX = x + offsetX;
            var checkY = y + offsetY;
            if (checkX >= 0 && checkY >= 0 && checkX < $gameMap.width() && checkY < $gameMap.height()) {
                var events = $gameMap.eventsXy(checkX, checkY);
                if (events.length > 0) {
                    return true;
                }
            }
        }
    }
    return eventExists;
}

不怎么用MZ,不知道能不能生效,因为有点长,大概要改写成插件来用,脚本可以读取的话,就可以直接用脚本判断,输入isEventsNearEvent(14, 17, 2)就可以判断(14, 17)坐标2格范围内有没有事件,如果有事件就会返回true




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