查看: 2918|回复: 5

[已经解决] 【地图问题*2】画面斜向卷动 与 滚动远景

[复制链接]
梦石
24
星屑
8942
在线时间
248 小时
注册时间
2020-12-4
回帖
259

极短24获奖极短23获奖极短22获奖

发表于 2022-10-31 15:09:09 | 显示全部楼层 |阅读模式

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

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

×
【问题一】
有没有办法将画面中心移动向指定的地图格子坐标呢,自带的只能竖向横向卷动,折线移动有点影响感观,希望能够直接直线移动镜头
另外,移动的速度能不能做线性参数,希望能有一个加速减速的过程,让过场镜头感加强
【问题二】
如何让远景图片随着某变量或参数滚动起来,且速度可调——如电梯场景,列车场景
梦石
0
星屑
42235
在线时间
6017 小时
注册时间
2006-11-10
回帖
6966
发表于 2022-10-31 15:31:10 | 显示全部楼层
本帖最后由 灯笼菜刀王 于 2022-10-31 15:32 编辑

一,  把 $game_player 透明, 然后丢到你要的坐标即可

二,  在Spriteset_Map 里 对  @panorama.ox 和 @panorama.oy 动手脚即可 , 同理, 移动镜头也一样可以对 @scroll_rest 动手脚(在Game_Map里),

评分

参与人数 2星屑 +50 赞 +1 收起 理由
RyanBern + 50 认可答案
纯属小虫 + 1 塞糖

查看全部评分

回复

使用道具 举报

梦石
24
星屑
8942
在线时间
248 小时
注册时间
2020-12-4
回帖
259

极短24获奖极短23获奖极短22获奖

 楼主| 发表于 2022-10-31 16:56:12 | 显示全部楼层
灯笼菜刀王 发表于 2022-10-31 15:31
一,  把 $game_player 透明, 然后丢到你要的坐标即可

二,  在Spriteset_Map 里 对  @panorama.ox 和 @pano ...

感谢,【问题二】好像有头绪了

【问题一】还有一些想要请教
用角色移动的方法的话,还得做一个跟角色行走图一样的事件在地图出现(如果画面卷洞的时候主角在场的话),而且角色移动好像只能45°的说......不过用跳跃的移动方式好像能够解决方向问题,但移动平滑变速还是没法搞定...
我有个思路,前辈看看可不可行
1、在Game_Map 定义一个 直接控制 @display_x 和 @display_y 变量的方法,自变量有【目标坐标】和【总体速度】
2、然后将这个方法置入到 update 里头去
3、随着帧数的变化,@display_x 和 @display_y 会向目标靠近,每一帧靠近的量会根据【总体速度】和【经过的距离】改变,从而达到先加速后减速的平滑镜头移动
回复

使用道具 举报

梦石
0
星屑
14720
在线时间
2175 小时
注册时间
2016-9-20
回帖
777
发表于 2022-10-31 21:35:26 | 显示全部楼层
我之前平滑移动也是研究了很久, 用了视野跟随脚本进行改装,
$game_player.centerNPC(id)  
id里写你视野要移到的NPC(或事件)
比如 $game_player.centerNPC(3) , 每触发一次该脚本, 画面中心视野就会渐渐靠向该地图的3号事件 , 而不是一下就移过去  , 你可以在update里放$game_player.centerNPC(3) 试试什么效果
而id = 0的情况, 也就是$game_player.centerNPC(0)  , 则画面中心视野马上转回主角 , 也是原来该脚本所带的效果, 注意注释有些只是我笔记跟脚本无关,
配合灯王那个思路, 可以把某事件透明化, 移动该事件, 再触发这个$game_player.centerNPC(该事件id)
理解我认为是比较难的,

要正式使用还得把游戏运行流程, 所以还是不指望你能够实际使用, 看你会
@display_x 和 @display_y 之类的, 看来你思路也是正确的, 实际使用就看你自己情况

89.gif
仅供参考

[pre lang="ruby"]#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================
#NPC视野
class Game_Player < Game_Character
  #--------------------------------------------------------------------------
  # ● 像通到画面中央一样的设置地图的显示位置
  #--------------------------------------------------------------------------
  def centerNPC(id)
    if id==0
    $目标视角=$game_player #可以使角色在粘在车子上
   
   
   
    max_x = ($game_map.width -  20) * 128
    max_y = ($game_map.height - 15) * 128
    $game_map.display_x = [0, [$game_player.real_x - CENTER_X, max_x].min].max #-1000 #加括号, 超出地图的坐标,同樣有效
    $game_map.display_y = [0, [$game_player.real_y - CENTER_Y, max_y].min].max #-1000
  else
   
    #$目标视角=$game_map.events[id]#可以使角色在粘在车子上 ,需单独使用(下面的就不需要)

    #max_x = ($game_map.width - 20) * 128
    #max_y = ($game_map.height - 15) * 128
    #$game_map.display_x = [0, [$game_map.events[id].real_x - CENTER_X, max_x].min].max
    #$game_map.display_y = [0, [$game_map.events[id].real_y - CENTER_Y, max_y].min].max

    #,#{a},#{a},
=begin ##粘車測試
  delay = 2 if delay == nil
  if delay < 2
    delay+1
    return false
    end
  if delay == 2
    #return true
    delay = 0
  end
=end
  #x_sub = $game_player.real_x - $game_map.events[id].real_x
  #y_sub = $game_player.real_y - $game_map.events[id].real_y


#=begin
  x_sub = ($game_map.display_x+128*8.5)  - $game_map.events[id].real_x
  y_sub = ($game_map.display_y+128*7)  - $game_map.events[id].real_y
#pst"#{($game_map.display_x+128*8.5)},#{$game_map.events[id].real_x}"
#x_sub-500減多少都无用
#y_sub-500
x_a = x_sub.abs #求绝对值相减(位移)
y_a = y_sub.abs


if  x_sub == 0 and y_sub == 0

end
sped = 10 #画面的移动速度
sped_x = ([x_a*0.2,60].min).to_i
#画面x的最大移动速度, 用x_a*0.2和60 两个值比较,取较小的值

sped_y = ([y_a*0.2,60].min).to_i

sped_x = 1 if x_a <sped #若画面的移动速度小于该速度最大值就变1, 不然一直画面跳动
sped_y = 1 if y_a <sped
    if  x_sub > 0 #目标事件在左边, 画面x轴向左移动
       $game_map.display_x-=sped_x#(x_sub.abs)
       #$game_map.scroll_left(x_sub.abs/128)
     else x_sub < 0 #目标事件在右边, 画面x轴向右移动
      # p 1
$game_map.display_x+=sped_x#(x_sub.abs)
#$game_map.scroll_right(x_sub.abs/128)
end


    if  y_sub>0 #目标事件在上边, 画面y轴向上移动
      $game_map.display_y-=sped_y#(y_sub.abs)
      #$game_map.scroll_up(y_sub.abs/128)
    else y_sub < 0 #目标事件在下边, 画面y轴向下移动
      #$game_map.scroll_down(y_sub.abs/128)
$game_map.display_y+=sped_y#(y_sub.abs)
end


#=end ##粘車測試 #可能不是漸移,不知
end

end  

end

#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================
=begin
__END__#没做延时移备份
  x_sub = ($game_map.display_x+128*8.5)  - $game_map.events[id].real_x
  y_sub = ($game_map.display_y+128*7)  - $game_map.events[id].real_y
pst"#{($game_map.display_x+128*8.5)},#{$game_map.events[id].real_x}"
#x_sub-500減多少都无用
#y_sub-500
x = x_sub.abs
y = y_sub.abs

if  x_sub = 0 and y_sub = 0
        break
end

    if  x_sub> 0 #在右边
      for i in 0...x
       $game_map.display_x-=1#(x_sub.abs)
       #$game_map.scroll_left(x_sub.abs/128)
       end
     else x_sub < 0
       for i in 0...x
$game_map.display_x+=1#(x_sub.abs)
#$game_map.scroll_right(x_sub.abs/128)
end
end


    if  y_sub>0 #在下边
      for i in 0...y
      $game_map.display_y-=1#(y_sub.abs)
      #$game_map.scroll_up(y_sub.abs/128)
      end
    else y_sub < 0
      for i in 0...y
      #$game_map.scroll_down(y_sub.abs/128)
$game_map.display_y+=1#(y_sub.abs)
end
=end[/pre]

评分

参与人数 2星屑 +50 赞 +1 收起 理由
RyanBern + 50 认可答案
纯属小虫 + 1 塞糖

查看全部评分

贴子只供参考我贴子内容有很多只是我自己标识的内容代指不是原来意思,偏向发贴当时的想法(后来回看贴发现有很多错误,会造成误导 ),如果想靠谱点应 找相关正确的文章   -- 2025/4/19
回复

使用道具 举报

梦石
24
星屑
8942
在线时间
248 小时
注册时间
2020-12-4
回帖
259

极短24获奖极短23获奖极短22获奖

 楼主| 发表于 2022-11-4 16:42:00 | 显示全部楼层
本帖最后由 纯属小虫 于 2022-11-4 18:35 编辑
ppspssss 发表于 2022-10-31 21:35
我之前平滑移动也是研究了很久, 用了视野跟随脚本进行改装,
$game_player.centerNPC(id)  
id里写你视野要 ...


hmmmmm...
抽空按照display_x,y 的思路写了一个补丁式的脚本,能直接黏贴在main之前用
能够直接平滑移动至指定的地图坐标位置(没有做过线矫正),算是能够在剧情过场的时候用了
分享顺便公开测试一下
镜头移动.gif
[fold=镜头平滑移动至坐标]
  1. =begin

  2. 【思路】:
  3.   通过直接控制 display_x 和 display_y 变量,从而直接控制镜头移动
  4.   做一个判定是否要控制移动 display_x 和 y 的方法然后放在update 里面
  5. 【实现方式】
  6.   在脚本中指定,镜头目标坐标,移动速度:目标坐标[12,7] 最大速度为每帧4个display单位     【速度为移动的最快速度,通常设成20比较合适】
  7.   $game_map.map_开启定向滚动([12,7], 4)

  8. =end

  9. class Game_Map
  10.   alias setup_自定义滚动 setup
  11.   def setup(map_id)
  12.     setup_自定义滚动(map_id)
  13.     @scroll_滚动目标 = [0,0]
  14.     @scroll_滚动速度max = [0,0]
  15.     @scroll_滚动速度 = [0,0]
  16.     @scroll_总滚动距离 = 0 # 为了减少计算量,这个按照X方向移动的距离来算
  17.     @scroll_已滚动距离 = 0 # 为了减少计算量,这个按照X方向移动的距离来算
  18.     @scroll_移动开关 = false
  19.   end

  20.   alias update_自定义滚动 update
  21.   def update
  22.     update_自定义滚动
  23.     map_定向滚动
  24.   end

  25.   # 用于在脚本中直接指定滚动条件的定义
  26.   def map_开启定向滚动(scroll_滚动目标 , scroll_滚动速度)
  27.     # 将地图坐标转换为镜头坐标
  28.     @scroll_滚动目标[0] = (scroll_滚动目标[0] - 9)*128 +64
  29.     @scroll_滚动目标[1] = (scroll_滚动目标[1] - 7)*128
  30.     # 计算X方向移动的总距离;归零记录移动的距离
  31.     @scroll_已滚动距离 = 0
  32.     @scroll_总滚动距离 = (@scroll_滚动目标[0] - @display_x).abs
  33.     #p @scroll_总滚动距离
  34.     #如果目标过于接近,则直接跳过,避免出错
  35.     return if @scroll_总滚动距离 <= 10
  36.     # 根据距离比例,来指定X方向和Y方向的最大速度;归零滚动速度 【最后那个是用来平衡距离对速度的影响的】
  37.     @scroll_滚动速度 = [0,0]
  38.     @scroll_滚动速度max[0] = scroll_滚动速度.to_f * 1 # (@scroll_滚动目标[0] - @display_x).abs  / (@scroll_滚动目标[0] - @display_x).abs
  39.     @scroll_滚动速度max[1] = scroll_滚动速度.to_f * (@scroll_滚动目标[1] - @display_y).abs  / (@scroll_滚动目标[0] - @display_x).abs
  40.     #p @scroll_滚动速度max
  41.     @scroll_移动开关 = true
  42.   end

  43.   # 如果镜头没有到达目标,则持续移动,移动到目标之后,则停止镜头的移动
  44.   def map_定向滚动
  45.     if @scroll_移动开关 == true # 当开关打开时才会进行移动判定,当接近指定位置时开关会关掉
  46.       # 判定变速,根据已经移动距离来变速,变速时长为10帧  所以总移动的时长尽量在20帧以上,不然容易出BUG 【/* 就是加速过程持续的时间】
  47.       if @scroll_已滚动距离 < 0.25 * @scroll_总滚动距离
  48.         @scroll_滚动速度[0] += @scroll_滚动速度max[0]/20
  49.         @scroll_滚动速度[1] += @scroll_滚动速度max[1]/20
  50.       elsif @scroll_已滚动距离 > 0.75 * @scroll_总滚动距离
  51.         @scroll_滚动速度[0] -= @scroll_滚动速度max[0]/20
  52.         @scroll_滚动速度[1] -= @scroll_滚动速度max[1]/20
  53.       end
  54.       # 当移动距离足够时,终止移动并校准
  55.       if @scroll_已滚动距离 > @scroll_总滚动距离
  56.         @display_x = @scroll_滚动目标[0]
  57.         @display_y = @scroll_滚动目标[1]
  58.         @scroll_移动开关 = false
  59.         return
  60.       end
  61.       # 矫正速度,最大不超过最大滚动速度 最小不低于1
  62.       @scroll_滚动速度[0] = [[@scroll_滚动速度max[0],@scroll_滚动速度[0]].min , 1].max
  63.       @scroll_滚动速度[1] = [[@scroll_滚动速度max[1],@scroll_滚动速度[1]].min , 1 * @scroll_滚动速度max[1]/@scroll_滚动速度max[0]].max
  64.       #p @scroll_滚动速度
  65.       # X向移动
  66.       if @display_x != @scroll_滚动目标[0]
  67.         if @display_x < @scroll_滚动目标[0]
  68.           @display_x += @scroll_滚动速度[0]
  69.         else
  70.           @display_x -= @scroll_滚动速度[0]
  71.         end
  72.       end
  73.       # Y向移动
  74.       if @display_y != @scroll_滚动目标[1]
  75.         if @display_y < @scroll_滚动目标[1]
  76.           @display_y += @scroll_滚动速度[1]
  77.         else
  78.           @display_y -= @scroll_滚动速度[1]
  79.         end
  80.       end
  81.       # 计算已滚动距离
  82.       @scroll_已滚动距离 += @scroll_滚动速度[0]
  83.     end
  84.   end
  85. end

  86. class Interpreter
  87.   # 滚动目标 就是 地图的 XY 坐标
  88.   def command_定向滚动(scroll_滚动目标=[0,0], scroll_滚动速度=0)
  89.     # 战斗中的情况下
  90.     if $game_temp.in_battle
  91.       # 继续
  92.       return true
  93.     end
  94.     # 已经在滚动中的情况下
  95.     if $game_map.scrolling?
  96.       # 结束
  97.       return false
  98.     end
  99.     # 开始滚动
  100.     $game_map.map_开启定向滚动(scroll_滚动目标, scroll_滚动速度)
  101.     # 继续
  102.     return true
  103.   end
  104. end
复制代码
[/fold]

另外:顺便把远景图片移动也做了个小脚本... ,实现了火车or飞船背景移动的效果
背景移动.gif
PS居然又一次自问自答了...
[fold=远景图片自动移动][pre lang="ruby"]=begin
  通过事件中的脚本,打开远景图片移动的开关,从而让远景图片持续移动
  Spriteset_Map 的update中,添加一个新的变量,为远景图片的积累移动量,每一帧都会增加(但是要考虑整数破限问题!)

  $game_map.panorama_移动状态更改(true, [5,0])
=end
# 添加变量至Game_Map类里面
class Game_Map
  attr_accessor :panorama_移动
  attr_accessor :panorama_累计移动
  attr_accessor :panorama_移动速度
  alias initialize_远景移动 initialize
  def initialize
    initialize_远景移动
    @panorama_移动 = false
    @panorama_移动速度 = [0,0]
  end

  alias setup_远景移动 setup
  def setup(map_id)
    setup_远景移动(map_id)
    @panorama_累计移动 = [0,0]
  end
end

class Spriteset_Map
  alias update_远景移动 update
  def update
    update_远景移动
    # 刷新远景地图
    panorama_update_new
  end
  # 重新定义刷新远景地图
  def panorama_update_new
    if $game_map.panorama_移动 == true
      $game_map.panorama_累计移动[0] += $game_map.panorama_移动速度[0]
      $game_map.panorama_累计移动[1] += $game_map.panorama_移动速度[1]
      @panorama.ox = $game_map.display_x / 8 + $game_map.panorama_累计移动[0] * 128 / 8
      @panorama.oy = $game_map.display_y / 8 + $game_map.panorama_累计移动[1] * 128 / 8
    end
  end
end

class Interpreter
  # 滚动目标 就是 地图的 XY 坐标
  def command_远景移动(switch = false, speed = [0,0])
    # 战斗中的情况下
    if $game_temp.in_battle
      # 继续
      return true
    end
    # 更改远景移动参数
    $game_map.panorama_移动 = switch
    $game_map.panorama_累计移动 = [0,0]
    $game_map.panorama_移动速度 = speed
    # 继续
    return true
  end
end[/pre][/fold]

点评

顺便把远景图片自动挪动也做了......hhh  发表于 2022-11-4 18:21

评分

参与人数 1赞 +1 收起 理由
89444640 + 1 塞糖

查看全部评分

回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部