Project1

标题: 改变地图事件的图片 [打印本页]

作者: sblkhgm    时间: 2012-11-26 21:17
标题: 改变地图事件的图片
本帖最后由 sblkhgm 于 2012-11-27 14:19 编辑

问下改变地图事件的图片和事件的朝向 用脚本是怎么写的 这个

作者: 匈魔剑    时间: 2012-11-27 20:38
本帖最后由 匈魔剑 于 2012-11-27 20:47 编辑

改变图片这个没有现成的方法,所以要在Game_Character类里现写一个方法
我写了一个,你可以根据自己的需要来完善
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 手动改变角色图形★
  3.   #--------------------------------------------------------------------------
  4.   def changeCharPic(picName, hue, patt)
  5.     @tile_id = 0
  6.     @character_name = picName if picName!=nil
  7.     @character_hue = hue if hue!=nil
  8.     @pattern  = patt if patt!=nil
  9.     @original_pattern = patt if patt!=nil
  10.   end
picName 就是行走图的文件名
hue是色相,看帮助文档,好像范围是0-360……我没研究过,你可以试试。
patt是图案。范围是0-3,你知道的,行走图在一个方向有四个图案。直立、伸左腿、迈右键……
我写成这三个值都支持nil,当输入nil时,对应的不变。比如只改变角色图形,但是不想改变色相和图案……
其实这方法的目的就是改@character_name @character_hue  @pattern 这三个值,你嫌麻烦的话也可以直接把它们改成attr_accssor,然后在外面任何一个类里都可以直接chara.character_name="xxx"这样地改……

上面我写的这个方法使用的时候,需要先得到对应的那个角色
举个例子,我写在Interpreter类里的话(或者写在事件的脚本里)
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 改变角色图形
  3.   # evtId - 事件ID
  4.   # picName - 行走图文件名
  5.   # hue - 行走图色相
  6.   # pattern - 行走图图案
  7.   #--------------------------------------------------------------------------
  8.   def bian(evtId, picName, hue, pattern)
  9.     chara = get_character(evtId)
  10.     chara.changeCharPic(picName, hue, pattern)
  11.   end

可以直接很方便地用里面的get_character这个方法,根据事件ID来获取当前地图上的角色。
但是如果想写在其他类里的话,就不能直接用这个方法了,不过可以搜一下这方法,看一下是怎么写的,很简单,就是从数组里拿个值而已……


改变方向就比较简单的,Game_Character里有现成的转向用的4个方法。turn_down turn_left turn_right turn_up
下面举个例子,也是写在Interpreter类里(或者写在事件的脚本里),注意也要先get_character。
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 改变角色方向
  3.   #--------------------------------------------------------------------------
  4.   def zhuan(evtId, dirt)
  5.     chara = get_character(evtId)
  6.     case dirt
  7.     when 2:
  8.       chara.turn_down
  9.     when 4:
  10.       chara.turn_left
  11.     when 6:
  12.       chara.turn_right
  13.     when 8:
  14.       chara.turn_up
  15.     end
  16.   end



然后在事件脚本里直接调用 bian和zhuan,就可以实现改角色图形和转向了。
范例,改的地方在脚本里有★:

Project1.rar

186.77 KB, 下载次数: 15


作者: sblkhgm    时间: 2012-11-28 13:25
匈魔剑 发表于 2012-11-27 20:38
改变图片这个没有现成的方法,所以要在Game_Character类里现写一个方法
我写了一个,你可以根据自己的需要 ...

太感谢了  能不能在离开这场景 然后回来时 他们的图片还是改变的哪张
作者: 匈魔剑    时间: 2012-11-28 14:21
本帖最后由 匈魔剑 于 2012-11-28 14:29 编辑
sblkhgm 发表于 2012-11-28 13:25
太感谢了  能不能在离开这场景 然后回来时 他们的图片还是改变的哪张


这样的话,就涉及到地图ID了……
所以需要在Game_Event里再重写一下changeCharPic方法(因为只有这个类里才有地图ID参数,主角类不需要有地图参数……), 如果想让主角的图形也可以像事件这样变,还需要再在Game_Player里也再重写一下这方法

我重写一下Game_Event里的,Game_Player的很简单,如果你有需要的话,就照着自己写吧

RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 手动改变事件角色图形 ★
  3.   #--------------------------------------------------------------------------
  4.   def changeCharPic(picName, hue, patt)
  5.     super(picName, hue, patt)
  6.     # 修正值存下来
  7.     $myCharPic = {} if $myCharPic==nil
  8.     key = "#{@map_id}-#{@id}"
  9.     $myCharPic[key] = [@character_name, @character_hue, @pattern]
  10.   end

就是把图形、色相、图案都存在一个叫$myCharPic的哈希表里。此表的key值是 地图ID-事件ID 这样的格式(如果在Game_Player里写的话,就不用这样麻烦的key了,直接一个"player"这种的key就行,因为主角是独一无二的……)

然后还得有一个从此哈希表中读取数据,替代当前数据的方法
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 对事件角色图形进行强制修正 ★
  3.   #--------------------------------------------------------------------------
  4.   def fixCharPic
  5.     return if $myCharPic==nil
  6.     key = "#{@map_id}-#{@id}"
  7.     return unless $myCharPic.has_key?(key)
  8.     value = $myCharPic[key]
  9.     changeCharPic(value[0], value[1], value[2])
  10.   end


这个方法要在Game_Event的refresh方法里调用一下(就加了一行,带★号的那行)
RUBY 代码复制
  1. (前略)
  2.     # 设置各实例变量
  3.     @tile_id = @page.graphic.tile_id
  4.     @character_name = @page.graphic.character_name
  5.     @character_hue = @page.graphic.character_hue
  6.     if @original_direction != @page.graphic.direction
  7.       @direction = @page.graphic.direction
  8.       @original_direction = @direction
  9.       @prelock_direction = 0
  10.     end
  11.     if @original_pattern != @page.graphic.pattern
  12.       @pattern = @page.graphic.pattern
  13.       @original_pattern = @pattern
  14.     end
  15.     fixCharPic # ★在此修正
  16.     @opacity = @page.graphic.opacity
  17.     @blend_type = @page.graphic.blend_type
  18.     @move_type = @page.move_type
  19.     @move_speed = @page.move_speed
  20. (后略)



这样就可以了。
如果想让这个在存档读档之后仍然有效,记得也要把这个全局哈希表在存档时存下来。这个挺简单的……应该不用我写了……

不过这样的话还有一个小问题,就是这个fixCharPic的优先级变得非常高,被你用脚本改过之后的事件,以后再想用事件改恐怕也改不了了= =
所以最好再写一个用来释放它的方法,可以让一切恢复正常。作用就是将储存的数据从$myCharPic里删掉,让一切恢复正常
举个例子
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 删除储存的修正值,使一切恢复正常 ★
  3.   #--------------------------------------------------------------------------
  4.   def delCharPic
  5.     return if $myCharPic==nil
  6.     key = "#{@map_id}-#{@id}"
  7.     return unless $myCharPic.has_key?(key)
  8.     $myCharPic.delete(key)
  9.   end


或者你也可以自己加些if else什么的控制一下……
根据实际需要弄吧
写好Game_Event之后的范例:
手动改变角色图片方向.rar (377.33 KB, 下载次数: 16)

作者: Wind2010    时间: 2012-12-1 11:53
直接独立开关+新事件页不行么→ →




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