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

Project1

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

[有事请教] 关于地图建造的问题,如何识别事件范围内有无其他事件

[复制链接]

Lv1.梦旅人

梦石
0
星屑
192
在线时间
24 小时
注册时间
2020-10-21
帖子
37
跳转到指定楼层
1
发表于 2023-12-8 15:35:34 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
50星屑
本帖最后由 DEX310 于 2024-1-23 00:08 编辑

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

最佳答案

查看完整内容

第2个问题,我第一反应想到的是将做好的事件进行动态复制,我给你一个解决方案吧 上面这段代码直接复制,然后在事件里调用脚本,粘进去 下面说一下具体用法,每次调用上面这段代码的时候会根据你变量中的参数来进行复制并生成新的事件 脚本前三行最末尾,有个$gameVariables.value(10)、后面两行是11和12,这三个值代表的是你变量的序号,我这里用的是10.11.12,你可以任意选择三个,只用把代码里的这个数字改成你对应的即可 其 ...

Lv3.寻梦者

梦石
0
星屑
999
在线时间
84 小时
注册时间
2018-12-18
帖子
84
2
发表于 2023-12-8 15:35: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,你可以完全复刻后试试效果,不明白的再问我
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
104
在线时间
108 小时
注册时间
2023-9-11
帖子
5
3
发表于 2023-12-9 19:14:59 | 只看该作者
你这个星屑有点太少了,可能不会有人回答的吧┐(─__─)┌
回复

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
953
在线时间
256 小时
注册时间
2023-3-16
帖子
62
4
发表于 2023-12-9 19:44:06 | 只看该作者
给每一个房子都设个碰撞体积?房子就占一格倒不是没法做,用独立开关控制建成不同房子就行,不上插件顶多顶多四种建筑。位置摆放也可以考虑用事件移动试试。
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
192
在线时间
24 小时
注册时间
2020-10-21
帖子
37
5
 楼主| 发表于 2024-1-22 23:53:57 | 只看该作者
214555558 发表于 2023-12-9 19:14
你这个星屑有点太少了,可能不会有人回答的吧┐(─__─)┌

我也不懂,以为是个随手解决的小问题,难度很大吗?
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
192
在线时间
24 小时
注册时间
2020-10-21
帖子
37
6
 楼主| 发表于 2024-1-23 00:00:18 | 只看该作者
4887441 发表于 2023-12-9 19:44
给每一个房子都设个碰撞体积?房子就占一格倒不是没法做,用独立开关控制建成不同房子就行,不上插件顶多顶 ...

碰撞体积先不考虑了用事件的话,怎么复制调用同种建筑?我大概试了下。比如要随地种10棵相同的树,我写一个事件,只能种一颗。要分别写10个事件才能实现吗?本来还想着3棵树围起来变成一间房子之类的。现在连造多个树都成问题
回复

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
5450
在线时间
1230 小时
注册时间
2016-12-6
帖子
389
7
发表于 2024-1-23 00:41:13 | 只看该作者
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

点评

甚至还可以扩展用于识别事件注释或区域编号,进行过滤、筛选判定,比如“泥沼”环境不允许建筑  发表于 2024-1-23 00:43
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-27 21:48

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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