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

Project1

 找回密码
 注册会员
搜索
查看: 4442|回复: 12

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

[复制链接]

Lv3.寻梦者

梦石
0
星屑
995
在线时间
180 小时
注册时间
2013-2-16
帖子
176
发表于 2016-3-1 01:16:05 手机端发表。 | 显示全部楼层 |阅读模式

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

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

x
就是如何在游戏过程中生成事件(类似于复制粘贴),这样写
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 设置为推荐问答

查看全部评分

Lv4.逐梦者 (版主)

梦石
0
星屑
9467
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

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

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

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

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

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


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

仅仅更改这个脚本是不够的,我们还需要同步地图的显示。这样做可以生成新的事件,但是无法将新事件显示在屏幕上。地图上所有的精灵对象是存放在Scene_Map里面一个名为@spriteset的变量里面,我们也要将新生成的事件所对应的精灵对象添加到这个对象中。为此我们需要再插入以下脚本:
RUBY 代码复制
  1. class Spriteset_Map
  2.   def add_character(ev)
  3.     sprite = Sprite_Character.new(@viewport1, ev)
  4.     @character_sprites << sprite
  5.   end
  6. end
  7.  
  8. class Scene_Map
  9.   attr_reader :spriteset
  10. end


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

点评

自己给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 塞糖

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者

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

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

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

点评

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

使用道具 举报

Lv3.寻梦者

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

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
995
在线时间
180 小时
注册时间
2013-2-16
帖子
176
 楼主| 发表于 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
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-19 10:12

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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