Project1

标题: 请教如何在地图上生成事件 [打印本页]

作者: clear仔    时间: 2016-3-1 01:16
标题: 请教如何在地图上生成事件
就是如何在游戏过程中生成事件(类似于复制粘贴),这样写
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
然而这样写却并没有用,请大神赐教。
作者: RyanBern    时间: 2016-3-1 08:56
本帖最后由 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


作者: clear仔    时间: 2016-3-3 00:46
RyanBern 发表于 2016-3-1 08:56
楼主这种写法是不对的。我给出一个例子,请试着模仿一下。

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

十分感谢大大的教程,但是我的工程里使用后,发现事件的图片没有了,就是变成透明的,事件页,条件什么都完整得复制过来了,这是怎么回事呢?
作者: 汪汪    时间: 2016-3-3 07:34
https://rpg.blue/home.php?mod=sp ... o=blog&id=14127
作者: clear仔    时间: 2016-3-6 01:49
RyanBern 发表于 2016-3-1 08:56
楼主这种写法是不对的。我给出一个例子,请试着模仿一下。

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


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





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