查看: 5833|回复: 12

[推荐问答] 请教如何在地图上生成事件

[复制链接]
梦石
0
星屑
995
在线时间
180 小时
注册时间
2013-2-16
回帖
146
发表于 2016-3-1 01:16:05 来自手机 | 显示全部楼层 |阅读模式

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

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

×
就是如何在游戏过程中生成事件(类似于复制粘贴),这样写
a=game_map.events[1]
a.x=1
a.y=1#都改成了访问
a.id =$game_map.events.keys.size +1
$game_map.events[$game_map.events.keys.size]=a
然而这样写却并没有用,请大神赐教。

评分

参与人数 1星屑 +100 收起 理由
RyanBern + 100 设置为推荐问答

查看全部评分

梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

发表于 2016-3-1 08:56:40 | 显示全部楼层
本帖最后由 RyanBern 于 2016-3-6 09:04 编辑

楼主这种写法是不对的。我给出一个例子,请试着模仿一下。

首先,我们必须确定这个事件生成在哪个地图上。在这里我们假定生成在当前地图上。

然后,最重要的一点,每张地图上的事件都有唯一一个指定的事件ID。这个ID原本是由地图编辑器给定。但是我们新生成的这个事件并不是编辑器指定(但是这个事件的内容要和编辑器中某事件的内容一样),因此我们需要为这个新的事件指定唯一的ID。当然我们可以手动指定,如果嫌麻烦我后面还有自动指定ID的方法。

复制事件不要用直接赋值的办法,我们必须通过调用Game_Event类的构造方法来生成它。生成的时候需要指定RPG::Event事件源。这个事件源被包在目标事件的内部,我们在外面无法获取,所以要更改类成员的读写权限。同样,事件ID这个属性也是不能直接修改,要新建一个方法来更改它。
[pre lang="Ruby"]class Game_Event
  attr_reader :event
  def set_id(new_id)
    @id = new_id
  end
end[/pre]

另外说一句,不要直接更改x和y属性,Game_Event类有专门的方法来处理事件的移动。$game_map.events是Hash表,不是数组,这点也需要注意。因此楼主的这个地方也有问题。

仅仅更改这个脚本是不够的,我们还需要同步地图的显示。这样做可以生成新的事件,但是无法将新事件显示在屏幕上。地图上所有的精灵对象是存放在Scene_Map里面一个名为@spriteset的变量里面,我们也要将新生成的事件所对应的精灵对象添加到这个对象中。为此我们需要再插入以下脚本:
[pre lang="Ruby"]class Spriteset_Map
  def add_character(ev)
    sprite = Sprite_Character.new(@viewport1, ev)
    @character_sprites << sprite
  end
end

class Scene_Map
  attr_reader :spriteset
end
[/pre]

有了上面的脚本后,我们可以写出复制事件的脚本(复制当前地图的1号事件到当前地图):
[pre lang="Ruby"]# 获取事件
ev = $game_map.events[1]
# 事件为空的情况下返回
return if ev.nil?
# 利用构造方法生成新事件
new_ev = Game_Event.new($game_map.map_id, ev.event)
# 自动获取新事件的ID
new_id = ((1..($game_map.events.keys.size+1)).to_a - $game_map.events.keys).min
# 设置新事件的ID和坐标
new_ev.set_id(new_id)
new_ev.moveto(new_x, new_y)
# 将新事件放入地图中
$game_map.events[new_id] = new_ev
# 同步地图显示
$scene.spriteset.add_character(new_ev)
# 强制地图刷新,保证事件出现
$game_map.need_refresh = true
[/pre]

点评

自己给def add_character(ev)加了个ID参数,已经搞定,多谢大佬的帖子  发表于 2020-1-17 23:56
运行时报错了,似乎是@character_sprites << sprite这一句,@character_sprites 是Hash型变量,不能用<<?  发表于 2020-1-17 22:25
这个脚本产生的事件也会消失的。  发表于 2016-4-17 17:45
能通过事件的脚本调用来实现这个功能吗?我有很多地图会因为无法放置足够多的事件而需要复制,而XAS的脚本产生的事件又会自动消失  发表于 2016-4-17 17:39
是的  发表于 2016-3-3 16:21

评分

参与人数 2星屑 +135 收起 理由
Vortur + 45 触瞎.正需此帖
没是的人 + 90 塞糖

查看全部评分

回复

使用道具 举报

梦石
0
星屑
995
在线时间
180 小时
注册时间
2013-2-16
回帖
146
 楼主| 发表于 2016-3-3 00:46:09 来自手机 | 显示全部楼层
RyanBern 发表于 2016-3-1 08:56
楼主这种写法是不对的。我给出一个例子,请试着模仿一下。

首先,我们必须确定这个事件生成在哪个地图上。 ...

十分感谢大大的教程,但是我的工程里使用后,发现事件的图片没有了,就是变成透明的,事件页,条件什么都完整得复制过来了,这是怎么回事呢?

点评

楼上已经更新  发表于 2016-3-3 16:41
只是事件的图片显示不出来了?内容还能执行?  发表于 2016-3-3 09:18
回复

使用道具 举报

梦石
0
星屑
1232
在线时间
1017 小时
注册时间
2011-4-30
回帖
1464
发表于 2016-3-3 07:34:45 | 显示全部楼层
回复

使用道具 举报

梦石
0
星屑
995
在线时间
180 小时
注册时间
2013-2-16
回帖
146
 楼主| 发表于 2016-3-6 01:49:08 来自手机 | 显示全部楼层
RyanBern 发表于 2016-3-1 08:56
楼主这种写法是不对的。我给出一个例子,请试着模仿一下。

首先,我们必须确定这个事件生成在哪个地图上。 ...


太感谢啦,已经成功了,还有哦,为了避免独立开关等其他操作的冲突,设置id 中最好加上@event.id=new_id哦
还有哦,应该是大大手误了吧,应该是@character_sprites.push(sprite)而不是ev 吧
总之非常感谢啦

点评

是的,笔误。第二个问题,set_id已经有设置新ID的作用了。  发表于 2016-3-6 09:05
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部