Project1

标题: 改变战斗图位置 [打印本页]

作者: 黑米馒头    时间: 2022-5-20 10:02
标题: 改变战斗图位置
我想设置一个效果,战斗的时候角色战斗坐标会移动几步,然后在定位在一个坐标上,然后在进入正常战斗。

战斗显示用活动块在这里
class Sprite_Battler < RPG::Sprite

最后几行
    # 设置活动块的坐标
    self.x = @battler.screen_x
    self.y = @battler.screen_y
    self.z = @battler.screen_z
这里我知道这里是显示进入战斗时的坐标,然后

我的思路大概是这样:

# 设置活动块的坐标
然后先定义1个坐标
self.x = @battler.screen_x
self.y = @battler.screen_y
接着等待1秒 【等待1秒是想达到看起来连贯移动的效果....】
@wait_count = 40 【XP好像是40帧为1秒吧?】
修改坐标【在原坐标上减去数值,达到移动效果】
self.x = @battler.screen_x - 10
self.y = @battler.screen_y - 10
刷新画面
Graphics.update 【好像这样刷新是错误的,直接卡顿......】
然后开始重复几次,达到看起来有移动战斗图的效果

结果就是这样
# 设置活动块的坐标
self.x = @battler.screen_x
self.y = @battler.screen_y
self.z = @battler.screen_z
@wait_count = 40
self.x = @battler.screen_x - 10
self.y = @battler.screen_y - 10
Graphics.update
@wait_count = 40
self.x = @battler.screen_x - 10
self.y = @battler.screen_y - 10
Graphics.update
@wait_count = 40
self.x = @battler.screen_x - 10
self.y = @battler.screen_y - 10
Graphics.update
@wait_count = 40
self.x = @battler.screen_x - 10
self.y = @battler.screen_y - 10
Graphics.update
@wait_count = 40
self.x = @battler.screen_x - 10
self.y = @battler.screen_y - 10
Graphics.update


问题出现了,画面最后会一直刷新,而且一直卡顿,坐标移动的效果好像是出来了,难道不应该是这样吗???
作者: qq634488405    时间: 2022-5-20 10:48
根据你的描述,你不应该直接去改update,而是应该在战斗前,生成Sprite_Battler的实例对象后去修改实例对象的x,y,再update
作者: 黑米馒头    时间: 2022-5-20 12:56
qq634488405 发表于 2022-5-20 10:48
根据你的描述,你不应该直接去改update,而是应该在战斗前,生成Sprite_Battler的实例对象后去修改实例对象 ...

不太懂脚本,大概应该怎么弄
作者: qq634488405    时间: 2022-5-20 13:27
本帖最后由 qq634488405 于 2022-5-20 13:35 编辑
黑米馒头 发表于 2022-5-20 12:56
不太懂脚本,大概应该怎么弄


Sprite_Battler里添加实例变量
attr_accessor :offset_x
attr_accessor :offset_y
初始化里
@offset_x,@offset_y = 0
update里
self.x = @battler.screen_x + @offset_x
self.y = @battler.screen_y + @offset_y
在Spriteset_Battle的initialize方法
  1.     # 前面略
  2.     # 生成计时器块
  3.     @timer_sprite = Sprite_Timer.new
  4.     @before_battle = true
  5.     # 刷新画面
  6.     update
  7.     @before_battle = false
复制代码

初始化的时候指定@before_battle作为正式战斗开始前的标志
在Spriteset_Battle的update方法里根据@before_battle标志动作战斗图
在初始化的时候会调用一次update,此时会移动战斗图,初始化完成后@before_battle = false
  1.     # 前面略
  2.     # 刷新战斗者的活动块
  3.     for sprite in @enemy_sprites + @actor_sprites
  4.       if @before_battle
  5.         for i in 1..40
  6.           # 向左向上为减
  7.           sprite.offset_x -= 1
  8.           sprite.offset_y -= 1
  9.           sprite.update
  10.           Graphics.update
  11.         end
  12.       else
  13.         sprite.update
  14.       end
  15.     end
  16. # 后面略
复制代码

作者: 黑米馒头    时间: 2022-5-20 23:17
qq634488405 发表于 2022-5-20 13:27
Sprite_Battler里添加实例变量
attr_accessor :offset_x
attr_accessor :offset_y

大佬,按你的方法,进入战斗的时候战斗图是移动了几下,可是好像看不到移动的效果,而是直接显示移动结束的位置,如何做到能看到移动效果,就是进入战斗的时候,角色和敌人都移动几步,然后在开始战斗

改变战斗图位置.rar (187.58 KB, 下载次数: 11)
作者: qq634488405    时间: 2022-5-21 00:32
本帖最后由 qq634488405 于 2022-5-21 09:31 编辑
黑米馒头 发表于 2022-5-20 23:17
大佬,按你的方法,进入战斗的时候战斗图是移动了几下,可是好像看不到移动的效果,而是直接显示移动结束 ...


Scene_Battle 1里main中# 生成活动块这一段
  1. # 生成活动块
  2. @spriteset = Spriteset_Battle.new
复制代码

放到start_phase1前面
  1. @message_window = Window_Message.new
  2.     # 原来@spriteset = Sptiteset_Battle.new
  3.     # 初始化等待计数
  4.     @wait_count = 0
  5.     # 执行过渡
  6.     if $data_system.battle_transition == ""
  7.       Graphics.transition(20)
  8.     else
  9.       Graphics.transition(40, "Graphics/Transitions/" +
  10.         $data_system.battle_transition)
  11.     end
  12.     # 生成活动块
  13.     @spriteset = Spriteset_Battle.new
  14.     # 开始自由战斗回合
  15.     start_phase1
  16.     # 主循环
  17.     loop do
复制代码

这个是每个战斗图依次动,如果要所有战斗图一起动,Spriteset_Battle的update就这么写
  1. if @before_battle
  2.       for i in 1..40
  3.         for sprite in @enemy_sprites + @actor_sprites
  4.           # 向左向上为减
  5.           sprite.offset_x -= 1
  6.           sprite.offset_y -= 1
  7.           sprite.update
  8.         end
  9.         Graphics.update
  10.       end
  11.     else
  12.       for sprite in @enemy_sprites + @actor_sprites
  13.         sprite.update
  14.       end
  15.     end
复制代码

作者: 黑米馒头    时间: 2022-5-21 08:46
qq634488405 发表于 2022-5-21 00:32
Scene_Battle 1里initialize中# 生成活动块

放到start_phase1前面

已经看到效果了,不过有个BUG,在地图上面遇到明雷的话,开始战斗,会先显示一段人物战斗图移动的效果,然后进入战斗,然后又会在显示一段移动效果,接着出现战斗指令,如何把地图上的那一段效果去掉,直接就是战斗显示战斗图的移动效果~

改变战斗图位置.rar (188.11 KB, 下载次数: 10)
作者: qq634488405    时间: 2022-5-21 09:30
黑米馒头 发表于 2022-5-21 08:46
已经看到效果了,不过有个BUG,在地图上面遇到明雷的话,开始战斗,会先显示一段人物战斗图移动的效果, ...

我上面的表述有些错误,Scene_Battle里不需要initialize,把initialize方法删了就好
作者: 黑米馒头    时间: 2022-5-21 09:59
qq634488405 发表于 2022-5-21 09:30
我上面的表述有些错误,Scene_Battle里不需要initialize,把initialize方法删了就好 ...

把initialize删除了之后,进入已经基本完美了,就是有进入战斗的时候会黑屏一下,啥情况


作者: 黑米馒头    时间: 2022-5-22 12:20
qq634488405 发表于 2022-5-21 09:30
我上面的表述有些错误,Scene_Battle里不需要initialize,把initialize方法删了就好 ...

感谢 完美解决




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