设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2404|回复: 10
打印 上一主题 下一主题

[已经解决] 改变战斗图位置

[复制链接]

Lv3.寻梦者

梦石
0
星屑
3186
在线时间
1863 小时
注册时间
2010-6-19
帖子
1205
跳转到指定楼层
1
发表于 2022-5-20 10:02:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
我想设置一个效果,战斗的时候角色战斗坐标会移动几步,然后在定位在一个坐标上,然后在进入正常战斗。

战斗显示用活动块在这里
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


问题出现了,画面最后会一直刷新,而且一直卡顿,坐标移动的效果好像是出来了,难道不应该是这样吗???

Lv3.寻梦者

梦石
0
星屑
4481
在线时间
380 小时
注册时间
2012-11-8
帖子
272
2
发表于 2022-5-20 10:48:18 | 只看该作者
根据你的描述,你不应该直接去改update,而是应该在战斗前,生成Sprite_Battler的实例对象后去修改实例对象的x,y,再update
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3186
在线时间
1863 小时
注册时间
2010-6-19
帖子
1205
3
 楼主| 发表于 2022-5-20 12:56:01 | 只看该作者
qq634488405 发表于 2022-5-20 10:48
根据你的描述,你不应该直接去改update,而是应该在战斗前,生成Sprite_Battler的实例对象后去修改实例对象 ...

不太懂脚本,大概应该怎么弄
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4481
在线时间
380 小时
注册时间
2012-11-8
帖子
272
4
发表于 2022-5-20 13:27:52 | 只看该作者
本帖最后由 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. # 后面略
复制代码
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3186
在线时间
1863 小时
注册时间
2010-6-19
帖子
1205
5
 楼主| 发表于 2022-5-20 23:17:18 | 只看该作者
qq634488405 发表于 2022-5-20 13:27
Sprite_Battler里添加实例变量
attr_accessor :offset_x
attr_accessor :offset_y

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

改变战斗图位置.rar (187.58 KB, 下载次数: 11)
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4481
在线时间
380 小时
注册时间
2012-11-8
帖子
272
6
发表于 2022-5-21 00:32:40 | 只看该作者
本帖最后由 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
复制代码

评分

参与人数 2星屑 +100 +2 收起 理由
guoxiaomi + 100 + 1 认可答案
alexncf125 + 1 良心工具人

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3186
在线时间
1863 小时
注册时间
2010-6-19
帖子
1205
7
 楼主| 发表于 2022-5-21 08:46:51 | 只看该作者
qq634488405 发表于 2022-5-21 00:32
Scene_Battle 1里initialize中# 生成活动块

放到start_phase1前面

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

改变战斗图位置.rar (188.11 KB, 下载次数: 9)
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4481
在线时间
380 小时
注册时间
2012-11-8
帖子
272
8
发表于 2022-5-21 09:30:28 | 只看该作者
黑米馒头 发表于 2022-5-21 08:46
已经看到效果了,不过有个BUG,在地图上面遇到明雷的话,开始战斗,会先显示一段人物战斗图移动的效果, ...

我上面的表述有些错误,Scene_Battle里不需要initialize,把initialize方法删了就好
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3186
在线时间
1863 小时
注册时间
2010-6-19
帖子
1205
9
 楼主| 发表于 2022-5-21 09:59:33 | 只看该作者
qq634488405 发表于 2022-5-21 09:30
我上面的表述有些错误,Scene_Battle里不需要initialize,把initialize方法删了就好 ...

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

点评

Spriteset_Battle.new的时机变了,原本是所有画面准备好了再Graphics.transition,现在战斗图背景等是在Graphics.transition后出现  发表于 2022-5-21 14:00
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3186
在线时间
1863 小时
注册时间
2010-6-19
帖子
1205
10
 楼主| 发表于 2022-5-22 12:20:04 | 只看该作者
qq634488405 发表于 2022-5-21 09:30
我上面的表述有些错误,Scene_Battle里不需要initialize,把initialize方法删了就好 ...

感谢 完美解决
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-1 05:13

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表