Project1

标题: 战斗画面图片滚动的问题 [打印本页]

作者: serena718    时间: 2011-11-21 21:25
标题: 战斗画面图片滚动的问题
本帖最后由 serena718 于 2011-11-27 00:42 编辑


个人已经找出解决方案了!!请看5楼


我翻到了VX有个脚本可以在战斗画面上用图片显示雾的滚动
让画面看起来很有战场奔腾的感觉

我试着将他带入XP并做了些修改后
雾是有显示在画面上啦
但是不会动:'(

可以请各位帮忙看一下这段脚本有什么问题吗?
如果可以解决雾不会动的问题就更好了:loveliness:
  1. #==============================================================================
  2. # RGSS2_バトルミスト
  3. # tomoaky (http://hikimoki.hp.infoseek.co.jp/)
  4. #
  5. # 2010/03/29  ミストの表示サイズ等を少し変更
  6. # 2010/01/04  公開
  7. #
  8. # 戦闘シーンの背景に霧を表示するスクリプト素材です、
  9. # スクリプトエディタで "▼ 素材" の下あたりに挿入してください。
  10. # 動作には mist.拡張子 という画像ファイルが必要になります、
  11. # Graphics/System の中に置いてください。
  12. #==============================================================================

  13. #==============================================================================
  14. # □ 設定項目
  15. #==============================================================================
  16. module BMIST
  17.   SW_NOUSE = 18                           # 功能显示使用开关号码
  18. end

  19. #==============================================================================
  20. # ■ Sprite_Mist
  21. #==============================================================================
  22. class Sprite_Mist < Sprite
  23.   #--------------------------------------------------------------------------
  24.   # ● オブジェクト初期化
  25.   #--------------------------------------------------------------------------
  26.   def initialize(viewport)
  27.     super(viewport)
  28.     self.bitmap = RPG::Cache.picture("mist")
  29.     self.blend_type = 1
  30.     self.ox = 128
  31.     self.oy = 160
  32.     self.y = 480 - 128 - self.oy + rand(240)#32)
  33.     setup
  34.     self.x = rand(640)
  35.     @real_x = self.x << 10
  36.   end
  37.   #--------------------------------------------------------------------------
  38.   # ● セットアップ
  39.   #--------------------------------------------------------------------------
  40.   def setup
  41.     @vx = rand(512) + 512
  42.     self.zoom_x = (rand(600) + 700) / 1200.0
  43.     if self.zoom_x < 1.0    # バトラーの奥に配置
  44.       self.z = 2
  45.     else                    # バトラーの手前に配置
  46.       self.z = 400
  47.     end
  48.     self.zoom_y = self.zoom_x
  49.     self.x = 640 + (128 * self.zoom_x).to_i
  50.     @real_x = self.x << 10
  51.   end
  52.   #--------------------------------------------------------------------------
  53.   # ● 解放
  54.   #--------------------------------------------------------------------------
  55.   def dispose
  56.     self.bitmap.dispose
  57.     super
  58.   end
  59.   #--------------------------------------------------------------------------
  60.   # ● 更新
  61.   #--------------------------------------------------------------------------
  62.   def update
  63.     super
  64.     @real_x -= @vx
  65.     self.x = @real_x >> 10
  66.     setup if self.x < (0 - (128 * self.zoom_x).to_i)
  67.   end
  68. end

  69. #==============================================================================
  70. # ■ Spriteset_Battle
  71. #==============================================================================
  72. class Spriteset_Battle
  73.   #--------------------------------------------------------------------------
  74.   # ● バトルバックスプライトの作成
  75.   #--------------------------------------------------------------------------
  76.   alias bmist_spriteset_battle_initialize initialize
  77.   def initialize
  78.     bmist_spriteset_battle_initialize
  79.     @mist_sprites = []
  80.     unless $game_switches[BMIST::SW_NOUSE]
  81.       for i in 0..25 do @mist_sprites.push(Sprite_Mist.new(@viewport1)) end
  82.     end
  83.   end
  84.   #--------------------------------------------------------------------------
  85.   # ● バトルバックスプライトの解放
  86.   #--------------------------------------------------------------------------
  87.   alias bmist_spriteset_battle_dispose dispose
  88.   def dispose
  89.     bmist_spriteset_battle_dispose
  90.     for sprite in @mist_sprites do sprite.dispose end
  91.   end
  92.   #--------------------------------------------------------------------------
  93.   # ● バトルバックの更新
  94.   #--------------------------------------------------------------------------
  95.   alias bmist_spriteset_battle_update update
  96.   def update
  97.     bmist_spriteset_battle_update
  98.     for sprite in @mist_sprites do sprite.update end
  99.   end
  100. end


复制代码
dsu_plus_rewardpost_czw
作者: serena718    时间: 2011-11-23 18:15
自顶下,等待高手解决
个人怀疑是update出了问题
问题是我完全看不出update哪里有问题了:'(

作者: serena718    时间: 2011-11-24 20:48
似乎是因为外来脚本插件有动到Spriteset_Battle 的部分
所以该脚本若放在外来脚本下
会发生sprite未被赋值的状况而出错
一开始我以为是for..i那边的问题
所以把initialize那边多定义了picture
可是还是出错
到底是该脚本的问题还是VX和XP的写法在这部分本身就有很大的差别?
可是不是同样是Ruby吗?不是应该一法通,万法通吗?
我已经风中凌乱了我……
个人是真的很想加这个效果在游戏里
如果可以希望有高手帮个忙看看……就算不能整合也点出我的盲点
拜托了……

作者: serena718    时间: 2011-11-26 04:54
这问题被我自己解决一半了
在插入部份的问题我改在Scene_Battle执行更新动作了
正常显示以及滚动效果都出来了,卡的问题也是还好……感觉fps并没有被拉很多……(可能因为才25个sprite吧……
但是剩下的问题就是在执行使用特技与物品时会停止update
我以为是loop do那边的关系可是看起又似乎没有……
往下找好像也找不到对于执行特技与物品时会停止循环的地方……
才刚解决完问题又出现一个问题,果真一波未平一波又起呀……

作者: serena718    时间: 2011-11-27 00:40
嗯……似乎真的被自己解决的差不多了(汗
楼上所说的问题也OK了,原因为外来脚本的写法不太一样
所以还是Loop do的问题,找一下他定义update的地方再做修改即可

这里说明一下我解决的方式
主要是将该脚本定义Spriteset_Battle的地方通通去掉,只留下上面的Sprite_Mist
然后在Scene_Battle的地方新增一个sprite即可

在Scene_Battle里def main找到生成其它窗口的部分加入
  1.     unless $game_switches[BMIST::SW_NOUSE]
  2.       @mist = []
  3.       for i in 0...25
  4.         @mist[i] = Sprite_Mist.new(@viewport1)
  5.       end
  6.     end
复制代码
然后在下面dispose的地方插入
  1.     for i in 0...25
  2.     @mist[i].dispose
  3.     end
复制代码
然后update的部分,为了能时刻更新窗口
所以直接在def main里找到刷新画面的部分
那里会有一个loop do的循环
在循环里插入
  1.       for i in 0...25
  2.       @mist[i].update
  3.       end
复制代码
执行刷新动作

至于下面的update类那边就不要再定义了
这样会变成重复刷新,很耗内存

这是我的解决方案,希望能给不懂的人一些帮助:loveliness:





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