Project1

标题: 【XP】阵法效果(战斗) [打印本页]

作者: 腐琴琴    时间: 2012-7-28 12:17
标题: 【XP】阵法效果(战斗)
本帖最后由 Sion 于 2013-12-16 23:03 编辑

  效果,战斗的时候使用一个特技,我方脚下出现法阵。用同类特技可以替换法阵图案和效果,战斗结束法阵消失(这个随意啦)。人物位置变化的话在最底下。
  这个应该还没人发过吧,因为我以前搜的时候没搜到,后来想了好久才懂的。所以肯定我不是百分百原创,看了教程(http://www.66rpg.com/articles/3242)。方法也肯定不是非常好的啦,不过可以凑合着用用。本人脚本无能,高手见谅……
  阵法的话我觉得默认的战斗模式就算了……四十五度或者横版可以用用看。以下效果图:
(不要吐槽范例各种简陋。其实范例为了压缩大小,三个阵法用了同一张图片,只是位置和浓淡不同而已。)



  于是有心情看下去的话下面是改法。依次是
    45度的改法(还是挺详细的啦,伪教程)、
    改过以后的脚本、
    范例工程、
    超级横版的改法(无工程无改过后的脚本)。
    位置改动法

[line]1[/line]
45度的改法
  两种战斗脚本改法不太一样,首先是45度(脚本来源:http://www.66rpg.com/articles/2862)的改法:
  因为45度脚本里面只是改了人物战斗图的位置和血条,和战斗背景那一块没什么关系,所以只要改原来的东西,不用改那个脚本。
首先是:

Spriteset_Battle

在这句脚本后面
  1. # 生成战斗背景活动块
  2.     @battleback_sprite = Sprite.new(@viewport1)
复制代码
加一句
  1. @magic_sprite = Sprite.new(@viewport1)
复制代码
因为是魔法阵嘛……所以就叫magic了,叫什么都可以啦,@xxx_sprite = Sprite.new(@viewport1)
然后是这里
  1. @battleback_sprite.dispose
复制代码
后面加一句释放一下。
  1.    @magic_sprite.dispose
复制代码
接下来在这句话后面
  1.       @battleback_sprite.bitmap = RPG::Cache.battleback(@battleback_name)
  2.       @battleback_sprite.src_rect.set(0, 0, 640, 480)
  3.     end
复制代码
加上
  1. case $game_variables[1] #改动
  2.       when 1
  3.         @magic_sprite.bitmap = RPG::Cache.autotile("1")  #图片名称
  4.         @magic_sprite.x = 148 #X坐标
  5.         @magic_sprite.y = 180 #Y坐标
  6.         @magic_sprite.opacity = 150 #不透明度
  7.       when 2
  8.         @magic_sprite.bitmap = RPG::Cache.autotile("2")
  9.         @magic_sprite.x = 240
  10.         @magic_sprite.y = 180
  11.         @magic_sprite.opacity = 255
  12.       when 3
  13.         @magic_sprite.bitmap = RPG::Cache.autotile("3")
  14.         @magic_sprite.x = 240
  15.         @magic_sprite.y = 180
  16.         @magic_sprite.opacity = 50
  17.     end
复制代码
$game_variables[1]中的1指的是1号变量, $game_variables[x]就是X号变量了。
原理很简单大家都知道啦,就是变量是1的时候显示1图片,2的时候显示名字是2的图片,当然图片名把引号里面的字改了就行了。
坐标和不透明度都是数字的事大家都懂的啦。至于阵法很多的话,后面复制黏贴按照这个格式 when 4就可以了。
接下来是

Scene_Battle 1

这里主要是为了战斗一开始的时候是没有阵法的,也就是变量是0,所以战斗结束后再把变量改成0。
  1. $scene = Scene_Map.new
复制代码
  1. $scene = Scene_Gameover.new
复制代码
上面来句
  1. $game_variables[1] = 0
复制代码
就可以了,这样第二次再战斗的时候,一开始是没有法阵的。
如果有阵法持续一辈子之类的,那这里就不用改了。

[line]1[/line]
脚本完毕,于是事件
主要就是布阵的人领悟一个技能,如图。

1、该技能附加一个阵法状态,并把其他阵法状态消去。
  这些状态改成“定量为0”,这样用了阵法以后状态的名字就不会显示出来。而且是不能抵抗。
  至于状态的其他就看阵法的效果了。如果想要队长和队友有不同效果我目前还没想法。
2、该技能联系一个公共事件,公共事件的内容就是改变变量1的值。

这样就算完成了。最后素材的话随便提一句:
@magic_sprite.bitmap = RPG::Cache.autotile("1")这句脚本的“autotile”说明图片放在“工程\Graphics\Autotiles”
我只是随手选了个文件夹而已,你可以新建文件夹,或者把它改成“battleback”什么的。
图片的素材的话我在6R上看到过一个华丽魔法阵,挺好的,现在我也不太清楚它在哪里= =。


于是就这样了。
[line]1[/line]
改过的脚本
下面是改过的Spriteset_Battle  “#改动”标记处
Scene_Battle 1要改的地方太少了我就不放了……
  1. #==============================================================================
  2. # ■ Spriteset_Battle
  3. #------------------------------------------------------------------------------
  4. #  处理战斗画面的活动块的类。本类在 Scene_Battle 类
  5. # 的内部使用。
  6. #==============================================================================

  7. class Spriteset_Battle
  8.   #--------------------------------------------------------------------------
  9.   # ● 定义实例变量
  10.   #--------------------------------------------------------------------------
  11.   attr_reader   :viewport1                # 敌人方的显示端口
  12.   attr_reader   :viewport2                # 角色方的显示端口
  13.   #--------------------------------------------------------------------------
  14.   # ● 初始化变量
  15.   #--------------------------------------------------------------------------
  16.   def initialize
  17.     # 生成显示端口
  18.     @viewport1 = Viewport.new(0, 0, 640, 480) #改动
  19.     @viewport2 = Viewport.new(0, 0, 640, 480)
  20.     @viewport3 = Viewport.new(0, 0, 640, 480)
  21.     @viewport4 = Viewport.new(0, 0, 640, 480)
  22.     @viewport2.z = 101
  23.     @viewport3.z = 200
  24.     @viewport4.z = 5000
  25.     # 生成战斗背景活动块
  26.     @battleback_sprite = Sprite.new(@viewport1)
  27.     @magic_sprite = Sprite.new(@viewport1) #改动
  28.     # 生成敌人活动块
  29.     @enemy_sprites = []
  30.     for enemy in $game_troop.enemies.reverse
  31.       @enemy_sprites.push(Sprite_Battler.new(@viewport1, enemy))
  32.     end
  33.     # 生成敌人活动块
  34.     @actor_sprites = []
  35.     @actor_sprites.push(Sprite_Battler.new(@viewport2))
  36.     @actor_sprites.push(Sprite_Battler.new(@viewport2))
  37.     @actor_sprites.push(Sprite_Battler.new(@viewport2))
  38.     @actor_sprites.push(Sprite_Battler.new(@viewport2))
  39.     # 生成天候
  40.     @weather = RPG::Weather.new(@viewport1)
  41.     # 生成图片活动块
  42.     @picture_sprites = []
  43.     for i in 51..100
  44.       @picture_sprites.push(Sprite_Picture.new(@viewport3,
  45.         $game_screen.pictures[i]))
  46.     end
  47.     # 生成计时器块
  48.     @timer_sprite = Sprite_Timer.new
  49.     # 刷新画面
  50.     update
  51.   end
  52.   #--------------------------------------------------------------------------
  53.   # ● 释放
  54.   #--------------------------------------------------------------------------
  55.   def dispose
  56.     # 如果战斗背景位图存在的情况下就释放
  57.     if @battleback_sprite.bitmap != nil
  58.       @battleback_sprite.bitmap.dispose
  59.     end
  60.     # 释放战斗背景活动块
  61.     @battleback_sprite.dispose
  62.     @magic_sprite.dispose #改动
  63.     # 释放敌人活动块、角色活动块
  64.     for sprite in @enemy_sprites + @actor_sprites
  65.       sprite.dispose
  66.     end
  67.     # 释放天候
  68.     @weather.dispose
  69.     # 释放图片活动块
  70.     for sprite in @picture_sprites
  71.       sprite.dispose
  72.     end
  73.     # 释放计时器活动块
  74.     @timer_sprite.dispose
  75.     # 释放显示端口
  76.     @viewport1.dispose
  77.     @viewport2.dispose
  78.     @viewport3.dispose
  79.     @viewport4.dispose
  80.   end
  81.   #--------------------------------------------------------------------------
  82.   # ● 显示效果中判定
  83.   #--------------------------------------------------------------------------
  84.   def effect?
  85.     # 如果是在显示效果中的话就返回 true
  86.     for sprite in @enemy_sprites + @actor_sprites
  87.       return true if sprite.effect?
  88.     end
  89.     return false
  90.   end
  91.   #--------------------------------------------------------------------------
  92.   # ● 刷新画面
  93.   #--------------------------------------------------------------------------
  94.   def update
  95.     # 刷新角色的活动块 (对应角色的替换)
  96.     @actor_sprites[0].battler = $game_party.actors[0]
  97.     @actor_sprites[1].battler = $game_party.actors[1]
  98.     @actor_sprites[2].battler = $game_party.actors[2]
  99.     @actor_sprites[3].battler = $game_party.actors[3]
  100.     # 战斗背景的文件名与现在情况有差异的情况下
  101.     if @battleback_name != $game_temp.battleback_name
  102.       @battleback_name = $game_temp.battleback_name
  103.       if @battleback_sprite.bitmap != nil
  104.         @battleback_sprite.bitmap.dispose
  105.       end
  106.       @battleback_sprite.bitmap = RPG::Cache.battleback(@battleback_name)
  107.       @battleback_sprite.src_rect.set(0, 0, 640, 480)
  108.     end
  109.     case $game_variables[1] #改动
  110.       when 1
  111.         @magic_sprite.bitmap = RPG::Cache.autotile("1")
  112.         @magic_sprite.x = 148
  113.         @magic_sprite.y = 180
  114.         @magic_sprite.opacity = 150
  115.       when 2
  116.         @magic_sprite.bitmap = RPG::Cache.autotile("1")
  117.         @magic_sprite.x = 240
  118.         @magic_sprite.y = 180
  119.         @magic_sprite.opacity = 255
  120.       when 3
  121.         @magic_sprite.bitmap = RPG::Cache.autotile("1")
  122.         @magic_sprite.x = 240
  123.         @magic_sprite.y = 180
  124.         @magic_sprite.opacity = 50
  125.     end
  126.     # 刷新战斗者的活动块
  127.     for sprite in @enemy_sprites + @actor_sprites
  128.       sprite.update
  129.     end
  130.     # 刷新天气图形
  131.     @weather.type = $game_screen.weather_type
  132.     @weather.max = $game_screen.weather_max
  133.     @weather.update
  134.     # 刷新图片活动块
  135.     for sprite in @picture_sprites
  136.       sprite.update
  137.     end
  138.     # 刷新计时器活动块
  139.     @timer_sprite.update
  140.     # 设置画面的色调与震动位置
  141.     @viewport1.tone = $game_screen.tone
  142.     @viewport1.ox = $game_screen.shake
  143.     # 设置画面的闪烁色
  144.     @viewport4.color = $game_screen.flash_color
  145.     # 刷新显示端口
  146.     @viewport1.update
  147.     @viewport2.update
  148.     @viewport4.update
  149.   end
  150. end
复制代码
以下范例,不带a的是纯加图片。
带a的是顺便发动阵法会改X坐标。
人物位置改法详见最下面。

Project8.rar (266.24 KB, 下载次数: 164)
Project8a.rar (266.29 KB, 下载次数: 143)
[line]1[/line]
最后是超级横版的改法的说明的超级简略版
因为超级横版里面改过: Spriteset_Battle,
所以原有的“ Spriteset_Battle”改完,在横版脚本里面涉及“ Spriteset_Battle“也要改。
(或者说,有些地方超级横版动过了,改原来的已经没用了。)
[line]1[/line]
位置的改法
关于人物位置变化45度战斗脚本还是比较容易实现的
当中有这样的语句
  1. case self.index
  2.         when 0
  3.           return 350
  4.         when 1
  5.           return 430
  6.         when 2
  7.           return 510
  8.         when 3
  9.           return 580
  10.         else
  11.           return 600
  12.         end
复制代码
这个是人物X坐标,在外面套个CASE语句就可以了。
  1. case $game_variables[1] #改动
  2.       when 0
  3.         case self.index
  4.         when 0
  5.           return 350
  6.         when 1
  7.           return 430
  8.         when 2
  9.           return 510
  10.         when 3
  11.           return 580
  12.         else
  13.           return 600
  14.         end
  15.       when 1
  16.         case self.index
  17.         when 0
  18.           return 200
  19.         when 1
  20.           return 300
  21.         when 2
  22.           return 400
  23.         when 3
  24.           return 500
  25.         else
  26.           return 600
  27.         end
  28.      when 2
  29.         case self.index
  30.         when 0
  31.           return 400
  32.         when 1
  33.           return 400
  34.         when 2
  35.           return 400
  36.         when 3
  37.           return 400
  38.         else
  39.           return 600
  40.         end
  41.      when 3
  42.         case self.index
  43.         when 0
  44.           return 200
  45.         when 1
  46.           return 400
  47.         when 2
  48.           return 200
  49.         when 3
  50.           return 400
  51.         else
  52.           return 600
  53.         end
  54.    end
复制代码
Y可以用同样的原理改。至于人物的位置就是数字慢慢调整的事情啦。

END……勿拍砖。


作者: zen7280110    时间: 2012-7-28 12:22
楼主有没有类似网游的阵法?例如梦幻西游用阵法在战斗时会改变人物排例循序
作者: oo888000oo    时间: 2012-7-28 13:38
本帖最后由 oo888000oo 于 2012-7-28 13:49 编辑

如果是全动画想用阵法改变它的位置须修改些什么添加些什么?
作者: 黄威华    时间: 2012-7-28 13:55
显示个阵法。有更好的效果。




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