Project1

标题: 可不可以让角色行走后面有脚印呢? [打印本页]

作者: 花开荼蘼    时间: 2012-8-3 22:18
标题: 可不可以让角色行走后面有脚印呢?
翻过置顶帖也搜索过相关问题,只找到XP版的
效果真好,NPC也可以有脚印~~不过VX的没找到……

如果谁知道VX的可不可以帮忙贴上来?^^

PS:可以的话……希望可以只是在特定图块里才有脚印这样……谢谢dsu_plus_rewardpost_czw
作者: 创造达人    时间: 2012-8-3 23:01
事件搞定
在后面放置脚印的行走图
好吧,无视我
作者: 八宝粥先生    时间: 2012-8-4 09:15
事件党路过:
为了防止地图脚印过多,多加点开关应该可以吧....
首先加10个脚印事件(不透明度0),出现条件为开关1-10
PS①:防止事件过多卡机,脚印事件可以设置为并行处理,内容为60帧后更改本事件不透明度为0,并关闭对应开关。
事件脚本分歧判定当角色移动时,判定角色的朝向,(当为上时,设置脚印事件为角色的X Y-1坐标)
(当为下时,设置脚印事件为角色的X Y+1坐标),(当为左时,设置脚印事件为角色的X+1 Y坐标)
,(当为右时,设置脚印事件为角色的X-1 Y坐标)具体设置哪个脚印事件则可以用条件分歧判定1-10
开关是否打开..优先选择数值低的开关打开,再更改对应脚印事件的不透明度为255,测试成功...
能看懂吧......
PS:你的追加效果可以用地形标志实现(我没试过)
作者: 花开荼蘼    时间: 2012-8-4 18:21
嗯……
事件的话有想过,但是太麻烦了,每个NPC和怪什么的都要用,而且并行事件太多会很卡吧?

还是比较想用脚本……
作者: devilg    时间: 2012-8-5 01:54
事件想得出来,那么脚本完全可以做得到的
请注意刚写的这个还是处于大部分完成阶段
测试时就是脚印位置错位,在下我实在是不想拿出标尺一pix一pix的量了/找xp的脚本了
哪位网友能帮忙修复一下在下十分感谢。
请直接无视f***等字样。
  1. =begin
  2. 用于vx的脚印系统
  3. copywrong DevilG 版权没有 翻版。。翻吧。

  4. ※※※※※※※BUG WARNING※※※※※※※
  5. 由于在下我对任何图形/动画类脚本都不擅长,目前脚印的出现位置错位
  6. (具体表现时地图最上一行是显示不出脚印的,左边第一行一半也没有)
  7. 如果您愿意修复这个bug,在下我十分感谢。
  8. 目前调整位置的地点是第106行。

  9. 使用方法:
  10. 将脚印图块按照下面的格式放置在游戏中。

  11. 格式-脚步图块:
  12. 最好与图块大小相同。(默认32*32)
  13. 放置于graphics/footstep文件夹内
  14. 文件名格式:人物图名_人物图位_方向(比如people1_3_2)
  15. 请注意方向的定位是2↓4←6→8↑.

  16. 扩展功能:
  17. 1秒脚印自动消失。(line93)
  18. 不同图块显示不同脚印。(line53)
  19. 不同人物显示不同脚印。(line58)
  20. 特殊情况不显示脚印。(line48)
  21. 需要更多扩展功能请pm我。

  22. 技术支持:
  23. 新建类似于sprite_character的类(sprite_footstep,实际上是直接copy过来的)
  24. 在人物移动时(通过increase_step增加判定开关)向后显示一个sprite_footstep.

  25. 兼容性技术支持:
  26. 对大规模更改表示界面的系统可能不支持。

  27. =end

  28. module Cache
  29.   def self.footstep(name)#增加了获取脚步图片的call。
  30. load_bitmap("Graphics/Footstep/", name)   
  31.     end
  32.   end

  33.   class Scene_Map < Scene_Base
  34.   attr_accessor:spriteset#好像没有用
  35. end
  36.   
  37. class Game_System
  38.   attr_accessor :no_footstep#不显示脚印的开关。
  39.   #打开方式:$game_system.no_footstep=true 关闭:换成false
  40.   def Footstepfilename(x,y,name,index,facing)
  41.     #获取脚步图块的call。
  42.     #facing:2↓4←6→8↑
  43.     case $game_map.data[x,y,0]#different footstep pattern casing tileID
  44.     #不同圖塊的腳步更新,因為data的Table格式還不清楚這裡不作處理
  45.     when 1
  46.     type = 1  
  47.   end
  48.   return "test_"+ facing.to_s#测试语句,使用时请删除
  49.     return name.to_s + "_"+index.to_s + "_" + facing.to_s
  50.   end
  51.   
  52.   alias initialize01 initialize#初始化无脚印开关的语句。
  53.   def initialize
  54.     initialize01
  55.     @no_footstep = false
  56.     end
  57.   
  58.   end
  59.   
  60.   class Game_Character
  61.     attr_accessor:shadowfuck#人物是否移动的boolean开关。
  62.    
  63.     alias increase_steps01 increase_steps
  64.     def increase_steps#移动时打开显示脚印开关。
  65.     increase_steps01
  66.     @shadowfuck=true
  67.   end
  68. end

  69. class Spriteset_Map
  70.   #--------------------------------------------------------------------------
  71.   # ● 初始化对像
  72.   #--------------------------------------------------------------------------
  73.   alias initialize01 initialize
  74.   def initialize#初始化包含脚印sprite的hash表。
  75.     @footstep = {}#hash list
  76.     initialize01
  77.     #hash表索引格式:key format: [x,y] content:sprite_footstep
  78.   end
  79.   
  80.   alias update01 update
  81.   def update
  82.     update01
  83.     #update_footstep #将此项前面的"#"删除打开1秒脚印消失的功能。
  84.   end
  85.   
  86.   def update_footstep #用于1秒脚印消失的call。如果1秒已过则删除脚印
  87.     for shit in @footstep.values
  88.       if shit.update
  89.         shit.dispose
  90.         shit = nil
  91.       end
  92.     end
  93.     end
  94.    
  95.   def push_step(x,y,type)#添加脚印的call。如果当前x,y有脚印且脚印类一样则不更新,否则更新脚印
  96. =begin
  97.     下面的语句用于调整脚印位置。
  98.     以下调整不能用:
  99.     y-=32
  100.     type的格式是:"name_index_direction"
  101.     direction信息可以通过删除两次"_"(type1 = type[type.index("_")+1,type.size-1]#这个语句可以删除一次"_")并to_i获得。
  102.     或者可以从源头添加direction信息。
  103.     参考预想的调整方式:
  104.     对direction不同进行x,y调整。(case direction并做处理)
  105. =end
  106.     y-=32#仅供测试使用,调整完毕请删除此行  
  107.     if @footstep[[x,y]]!=nil#如果当前x,y有脚印
  108.       if @footstep[[x,y]].name != type#脚印类不一样则清除当前脚印
  109.         @footstep[[x,y]].dispose
  110.         @footstep[[x,y]]=nil
  111.       else#且脚印类一样则不更新
  112.         return
  113.       end
  114.     end
  115.     @footstep[[x,y]]=Sprite_Footstep.new(x,y,type,@viewport1)#更新脚印
  116.   end
  117.   
  118.     def update_characters#若角色移动则提交更新脚印
  119.     for sprite in @character_sprites
  120.       shit = sprite.update
  121.       if shit != nil
  122.         push_step(shit[0],shit[1],shit[2])
  123.         end
  124.     end
  125.   end
  126.   
  127. end

  128. #==============================================================================
  129. # ■ Sprite_Character
  130. #------------------------------------------------------------------------------
  131. #  角色显示用脚本。监视 Game_Character 类的实例、自动变化脚本状态。
  132. #==============================================================================

  133. class Sprite_Footstep < Sprite_Base#脚印的sprite类。
  134. attr_accessor :name
  135.   #--------------------------------------------------------------------------
  136.   # ● 初始化对像
  137.   #     viewport  : 显示端口
  138.   #     character : 角色 (Game_Character)
  139.   #--------------------------------------------------------------------------
  140.   def initialize(x,y,fileName,viewport)
  141.     super(viewport)
  142.     @name = fileName
  143.     self.x = x
  144.     self.y = y
  145.     #self.z = 0
  146.     @duracell = 60#脚印的持续时间。每秒为60帧,目前设置为60帧
  147.     self.bitmap = Cache.footstep(fileName)
  148.   end
  149.   #--------------------------------------------------------------------------
  150.   # ● 更新画面
  151.   #--------------------------------------------------------------------------
  152.   def update#对持续时间的更新。返回true时由源头call解放sprite
  153.     if @duracell <= 0
  154.       return true
  155.     else
  156.       @duracell -= 1
  157.       return false
  158.       end
  159.   end
  160. end

  161. class Sprite_Character < Sprite_Base
  162.   alias update01 update
  163.   def update#如果角色移动过并显示脚步开关打开,则返回x,y,名称语句进行更新
  164.     shit = nil
  165.     shit = [self.x,self.y,$game_system.Footstepfilename(self.x,self.y,@character.character_name,@character.character_index,@character.direction)] if showFootstep?
  166.     update01
  167.     return shit
  168.   end
  169.   
  170.   def showFootstep?#判定是否显示脚步的boolean call。
  171.     return false if @character.character_name == ""
  172.     return false if $game_system.no_footstep
  173.     if @character.shadowfuck!=nil
  174.       @character.shadowfuck=nil
  175.       return true  
  176.       end
  177.     return false
  178.     end
  179.   end
复制代码

作者: devilg    时间: 2012-8-5 01:59
本帖最后由 devilg 于 2012-8-5 02:18 编辑

忘了加了测试效果和脚印图片。
P.S.我开始做时竟然还把类似画图的功能做出来了,不算太卡。没用shadowfuck开关,直接x,y更新,玩家就像一个笔刷刷过画面。
真正做出画图也是可以的,毕竟图块也是可以做出1*1pix大小,这样橡皮擦也能做了。。。(真无聊)

P.S2测试文件test_2,4,6,8都要放的
如果想做批量处理,在cache.footstep那里处理就可以了

test_2.png (3.3 KB, 下载次数: 31)

test_2.png

Untitled.png (104.54 KB, 下载次数: 27)

Untitled.png

作者: candy2266    时间: 2012-8-7 21:40
本帖最后由 candy2266 于 2012-8-7 21:42 编辑

可惜没的加分 很不错的想法 还有很不错的脚本。

我想到的是 在行走图中制作脚印 不过这样貌似不能产生透明度发生变化 直到消失的效果




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