Project1

标题: 横版战斗动画 逆行九霄 突进+指令投 [打印本页]

作者: 89444640    时间: 2017-11-28 12:01
标题: 横版战斗动画 逆行九霄 突进+指令投
本帖最后由 89444640 于 2017-11-29 10:59 编辑

前情提要
https://rpg.blue/thread-404035-1-1.html
这个我就不做gif预览直接游戏里面整完了。面得浪费不必要的时间。
本来想周末能整出来,结果敌人的配合动作找不到了,于是现画……
从草图到画完整合15天……草图2小时,画像素15天,可见横版动画多费美工,可见认真画与草图的难易度差别多大,不算转身侧踢的和背面待机的几十帧,光这16帧,如果找人画……价格我只能呵呵呵了……根本给不起!!!
最后在游戏动画里面整合动作很高效,不到四十分钟。还包括音效,因为买的音效就是好用,就是用着痛快,就是没版权隐患,就是爽!可惜gif听不到声音。

为了能传附件,不得已压缩了,前面招式说明只留了1帧,想看自己暂定看。
以下是实际运行图像,原始素材就不发了。



光看gif感觉摔的还是不够狠,肯能是没音效造成的。就这样吧……


10楼更新了,用软件做特效增加打击感但是由于太大无法上传的版本,请自行下载观看 XD

作者: 御曹司    时间: 2017-11-28 12:32
好棒的效果啊~
作者: 89444640    时间: 2017-11-28 13:24
本帖最后由 89444640 于 2017-11-28 15:05 编辑
御曹司 发表于 2017-11-28 12:32
好棒的效果啊~

谢谢,可惜这么做太累人,两周一个招式,很多人一个月都可以出个游戏了 - -b
那个,画面震动得用公用事件,但是……我不知道怎么在播放动画中的某帧才能出现画面震荡- -b,确实如果有了震荡打击效果会更加强烈。

咳咳,话痨开始XD
按照格斗游戏的思路来做,确实是效果不错。
我敌人没好好画,而且受创动作不全,表演效果不完美,本来我记得画过一个击退的动作,但是死活找不到了,而且还没有旋转击飞,受创回到初始位置的动作,下蹲受创……所以打起来还是不太灵活。
而且因为敌人没有进攻动作,很多本来能画出来的受身技能都没法做(就是格斗的架招,被动技能,敌人攻击击中才触发)


要是能把敌人弄出来位移,就不用替身纯播片看了。

我刚才继续考虑了一下,因为系统限制,很难把敌人的图像不做出位移,虽然可以做出受创动作,但是却不能切换多种角度的受创动作来配合角色,只能用这种方式对模拟敌人进行攻击。

还可以前面画个前置动作,用跟灵梦那里学的“代形”符,先甩灵符贴敌方全体,把敌人变成这样,然后再对这个敌人进行攻击。


但是这样的话,动画有点太啰嗦了。如果系统没法继续弄得画,只能剧情说圆了。



作者: v2sam    时间: 2017-11-28 15:27
工作量加分666666666
作者: defisym    时间: 2017-11-28 16:22
本帖最后由 defisym 于 2017-11-28 16:25 编辑

嘛……仔细看了看,感觉在最后腿摔的部分力量感不太足
除了速度有些慢这一点之外,在半空中其实很难做出这样的动作
其实关于这个动作,做的华丽好看一些还是有参考的
比如下面这个

6R文件要求太小了,当然主要还是看最后一个动作

另外注意落地之后的烟尘,这也是打击感这种玄学的一部分
打击感粗略的分是三种,“力量感”“反馈”“特效”
女主角空中翻身的速度太慢,滞空时间和马里奥有一拼;再加上动作有些违反常理,就显得力量感不足而且有点“假”
反馈方面,因为敌人还没做所以也不好说什么……顺应“力”的方向是很重要的一环,朝右边踢人往左边倒肯定不可以
最后就是特效,除了闪光之类的,飚血啊,画面震动啊,画面暂停啊,落地的烟尘啊都算
好多动作游戏在你打中敌人的一瞬间动作都会有明显的暂停,告诉你“确实打到了”而不是软绵绵的推过去了
关于打击感的部分我也只能是扯淡,知乎上看到过一篇文章,上面好多东西都是凭印象复述的,刚才刻意去找了找没有找到ORZ……
看来收藏是一个好习惯啊!(逃




作者: 89444640    时间: 2017-11-28 17:12
本帖最后由 89444640 于 2017-11-29 10:57 编辑
defisym 发表于 2017-11-28 16:22
嘛……仔细看了看,感觉在最后腿摔的部分力量感不太足
除了速度有些慢这一点之外,在半空中其实很难做出这 ...

非常感谢~确实动画整合还是需要加强,素材够多能做出更好的效果……
这啥啥啥回旋摔就算了……这种旋转我好晕 - -b同样的还可以看下蚁人的女主角的夹脖子摔,那个我觉得更好看
然后腿的话可以看下美国队长的后脚跟踹- -b
本来就有心做个类似狂战传说的四天幻葬,各种角度踹8脚,超长强技……但是这又不是act - -b
要是能让玩家自己按键接着连还好,
←←+D  ↓↑+D  →↓↘+D   →↘↓↙←+D 然后可以连超必杀。
可惜就算能画出来,对应的程序我弄不出来。

照这样再画下去,主角格斗系腿技就更多了,我还是喜欢看用剑砍的- -b

这个动作其实不合理的,运动规律也不合理,这个简直就是接半边反弹的力量,带着角色和敌人一起过去,而且角色起身时候是向前的力,三次元人类不可能做出这种动作的。

但是,二次元嘛~咱们玩act跳跃后空中能转换方向谁都喜欢不是XD,为了手感,让物理规律妥协点吧XD

最根本原因,是因为我有前面侧踢没用上的动作素材,因为转角等各个原因,我预览的gif你没看见,测试了7、8种不同的方式,要不然这个摔应该是用脚夹起来空中转换,用前腿趴着着地的,一个是我为最初画这个目的就是为了要摔反向,如果动作合理,这个2P站位,起手又该背面朝着玩家了,

如果能听到音效,其实总的来说还是可以的,滞空时间是因为我哪个动作倒腾的,而且位置太难调了,正常运动规律应该是上升快速然后减速,有个空中停顿然后加速下落,为了让人看清楚故意拖长了滞空时间,按说这个时候如果是必杀技效果,加个红或者蓝的残影效果就好多了。

因为没看到素材,其实为了左右腿的遮挡,我把角色被遮挡的腿单独分出来了,如果加残影可能会很麻烦……
还是修理一下运动规律吧。
落地光效我故意像点的了,结果花小了,因为像素化的光效配合人物大多kof传统大小的,外加帧少……打击效果减弱了不少,实在不行我还是拿pi3特效堆一下吧,毕竟比手绘效率高太多了,落地的要是真画出很好看的效果,真的不比画个人物简单……我又不能用商业游戏成品素材,照着画又没意思,自己起个效果很难。

rpg暂停这个就免了……拖时间啊……效果好持续时间长的招式,虽然是好看,但是一定要限制使用机会。
毕竟不会只看一遍 - -b

力量感,动作起手后摇就是了
反馈,敌人受创动作
特效……好吧我需要一个特效师……真心好多软件合成效果画不出来啊……
真能手绘出各种华丽效果的是专业动画师--b

作者: soulsaga    时间: 2017-11-28 20:19
本帖最后由 soulsaga 于 2017-11-28 20:21 编辑

$game_screen.start_shake(SHAKE_POWER, SHAKE_SPEED, SHAKE_TIME)
LZ你要的画面震动脚本..可在事件脚本里用..
SHAKE_POWER = 震动强度 1-9
SHAKE_SPEED = 震动速度 1-9
SHAKE_TIME 震动持续时间
但是要在某帧震动倒是个难题..

作者: 鸟猫    时间: 2017-11-29 09:44
哇哦,这个好有意思,帧数已经挺高的了啊,赞一个
作者: fux2    时间: 2017-11-29 09:49
如果摔的过程改成一个稍微蓄力的感觉可能更好,
现在夹住头之后往后翻的过程敌人是跟着脚同步匀速后摔的,
如果人物后翻的前几帧不将敌人带起来,仅仅是人物自己后翻,接着一个超高速的发力将敌人带起,
让敌人以更快的速度追上后翻的主角,同时落地打击感应该会棒一点。
作者: 89444640    时间: 2017-11-29 10:48
本帖最后由 89444640 于 2017-11-29 10:57 编辑
fux2 发表于 2017-11-29 09:49
如果摔的过程改成一个稍微蓄力的感觉可能更好,
现在夹住头之后往后翻的过程敌人是跟着脚同步匀速后摔的,
...

按照您提示的这个方法会出现不同的效果,但是估计动作会缺帧,根据思路,可能不用投技,用上次的那个转身体力度更大,但是打的是角色朝向了,
这就相当于角色把敌人踹飞后反弹  →力 (咚) 力← 角色转身侧踢方向,两个相对的力造成的伤害更大。


如果角色动作够多,尝试拼接各种不同类型的招式真的挺好玩的XD


要不我发素材上来,尝试拼接一下,挺好玩的XD

已经按照6楼的思路拿软件做容易实现的光效,手绘我试了,好难,目前技术画不出来,落地时候的效果像砸碎一堆石头
因为光效不是像素的关系造成容量无法上传,传图床不安全,只能用附件卷轴压缩了。
02.part1.rar (2 MB, 下载次数: 74)

02.part2.rar (1006.85 KB, 下载次数: 69)


增加了落地时的闪烁以及敌人落地后的弹跳,其实最容易表现出力度的,是需要做落地时候的背景震动。





作者: soulsaga    时间: 2017-11-29 12:52
本帖最后由 soulsaga 于 2017-11-29 19:11 编辑

RUBY 代码复制
  1. SHAKEID = 2
  2. class Spriteset_Battle
  3.   #--------------------------------------------------------------------------
  4.   # ● 初始化变量
  5.   #--------------------------------------------------------------------------
  6.   alias initialize_SHAKE initialize
  7.   def initialize
  8.     $shake_frame = []
  9.     initialize_SHAKE
  10.   end
  11.   end
  12.  
  13. class Sprite_Battler < RPG::Sprite
  14.   #--------------------------------------------------------------------------
  15.   # ● 处理角色动作
  16.   #--------------------------------------------------------------------------
  17.   alias update_actor_SHAKE update_actor_animation
  18.   def update_actor_animation
  19.     $shake_index = @frame_index
  20.     for i in 0..$shake_frame.size-1
  21.     $game_system.battle_interpreter.setup($data_common_events[200].list, 0) if @frame_index == $shake_frame[i] and $se_skill_id and $data_skills[$se_skill_id].element_set.include?(SHAKEID)
  22.   end
  23.   if $fanime_frame_max == @frame_index
  24.     $shake_frame = []
  25.     end
  26.     update_actor_SHAKE
  27.   end
  28. #--------------------------------------------------------------------------
  29.   # ● 处理敌人动作
  30.   #--------------------------------------------------------------------------
  31.   alias update_enemy_SHAKE update_enemy_animation
  32.   def update_enemy_animation
  33.     $shake_index = @frame_index
  34.     for i in 0..$shake_frame.size-1
  35.     $game_system.battle_interpreter.setup($data_common_events[199].list, 0) if @frame_index == $shake_frame[i] and $se_skill_id and $data_skills[$se_skill_id].element_set.include?(SHAKEID)
  36.     end
  37.   if $fanime_frame_max == @frame_index
  38.     $shake_frame = []
  39.     end
  40.     update_enemy_SHAKE
  41.   end
  42. end



撸了个动画指定帧数触发震动..

事件脚本$shake_frame = [要震动的帧数,要震动的帧数,要震动的帧到指定帧数就会执行199和200号公共事..对应角色和敌人动画..
大概不能在最后2帧震动..
插入到MAIN上面

更新可以判断技能的属性触发震动..SHAKEID=你定义的属性ID


另外事件脚本用$shake_index == 当前动画帧数..


作者: fux2    时间: 2017-11-29 14:28
89444640 发表于 2017-11-29 10:48
按照您提示的这个方法会出现不同的效果,但是估计动作会缺帧,根据思路,可能不用投技,用上次的那个转身 ...

emmmmmmmmm,其实和我想的不大一样辣,不过比1楼的打击感好像强些。
作者: soulsaga    时间: 2017-11-29 19:05
本帖最后由 soulsaga 于 2017-11-29 19:32 编辑

找到个按键发动技能脚本..根据用法..或许可完成LZ要的中途输入指令发动超必杀..
RUBY 代码复制
  1. #==============================================================================
  2. # ■ XP-RGSS-33 コマンドスキル [Ver.2.3.0]          by Claimh
  3. #------------------------------------------------------------------------------
  4. #   コマンド入力によってスキルを発動させます。
  5. #   コマンド入力に失敗した場合、威力減少(&アニメーション変化)
  6. #==============================================================================
  7.  
  8. module CommandSkill
  9.   # キー簡易置き換え
  10.   A = Input::A            # キーボード:Z
  11.   B = Input::B            # キーボード:X
  12.   C = Input::C            # キーボード:C
  13.   X = Input::X            # キーボード:A
  14.   Y = Input::Y            # キーボード:S
  15.   Z = Input::Z            # キーボード:D
  16.   L = Input::L            # キーボード:Q
  17.   R = Input::R            # キーボード:W
  18.   UP = Input::UP
  19.   DOWN = Input::DOWN
  20.   LEFT = Input::LEFT
  21.   RIGHT = Input::RIGHT
  22.   RAND = "?"             # ランダムキー
  23. #==============================================================================
  24. # □ カスタマイズSTART
  25. #==============================================================================
  26.   # 1キーあたりの入力時間
  27.   KEY_SEC = 1.0
  28.  
  29.   # キー入力時に表示するバーのファイル名(Graphics/Windowskinsにインポート)
  30.   T_BAR_NAME = "bar"
  31.  
  32.   # コマンド表示タイプ
  33.   #   true :ゲームパッド式
  34.   #  false:キーボード式
  35.   KEY_TYPE = true
  36.  
  37.   # コマンド入力成功時に対象を全体化(true:有効|false:無効)
  38.   ALL_ATK = false
  39.   # 全体化するスキルID
  40.   ALL_ATK_SK = [57, 61]
  41.  
  42.   # 成功時のSE(nil:無効)
  43.   COMP_SE = "056-Right02"
  44.   # 失敗時のSE(nil:無効)
  45.   MISS_SE = "058-Wrong02"
  46.   # 失敗時に対象側アニメーションを変える(true:有効|false:無効)
  47.   MISS_ANIME = true
  48.  
  49.   # コマンド表示時の文字間隔
  50.   TEXT_W = 32
  51.  
  52.   # スキル設定
  53.   T_SKILL = {
  54.     #スキルID => [[キー1,キー2,・・・],失敗時の威力(%)(,失敗時のアニメID)]
  55.         1  => [[UP,DOWN], 0.0],
  56.         7  => [[UP,DOWN], 50],
  57.         8  => [[X,C,Z], 50],
  58.         9  => [[DOWN,X,A,B], 50],
  59.         10 => [[LEFT,UP], 50],
  60.         11 => [[L,X,R], 50],
  61.         12 => [[X,C,RIGHT,R], 50],
  62.         13 => [[UP,RIGHT], 50],
  63.         14 => [[L,Z,A], 50],
  64.         15 => [[R,X,X,DOWN], 50],
  65.         16 => [[DOWN, RIGHT], 50],
  66.         17 => [[A,B,C], 50],
  67.         18 => [[Y,X,DOWN,B], 50],
  68.         19 => [[LEFT,DOWN], 50],
  69.         20 => [[Z,Y,A], 50],
  70.         21 => [[B,C,X,L], 50],
  71.         22 => [[RIGHT,DOWN], 50],
  72.         23 => [[A,B,R], 50],
  73.         24 => [[X,Y,LEFT,R], 50],
  74.         25 => [[LEFT,RIGHT], 50],
  75.         26 => [[X,L,B], 50],
  76.         27 => [[LEFT,X,C,Z], 50],
  77.         28 => [[LEFT,DOWN], 50],
  78.         29 => [[C,X,A], 50],
  79.         30 => [[X,Z,C,UP], 50],
  80.         31 => [[UP,DOWN,X], 0],
  81.         32 => [[LEFT,RIGHT,L,R], 50],
  82.         57 => [[RAND, RAND], 10],
  83.         58 => [[C, X, UP], 50],
  84.         59 => [[A, UP, RIGHT, A], 50],
  85.         60 => [[Z, C, A, B], 50],
  86.         61 => [[X, RAND], 50],
  87.         62 => [[UP, X, DOWN], 50],
  88.         63 => [[LEFT, C, Y, A], 50],
  89.         64 => [[X, C, Y, A], 50],
  90.         65 => [[Y, A], 50],
  91.         66 => [[RIGHT, B, A], 50],
  92.         67 => [[LEFT, UP, Z, A], 50],
  93.         68 => [[Y, B, Y, A], 50],
  94.         69 => [[LEFT, A], 50],
  95.         70 => [[A, C, A], 50],
  96.         71 => [[B, B, A, A], 50],
  97.         72 => [[A, B, X, Y], 50],
  98.         73 => [[X, A], 50],
  99.         74 => [[Y, A, B], 50],
  100.         75 => [[LEFT, RIGHT, Y, A], 50],
  101.         76 => [[A, C, L, A], 50],
  102.         77 => [[R, X], 50],
  103.         78 => [[L, C, R], 50],
  104.         79 => [[LEFT, L, RIGHT, R], 50],
  105.         80 => [[C, C, Z, RIGHT], 50],
  106.         #100 => [[LEFT], 0,0],
  107.         101 => [[LEFT], 0,0]
  108.   }
  109.  
  110. #==============================================================================
  111. # □ カスタマイズEND
  112. #==============================================================================
  113.   R_KEYS = [A,B,C,X,Y,Z,L,R,UP,DOWN,LEFT,RIGHT] # ランダムキーに使うキー配列
  114.   #--------------------------------------------------------------------------
  115.   # ● キーリスト取得
  116.   #--------------------------------------------------------------------------
  117.   def self.get_key_list(skill_id)
  118.     return nil if T_SKILL[skill_id].nil?
  119.     return nil if T_SKILL[skill_id][0].nil?
  120.     return T_SKILL[skill_id][0]
  121.   end
  122.   #--------------------------------------------------------------------------
  123.   # ● ランダムキー変換
  124.   #--------------------------------------------------------------------------
  125.   def self.change_rand(list)
  126.     ret_list = []
  127.     for i in 0...list.size
  128.       ret_list.push(list[i] == RAND ? R_KEYS[rand(R_KEYS.size)] : list[i])
  129.     end
  130.     return ret_list
  131.   end
  132. end
  133.  
  134.  
  135.  
  136. #==============================================================================
  137. # ■ Input
  138. #==============================================================================
  139. module Input
  140.   module_function
  141.   #--------------------------------------------------------------------------
  142.   # ● 指定キー以外のキー入力判定
  143.   #--------------------------------------------------------------------------
  144.   def n_trigger?(num)
  145.     if trigger?(num)
  146.       return false
  147.     elsif trigger?(A) or trigger?(B) or trigger?(C) or
  148.           trigger?(X) or trigger?(Y) or trigger?(Z) or
  149.           trigger?(L) or trigger?(R) or
  150.           trigger?(UP) or trigger?(DOWN) or trigger?(RIGHT) or trigger?(LEFT)
  151.         return true
  152.     end
  153.     return false    # 未入力または使用しないキーの場合
  154.   end
  155.   #--------------------------------------------------------------------------
  156.   # ● キー変換テーブル(表示文字取得用)
  157.   #--------------------------------------------------------------------------
  158.   GP_KEY = {  # ゲームパッド用変換テーブル
  159.     A=>"A",B=>"B",C=>"C",X=>"X",Y=>"Y",Z=>"Z",L=>"L",R=>"R",
  160.     UP=>"↑",DOWN=>"↓",LEFT=>"←",RIGHT=>"→"
  161.   }
  162.   KB_KEY = {  # キーボード用変換テーブル
  163.     A=>"Z",B=>"X",C=>"C",X=>"A",Y=>"S",Z=>"D",L=>"Q",R=>"W",
  164.     UP=>"↑",DOWN=>"↓",LEFT=>"←",RIGHT=>"→"
  165.   }
  166.   def key_converter(key)
  167.     return CommandSkill::RAND if key == CommandSkill::RAND
  168.     # ゲームパッドタイプ
  169.     if CommandSkill::KEY_TYPE
  170.       ret = GP_KEY[key]
  171.     # キーボードタイプ
  172.     else
  173.       ret = KB_KEY[key]
  174.     end
  175.     return (ret == nil ? "" : ret )
  176.   end
  177. end
  178.  
  179.  
  180. #==============================================================================
  181. # ■ Window_KeyCounter
  182. #------------------------------------------------------------------------------
  183. #  進捗率を表示するバー
  184. #==============================================================================
  185. class Window_KeyCounter < Window_Base
  186.   #--------------------------------------------------------------------------
  187.   # ● オブジェクト初期化
  188.   #     key :キー配列
  189.   #--------------------------------------------------------------------------
  190.   def initialize
  191.     #p 111
  192.     super(0, 256, 150, 80)
  193.     self.contents = Bitmap.new(width - 32, height - 32)
  194.     self.opacity = 0
  195.     self.z = 1            # バトラーよりも奥に表示
  196.     refresh(0)
  197.   end
  198.   #--------------------------------------------------------------------------
  199.   # ● リフレッシュ
  200.   #       current = 進捗率(%)
  201.   #--------------------------------------------------------------------------
  202.   def refresh(current)
  203.     self.contents.clear
  204.     #draw_counter_bar(0, 0, 100-current)    # 進捗方向:←
  205.     draw_counter_bar(0, 0, current)         # 進捗方向:→
  206.   end
  207.   #--------------------------------------------------------------------------
  208.   # ● バー表示
  209.   #       x       : x表示位置
  210.   #       y       : y表示位置
  211.   #       current : 進捗率(%)
  212.   #--------------------------------------------------------------------------
  213.   def draw_counter_bar(x, y, current)
  214.     bitmap = RPG::Cache.windowskin(CommandSkill::T_BAR_NAME)
  215.     cw = bitmap.width * current / 100
  216.     ch = bitmap.height
  217.     src_rect = Rect.new(0, 0, cw, ch)
  218.     self.contents.blt(x, y, bitmap, src_rect)
  219.   end
  220. end
  221.  
  222. #==============================================================================
  223. # ■ Window_KeyCount
  224. #------------------------------------------------------------------------------
  225. #  入力するキーを表示するウィンドウ。
  226. #==============================================================================
  227. class Window_KeyCount < Window_Base
  228.   TEXT_H = 32   # 文字高さ
  229.   #--------------------------------------------------------------------------
  230.   # ● オブジェクト初期化
  231.   #     key :キー配列
  232.   #--------------------------------------------------------------------------
  233.   def initialize(key)
  234.     super(0, 220, 150, 80)
  235.     self.contents = Bitmap.new(width - 32, height - 32)
  236.     self.back_opacity = 160    # 半透明
  237.     self.z = 0            # 進捗バーよりも奥に表示
  238.     @key = key
  239.     @key_count = 0
  240.     refresh
  241.   end
  242.   #--------------------------------------------------------------------------
  243.   # ● リフレッシュ
  244.   #--------------------------------------------------------------------------
  245.   def refresh
  246.     self.contents.clear
  247.     for i in 0...@key.size
  248.       x = i * CommandSkill::TEXT_W    # 文字間の間隔
  249.       if i < @key_count
  250.         self.contents.font.color = knockout_color
  251.       else
  252.         self.contents.font.color = normal_color
  253.       end
  254.       self.contents.draw_text(x, 0, 100, TEXT_H, Input.key_converter(@key[i]))
  255.     end
  256.   end
  257.   #--------------------------------------------------------------------------
  258.   # ● キーカウント
  259.   #--------------------------------------------------------------------------
  260.   def key_in
  261.     @key_count += 1
  262.     refresh
  263.   end
  264.   #--------------------------------------------------------------------------
  265.   # ● テキスト表示
  266.   #       text : テキスト
  267.   #--------------------------------------------------------------------------
  268.   def text_in(text)
  269.     self.contents.clear
  270.     self.contents.draw_text(0, 0, 100, TEXT_H, text, 1)
  271.   end
  272. end
  273.  
  274.  
  275. #==============================================================================
  276. # ■ Game_Battler
  277. #==============================================================================
  278. class Game_Battler
  279.   attr_accessor   :cmd_miss_flag  # コマンド入力ミス
  280.   #--------------------------------------------------------------------------
  281.   # ● オブジェクト初期化
  282.   #--------------------------------------------------------------------------
  283.   alias initialize_cmd_skill initialize
  284.   def initialize
  285.     initialize_cmd_skill     # 原物
  286.     @cmd_miss_flag = false
  287.     $csk = 1
  288.   end
  289.   #--------------------------------------------------------------------------
  290.   # ● スキルの効果適用
  291.   #     user  : スキルの使用者 (バトラー)
  292.   #     skill : スキル
  293.   #--------------------------------------------------------------------------
  294.   alias skill_effect_cmd_skill skill_effect
  295.   def skill_effect(user, skill)
  296.     if $scene.is_a?(Scene_Battle) and user.cmd_miss_flag
  297.       skill_copy = $data_skills[skill.id].dup
  298.       skill.power = skill.power * CommandSkill::T_SKILL[skill.id][1] / 100
  299.       skill.hit = 0 if skill.power == 0   # 威力0で命中しない補正
  300.     end
  301.     ret = skill_effect_cmd_skill(user, skill)
  302.     if $scene.is_a?(Scene_Battle) and user.cmd_miss_flag
  303.       user.cmd_miss_flag = false
  304.       $data_skills[skill.id] = skill_copy.dup
  305.     end
  306.     return ret
  307.   end
  308. end
  309.  
  310.  
  311. #==============================================================================
  312. # ■ Scene_Battle
  313. #==============================================================================
  314. class Scene_Battle
  315.   #--------------------------------------------------------------------------
  316.   # ● CMD Skill初期化
  317.   #--------------------------------------------------------------------------
  318.   def init_cmd_skill
  319.     @active_battler.cmd_miss_flag = false
  320.     @cmd_skill_ok = false
  321.     @cmd_skill_miss_flag = false
  322.   end
  323.   #--------------------------------------------------------------------------
  324.   # ● CMD Skill実行可能?
  325.   #--------------------------------------------------------------------------
  326.   def cmd_skill_enable?(skill_id)
  327.     # エネミーは不可
  328.     return false if @active_battler.is_a?(Game_Enemy)
  329.     # データなし
  330.     return false if CommandSkill.get_key_list(skill_id).nil?
  331.     # 閃き時コマンドなし
  332.     return false if defined?(SysFlash) and @active_battler.flash_flg
  333.     # 強制アクションでなければ
  334.     unless @active_battler.current_action.forcing
  335.       # SP 切れなどで使用できなくなった場合
  336.       unless @active_battler.skill_can_use?(skill_id)
  337.         # アクション強制対象のバトラーをクリア
  338.         $game_temp.forcing_battler = nil
  339.         return false
  340.       end
  341.     end
  342.     return true
  343.   end
  344.   #--------------------------------------------------------------------------
  345.   # ● CMD Skill前処理
  346.   #--------------------------------------------------------------------------
  347.   def pre_cmd_skill
  348.     init_cmd_skill
  349.     $csk = @active_battler.current_action.skill_id
  350.     skill_id = @active_battler.current_action.skill_id
  351.     return unless cmd_skill_enable?(skill_id)
  352.     # コマンドスキル発動
  353.     make_cmd_skill_skill_result(skill_id)
  354.     #skill_update_phase4_step3(skill_id)
  355.     # 全体化
  356.     if CommandSkill::ALL_ATK and @cmd_skill_ok
  357.       if CommandSkill::ALL_ATK_SK.include?(skill_id)
  358.         @skill_copy = @skill.dup
  359.         @skill.scope = 2
  360.       end
  361.     end
  362.   end
  363.   #--------------------------------------------------------------------------
  364.   # ● CMD Skill後処理
  365.   #--------------------------------------------------------------------------
  366.   def after_cmd_skill
  367.     if CommandSkill::ALL_ATK and @cmd_skill_ok
  368.       if CommandSkill::ALL_ATK_SK.include?(@skill_copy.id)
  369.         @skill = $data_skills[@skill_copy.id] = @skill_copy
  370.       end
  371.     end
  372.     # Miss時にアニメーションを変える
  373.     if CommandSkill::MISS_ANIME and @cmd_skill_miss_flag
  374.       unless CommandSkill::T_SKILL[@skill.id][2].nil?
  375.         @animation1_id = CommandSkill::T_SKILL[@skill.id][1]
  376.         @animation2_id = CommandSkill::T_SKILL[@skill.id][2]
  377.       end
  378.     end
  379.     init_cmd_skill
  380.   end
  381.   #--------------------------------------------------------------------------
  382.   # ● コマンドスキル Window X位置取得
  383.   #--------------------------------------------------------------------------
  384.   def cmd_skill_window_x
  385.     #「戦闘位置補正」併用時にコメント外す
  386.     #case $game_party.actors.size
  387.     #when 1
  388.     #  actor_x = 240
  389.     #when 2
  390.     #  actor_x = @active_battler.index * 240 + 120
  391.     #when 3
  392.     #  actor_x = @active_battler.index * 200 + 40
  393.     #when 4
  394.       actor_x = @active_battler.index * 160
  395.     #end
  396.     return actor_x
  397.   end
  398.   #--------------------------------------------------------------------------
  399.   # ● コマンドスキル コマンド入力ループUPDATE
  400.   #--------------------------------------------------------------------------
  401.   def cmd_skill_loop_update
  402.     Graphics.update
  403.     Input.update
  404.     @spriteset.update
  405.   end
  406.   #--------------------------------------------------------------------------
  407.   # ● コマンドスキル コマンド入力ループ
  408.   #--------------------------------------------------------------------------
  409.   def cmd_skill_loop(cmd_list, time)
  410.     key_count = 0
  411.     for i in 0...time
  412.       cmd_skill_loop_update
  413.       # キー入力に成功?
  414.       if Input.trigger?(cmd_list[key_count])
  415.         key_count += 1
  416.         @window_keycount.key_in
  417.       elsif Input.n_trigger?(cmd_list[key_count])   # 違うキーを押した
  418.         # Miss時 SE演奏
  419.         Audio.se_play("Audio/SE/" + CommandSkill::MISS_SE) if CommandSkill::MISS_SE != nil
  420.         break
  421.       end
  422.       # 全キー入力完了
  423.       if key_count >= cmd_list.size
  424.         @window_keycount.text_in("Complete")
  425.         # Complete時 SE演奏
  426.         Audio.se_play("Audio/SE/" + CommandSkill::COMP_SE) if CommandSkill::COMP_SE != nil
  427.         @cmd_skill_ok = true
  428.         break
  429.       end
  430.       # 進捗バーの更新
  431.       @window_counter.refresh((i*100/time).truncate)
  432.     end
  433.   end
  434.   #--------------------------------------------------------------------------
  435.   # ● コマンドスキル 結果作成
  436.   #--------------------------------------------------------------------------
  437.   def make_cmd_skill_skill_result(skill_id)
  438.     # コマンドリスト取得
  439.     cmd_list = CommandSkill.get_key_list(skill_id)
  440.     cmd_list = CommandSkill.change_rand(cmd_list)
  441.     time = CommandSkill::KEY_SEC * cmd_list.size * Graphics.frame_rate
  442.     # キー入力&カウントウィンドウ作成
  443.     @window_keycount = Window_KeyCount.new(cmd_list)
  444.     @window_counter = Window_KeyCounter.new
  445.     @window_keycount.x = @window_counter.x = cmd_skill_window_x
  446.     # コマンド入力ループ
  447.     cmd_skill_loop(cmd_list, time)
  448.     # ミス時は"Miss"表示
  449.     unless @cmd_skill_ok
  450.       @window_keycount.text_in("Miss")
  451.       @active_battler.cmd_miss_flag = true
  452.       @cmd_skill_miss_flag = true
  453.     end
  454.     # Miss、Complete表示用のウェイト
  455.     for i in 0...10
  456.       cmd_skill_loop_update
  457.     end
  458.     @window_keycount.dispose
  459.     @window_counter.dispose
  460.   end
  461. #------------------------------------------------------------------------------
  462.   #--------------------------------------------------------------------------
  463.   # ● スキルアクション 結果作成
  464.   #--------------------------------------------------------------------------
  465.   alias make_skill_action_result_cmd_skill make_skill_action_result
  466.   def make_skill_action_result
  467.     pre_cmd_skill
  468.     make_skill_action_result_cmd_skill   # 原物
  469.     after_cmd_skill
  470.   end
  471. end



用法..第1段技能调用公共事件强行行动用技能..然后这个强制技能的技能ID写在技能指令的列表里的话..输入命令后就可以发动技能了....

指令列表填RAND就是随机一个命令..可填多个..


美中不足的是..等待输入指令时..不会是播放动画中..





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