Project1

标题: 【行走图动画扩展】八方向|奔跑|待机|多帧 [打印本页]

作者: VIPArcher    时间: 2015-11-30 01:25
标题: 【行走图动画扩展】八方向|奔跑|待机|多帧
本帖最后由 VIPArcher 于 2019-7-29 10:04 编辑
1.5新版本 (使用多文件以后缀名区分姿势)
1.0旧版本 (各姿势素材在同一张行走图上)

有啥问题就直接回帖子反馈吧,我没素材进行测试,理论上应该是可以玩了。
配一张瞎糊的测试用素材(1.0版本使用)

1.5版本素材规格参考这个帖子:
https://rpg.blue/thread-411249-1-1.html

VIPArcher_Character_Animations.zip

2.05 KB, 下载次数: 1688

js文件


作者: doranikofu    时间: 2015-11-30 01:39
那啥文件名前缀特殊符号好像挺多内置设定的
用%前缀 貌似跟随人物关闭之后还是会显示而且显示出错 都改成数字前缀了不敢随便用特殊符号了
作者: doranikofu    时间: 2015-11-30 03:14
改了一下适应不同需求
改动:
1.图片顺序改成:待机-行走-跑步
2.增加待机动画播放等待时间。移动停止之后,插件原始变量等待时间到达之后会切换到待机动画默认帧(插件里frames flag变量)的那一帧。继续等待Idle_Wait之后才开始播放待机动画
3.待机动画播放到最大帧之后会停留在这一帧,不会循环播放(需要的话可以加变量设置是否需要循环)
4.微调整显示。从行走动作切换到待机动作之后,直接切换回待机动作的初始帧。

如果做多帧的话动作衔接细节要复杂一些,比如行走动画循环里面不能插入待机动作的帧,所以需要分开设置。共享两个10帧的行走图可以体验一下
已经测试了npc,跟随人物和主角都没有问题。唯一的麻烦点的就是目前跑步动作判定似乎是按照速度,这样如果主角行走速度低的话,跑起来跟随人物还是行走动作。因为跟随人物的数值基本都是主角抄过来的。

修改过的代码
JAVASCRIPT 代码复制
  1. //=============================================================================
  2. // VIPArcher_Character_Animations.js edited by doranikofu
  3. //=============================================================================
  4. /*:
  5.  * @plugindesc 行走图动画扩展,八方向|奔跑|待机|多帧
  6.  * @author VIPArcher
  7.  *
  8.  * @param Dir8_Flag
  9.  * @desc 素材使用该脚本的标志
  10.  * @default %
  11.  *
  12.  * @param Frames_Flag
  13.  * @desc 设置帧数的标志
  14.  * @default #
  15.  *
  16.  * @param Stand_Wait
  17.  * @desc 站立等待时长(帧)
  18.  * @default 5
  19.  *
  20.  * @param Idle_Wait
  21.  * @desc 待机动画开始等待时长(帧) 从站立等待之后开始计算
  22.  * @default 120
  23.  *
  24.  * @help 使用该脚本的行走图素材文件名前面添加一个标志:默认为 %
  25.  * 文件名的名为规范(默认设置)如下:
  26.  * %VIPArcher.png , 素材为2*4的标志素材
  27.  * 第一行:第一个格子是四方向,第二个格子是四方向奔跑,第三个是四方向待机;//doranikofu edit 顺序改成:待机-行走-奔跑
  28.  * 第二行:第一个格子是八方向,第二个格子是八方向奔跑,第三个是八方向待机;
  29.  *
  30.  * 使用多帧则名为(默认设置): 文件名#帧数,默认帧.png
  31.  * 例如 %VIPArcher#6,3.png
  32.  */
  33. (function() {
  34.     var parameters = PluginManager.parameters('VIPArcher_Character_Animations');
  35.     var dir8_flag  = String(parameters['Dir8_Flag']   || '%');
  36.     var frame_flag = String(parameters['Frames_Flag'] || '#');
  37.     var stand_wait = String(parameters['Stand_Wait']  || '5');
  38.     var idle_wait = String(parameters['Idle_Wait']  || '120');
  39.     ImageManager.isDir8Character = function(filename) {
  40.         var reg = new RegExp("^\[\\!\\$\\" + dir8_flag + ']+');
  41.         var sign = filename.match(reg);
  42.         return sign && sign[0].contains(dir8_flag);
  43.     };
  44.     var _Game_CharacterBaseinitMembers = Game_CharacterBase.prototype.initMembers;
  45.     Game_CharacterBase.prototype.initMembers = function() {
  46.         _Game_CharacterBaseinitMembers.call(this);
  47.         this._standWait = 0;
  48.                 this._stepstop = false;        //doranikofu stop cylcing idle anime flag
  49.        //doranikofu                this._isStand = false;
  50.                 this._isStand = true;
  51.         this._isDir8Character = false;
  52.     };
  53.     var _Game_CharacterBasesetImage = Game_CharacterBase.prototype.setImage;
  54.     Game_CharacterBase.prototype.setImage = function(characterName, characterIndex) {
  55.         _Game_CharacterBasesetImage.call(this, characterName, characterIndex);
  56.         this.getCharacterMaxFrame(characterName);
  57.         if (ImageManager.isDir8Character(characterName)) {
  58.             this._characterIndex  = 0;
  59.             this._isDir8Character = true;
  60.         };
  61.     };
  62.     var _Game_CharacterBaseupdate = Game_CharacterBase.prototype.update;
  63.     Game_CharacterBase.prototype.update = function() {
  64.         _Game_CharacterBaseupdate.call(this);
  65.         if (this.isMoving()) {
  66.             this._standWait = 0;
  67.             this._isStand = false;
  68.             if (this._isDir8Character) { this._stepAnime = false };
  69.         } else {
  70.             this._standWait += 1;
  71.                         if (this._standWait == parseInt(stand_wait)) {                //doranikofu
  72.                 this._isStand = true;                                                        //
  73.                                 this._pattern = 0;                                                                //reset to default frame after switching to idle to avoid big pose jumps
  74.                                 this._stepstop = false;                                                        // reset flag
  75.                         };                                                                                                        //
  76.                 if (this._standWait > parseInt(stand_wait)) {
  77.                             if ((this._isDir8Character) && (this._standWait > (parseInt(stand_wait) + parseInt(idle_wait)))) {        //doranikofu add idle wait
  78.                                                 this._stepAnime = true;
  79.                                                 if (this._pattern == this._maxFrame - 1) this._stepstop = true;
  80.                                                 if (this._stepstop) this._pattern = this._maxFrame - 1;
  81.                                                 };
  82.             };
  83.         };
  84.     };
  85.     var _Game_CharacterBasemoveDiagonally = Game_CharacterBase.prototype.moveDiagonally;
  86.     Game_CharacterBase.prototype.moveDiagonally = function(horz, vert) {
  87.         _Game_CharacterBasemoveDiagonally.call(this, horz, vert);
  88.         if (horz > 5) {
  89.             vert > 5 ? this.setDirection(9) : this.setDirection(7);
  90.         } else {
  91.             vert > 5 ? this.setDirection(3) : this.setDirection(1);
  92.         };
  93.     };
  94.     Game_CharacterBase.prototype.getCharacterMaxFrame = function(characterName) {
  95.         var framedate = characterName.match(new RegExp(frame_flag + "(\\d+),(\\d+)"));
  96.         if (framedate) {
  97.             this._maxFrame = parseInt(framedate[1]);
  98.             this._formerPattern = parseInt(framedate[2]);
  99.         } else{
  100.             this._maxFrame = 3;
  101.             this._formerPattern = 1;
  102.         };
  103.     };
  104.     Game_CharacterBase.prototype.pattern = function() {
  105.         return this._pattern < this.maxFrame() ? this._pattern : 1;
  106.     };
  107.     Game_CharacterBase.prototype.maxFrame = function() {
  108.         return this._maxFrame;
  109.     };
  110.     Game_CharacterBase.prototype.maxPattern = function() {
  111.         if (this._maxFrame === 3) {
  112.             return 4;
  113.         } else {
  114.             return this._maxFrame;
  115.         };
  116.     };
  117.     Game_CharacterBase.prototype.isOriginalPattern = function() {
  118.         return this.pattern() === this._formerPattern;
  119.     };
  120.     Game_CharacterBase.prototype.resetPattern = function() {
  121.         this.setPattern(this._formerPattern);
  122.     };
  123.     Game_CharacterBase.prototype.isFast = function() {
  124.         return this._standWait < 2 && (this.isDashing() || this._moveSpeed > 4);
  125.     };
  126.     Game_CharacterBase.prototype.isStand = function() {
  127.         return this._isStand;
  128.     };
  129.     Game_CharacterBase.prototype.setCharacterIndex = function(index) {
  130.         this._characterIndex = index;
  131.     };
  132.     Game_Player.prototype.moveByInput = function() {
  133.         if (!this.isMoving() && this.canMove()) {
  134.             var direction = Input.dir8;
  135.             if (direction > 0) {
  136.                 $gameTemp.clearDestination();
  137.             } else if ($gameTemp.isDestinationValid()){
  138.                 var x = $gameTemp.destinationX();
  139.                 var y = $gameTemp.destinationY();
  140.                 direction = this.findDirectionTo(x, y);
  141.             }
  142.             if (direction > 0) {
  143.                 if (direction % 2 == 0){
  144.                     this.moveStraight(direction);
  145.                     return;
  146.                 }
  147.                 if (direction < 5){
  148.                     this.moveDiagonally(direction + 3 , 2);
  149.                 } else {
  150.                     this.moveDiagonally(direction - 3 , 8);
  151.                 }
  152.             }
  153.         }
  154.     };
  155.     var _Game_PlayermoveDiagonally = Game_Player.prototype.moveDiagonally;
  156.     Game_Player.prototype.moveDiagonally = function(horz, vert) {
  157.         if (!this.canPass(this._x, this._y, horz) && !this.canPass(this._x, this._y, vert)){
  158.             this.setMovementSuccess(false);
  159.             return;
  160.         }
  161.         if (this.canPass(this._x, this._y, horz) && !this.canPass(this._x, this._y, vert)){
  162.             this.moveStraight(horz);
  163.             return;
  164.         }
  165.         if (this.canPass(this._x, this._y, vert) && !this.canPass(this._x, this._y, horz)){
  166.             this.moveStraight(vert);
  167.             return;
  168.         }
  169.         if (!this.canPassDiagonally(this._x, this._y, horz, vert)) {
  170.             if (Math.random() > 0.5){
  171.                 this.setDirection(vert); this.moveStraight(vert);
  172.             } else {
  173.                 this.setDirection(horz); this.moveStraight(horz);
  174.             }
  175.             return;
  176.         }
  177.         _Game_PlayermoveDiagonally.call(this, horz, vert);
  178.     };
  179.     Sprite_Character.prototype.characterPatternY = function() {
  180.         if (this._character.direction() % 2 == 0){
  181.             if (this._character._isDir8Character){
  182.                 this._character.setCharacterIndex(this._character.isFast() ? 2 : this._character.isStand() ? 0 : 1);        //doranikofu changed index
  183.             };
  184.             return (this._character.direction() - 2) / 2;
  185.         } else {
  186.             if (this._character._isDir8Character){
  187.                 this._character.setCharacterIndex(this._character.isFast() ? 6 : this._character.isStand() ? 4 : 5);        //doranikofu changed index
  188.             };
  189.             return parseInt((this._character.direction() + 1) / 3);
  190.         }
  191.     };
  192.     Sprite_Character.prototype.patternWidth = function() {
  193.         if (this._tileId > 0) {
  194.             return $gameMap.tileWidth();
  195.         } else if (this._isBigCharacter) {
  196.             return this.bitmap.width / this._character.maxFrame();
  197.         } else {
  198.             return this.bitmap.width / (this._character.maxFrame() * 4);
  199.         }
  200.     };
  201.     Sprite_Character.prototype.characterBlockX = function() {
  202.         if (this._isBigCharacter) {
  203.             return 0;
  204.         } else {
  205.             var index = this._character.characterIndex();
  206.             return (index % 4) * this._character.maxFrame();
  207.         }
  208.     };
  209. })();


效果图, 左下是主角和跟随的待机,右上是npc


素材图下载-自己做的仙剑奇侠传5前传人物模型渲染拼好的图
characters.rar (3.5 MB, 下载次数: 2795)


作者: doranikofu    时间: 2015-12-15 14:01
最近改了一些,往文件名里面塞参数判定是否需要全部3中动作还是只要一部分

不过貌似和npc对话的时候没有8向判定么,菊苣打算做一个么?
作者: Allen_Chiang    时间: 2015-12-15 15:08
搞大量行走图存在的意义?  公共事件如果C被按下加速+1,换主角奔跑行走图 不就实现了吗
作者: doranikofu    时间: 2015-12-18 06:19
还有一个问题
最近用那个analog move插件 SAN_AnalogMove
那个里面方向3是右下,方向7是左上,是他搞错了么
默认脚本里面有奇数的方向定义么
用这个插件的话鼠标移动会流畅好多,不过方向3/7会抽,还没彻底解决
改这两个替换3/7只后显示正常了
Game_AnalogMove.prototype.dir8ToRadian
Game_AnalogMove.prototype.radianToDir8

但是
Game_AnalogMove.prototype.dir8ToRadian
改了以后键盘如果右下的话人物左上移动
键盘左上人物右下移动。。。鼠标移动不影响

不改的话控制正常,但是切换场景的时候如果保留方向,左上移动切换场景就自动变成右下方向了。。。
作者: aaaassss123    时间: 2015-12-26 11:09
8 帧有问题的,明显在2帧之间晃动
作者: aaaassss123    时间: 2015-12-26 11:33
已经找到问题了,但是待机动画的时候不是循环的吗?单独播放一次后就停住了
作者: qiufeier    时间: 2015-12-28 16:34
我想问一下大大们, 怎样保持四方向然后又能使用多帧的行走图咧?  在下小白 麻烦大大们帮忙解答啦!!拜托啦!!
作者: aaaassss123    时间: 2015-12-29 16:13
aaaassss123 发表于 2015-12-26 11:33
已经找到问题了,但是待机动画的时候不是循环的吗?单独播放一次后就停住了 ...

那个拼图上面应该有发出来,原版的应该是行走-待机-跑步,改版的是待机-行走-跑步,第二行则是8方向的,我只用到4方向。所以第二行是和第一行一样的
作者: doranikofu    时间: 2016-1-26 10:59
共享一个八方向触发事件的脚本
事件朝向也改了
另外 不记得素材是怎么设置的 但是用的那个analog move的方向是

7 8 9
4 5 6
1 2 3

目前哥的素材全部按这个方向改的 脚本也是,之前似乎用lz的脚本3/7是反的?

顺便问一下有没有简单的办法在触发事件的时候取消待机动画直接换到初始状态?貌似那个step关掉可以?

JAVASCRIPT 代码复制
  1. //===========================trigger action for diagonal
  2.  
  3. Game_Map.prototype.roundXWithDirection = function(x, d) {
  4.     return this.roundX(x + (d%3 === 0 ? 1 : (d+2)%3 === 0 ? -1 : 0));
  5. };
  6.  
  7. Game_Map.prototype.roundYWithDirection = function(y, d) {
  8.     return this.roundY(y + (d<4 ? 1 : d>6 ? -1 : 0));
  9. };
  10.  
  11. Game_Character.prototype.turnTowardCharacter = function(character) {
  12.     var sx = this.deltaXFrom(character.x);
  13.     var sy = this.deltaYFrom(character.y);
  14.         var radian = Math.atan2(sx,sy) + Math.PI;
  15.         this.setDirection(
  16.         radian < Math.PI / 8.0 *  1.0 ? 2 :
  17.         radian < Math.PI / 8.0 *  3.0 ? 3 :
  18.         radian < Math.PI / 8.0 *  5.0 ? 6 :
  19.         radian < Math.PI / 8.0 *  7.0 ? 9 :
  20.         radian < Math.PI / 8.0 *  9.0 ? 8 :
  21.         radian < Math.PI / 8.0 * 11.0 ? 7 :
  22.         radian < Math.PI / 8.0 * 13.0 ? 4 :
  23.         radian < Math.PI / 8.0 * 15.0 ? 1 : 2
  24.                 );
  25. };
  26.  
  27. Game_Character.prototype.turnAwayFromCharacter = function(character) {
  28.     var sx = this.deltaXFrom(character.x);
  29.     var sy = this.deltaYFrom(character.y);
  30.         var radian = Math.atan2(sx,sy) + Math.PI;
  31.         this.setDirection(
  32.         radian < Math.PI / 8.0 *  1.0 ? 8 :
  33.         radian < Math.PI / 8.0 *  3.0 ? 7 :
  34.         radian < Math.PI / 8.0 *  5.0 ? 4 :
  35.         radian < Math.PI / 8.0 *  7.0 ? 1 :
  36.         radian < Math.PI / 8.0 *  9.0 ? 2 :
  37.         radian < Math.PI / 8.0 * 11.0 ? 3 :
  38.         radian < Math.PI / 8.0 * 13.0 ? 6 :
  39.         radian < Math.PI / 8.0 * 15.0 ? 9 : 8
  40.                 );
  41. };

作者: RM无节操小分队    时间: 2016-1-27 17:39
我快晕死了,求大大说一下,我行走图是6个图片的,要怎么设置?我无论怎么改数字都不会,就是一个方向行走,会播放6帧动画,在文件名上要怎么写
作者: ll879    时间: 2017-5-14 09:24
请教一个问题,在使用脚本的时候,人物走路发飘,人物动画走路是一格的话,实际走路将近三格,该如何解决,如图附件。在文件命名上 “默认帧”是什么意思。

未标题-1.png (315.79 KB, 下载次数: 14)

未标题-1.png

未标题-2.png (497.05 KB, 下载次数: 11)

未标题-2.png

作者: ll879    时间: 2017-5-14 10:14
ll879 发表于 2017-5-14 09:24
请教一个问题,在使用脚本的时候,人物走路发飘,人物动画走路是一格的话,实际走路将近三格,该如何解决, ...

哦,默认帧,是停留的帧数显示,从0开始数
作者: ll879    时间: 2017-5-14 11:23
ll879 发表于 2017-5-14 09:24
请教一个问题,在使用脚本的时候,人物走路发飘,人物动画走路是一格的话,实际走路将近三格,该如何解决, ...

大概是0.15秒刷新一帧,每帧移动36至24像素
作者: wxwtenchi    时间: 2017-12-14 10:49
大神你好!我想做横版的 所以只需要左右走,但是默认的动作只有3帧,怎么才能增加帧数?增加一个待机动作呢?我是代码小白,美术出身。

作者: IO0294    时间: 2018-1-10 23:48
感谢作者分享
作者: ziyingyie    时间: 2018-8-10 14:49

选用人物行走素材后是这样的    文件名是:%xie#10,0.png
这是什么情况呀?

360截图-15695806.jpg (4.58 KB, 下载次数: 19)

360截图-15695806.jpg

作者: 18202355785    时间: 2018-8-17 01:15
6666666666666666666
作者: vul3eji    时间: 2018-8-17 20:55
ziyingyie 发表于 2018-8-10 14:49
选用人物行走素材后是这样的    文件名是:%xie#10,0.png
这是什么情况呀?

我也想知道
作者: vul3eji    时间: 2018-8-18 10:53
本帖最后由 vul3eji 于 2018-8-18 16:14 编辑
doranikofu 发表于 2015-12-15 14:01
最近改了一些,往文件名里面塞参数判定是否需要全部3中动作还是只要一部分

不过貌似和npc对话的时候没有8 ...


鄉知道行走圖該怎麼組合,可以指導一下嗎??

8FPS的

%lan#8,0.png (977.22 KB, 下载次数: 16)

%lan#8,0.png

作者: 希羽    时间: 2018-12-14 09:07
求问如何更改待机动画的播放速度,有些慢,动作看起来不连贯
作者: 2399337322    时间: 2019-2-2 18:02
能不能只四个方向,怎么取消八方向
作者: 湘夫人    时间: 2019-3-2 16:09
1.5版本的话,如果需要一直循环待机图,是不是播放次数设置为99999999就可以了?
作者: ashley_blade    时间: 2019-4-28 02:33
请问如何让人物在停止移动时立即切换至待机动画然后一直保持待机直到开始移动?
我发现走路姿势中间不加站立看起来会自然很多,打算在步行行走图里不添加直立,但是人物在等待待机循环时都会保持步行行走图的第二格……不论怎么调数值,进入待机前的那段等待都没办法消除……请问有办法解决吗……?
作者: ashley_blade    时间: 2019-4-28 12:46
ashley_blade 发表于 2019-4-28 02:33
请问如何让人物在停止移动时立即切换至待机动画然后一直保持待机直到开始移动?
我发现走路姿势中间不加站 ...

不行,停止移动后一定会有2秒左右的空档,我估计是什么固有设定吧……
比起这个,有个要命的问题:无法存档。存档失败返回时跳出来的typeerror,1.6.2版本是this._actors.map is not a function,1.5.2版本是undefined is not a function。我一开始还以为是复制出错了,用各种姿势复制、新建js都没有解决,换回了旧版也没有解决,新建了一个工程测试也是如此…
作者: E十九R    时间: 2019-5-11 22:31

6帧的那个后缀我给图片加上后就成这样了
不明白是怎么回事

12345678.PNG (4.59 KB, 下载次数: 10)

12345678.PNG

作者: E十九R    时间: 2019-5-11 23:20
E十九R 发表于 2019-5-11 22:31
6帧的那个后缀我给图片加上后就成这样了
不明白是怎么回事

是我没有改图……我用原来的每格3x4的直接加了后缀
作者: Soracyti    时间: 2019-9-2 22:52
这个咋用啊...我用的1.5版本然后把那个参考素材放到character里,角色行走图识别出来是错的
作者: Soracyti    时间: 2019-9-3 04:09
本帖最后由 Soracyti 于 2019-9-3 06:17 编辑

报错解决了,四方向行走是正常的,但是八方向和奔跑动画显示不出来,待机动画也没法正常显示。这个和插件有关系吗?我用的是Qmovement来实现八方向行走,关掉qmovement之后倒是能显示了,但是就没有8方向了呀 Qmovement也是QABS的必须前置插件
作者: Soracyti    时间: 2019-9-15 17:51
请问这个8方向的动画是和哪个移动插件配套用的啊 原版只有4方向呀
作者: Soracyti    时间: 2019-9-15 22:33
Soracyti 发表于 2019-9-15 17:51
请问这个8方向的动画是和哪个移动插件配套用的啊 原版只有4方向呀

不是啊- -我是说支持8方向的插件 不是素材
作者: camy7602    时间: 2019-10-31 18:03
想問一下為何會一直報錯,檢查過是半角


作者: KKsumu    时间: 2020-7-3 16:59
请问一下,我用了1.5版本插件之后,游戏无法存档,提示this._actors.map is not a function,该怎么办?
作者: xowindows    时间: 2020-8-1 11:15
本帖最后由 xowindows 于 2020-8-3 10:37 编辑

1.5新版本 (使用多文件以后缀名区分姿势)(复制粘贴保存的脚本)
习惯性错误,文件命名没看脚本就按1.0版本的名称命名。
第二行有清晰的文件名        VIPArcher_CharacterPoses.js


完全的新手搞了好久,直到知道可以F8/F12调试,查到sources图片缺少_8D才肯定出问题,Console乱试,果然MoveDir8=false

line62:        PluginManager.parameters('VIPArcher_CharacterPoses')
pluginManager.paramenters要对应脚本文件名的。

希望大神加多一行提醒下我们这类新手。


作者: chenly228    时间: 2021-9-9 22:37
可以分享一个mv的案例吗?怎么整都报错……
作者: plain666    时间: 2021-9-10 01:51
代码写的真不错,高手啊。
作者: 左羊tgbt    时间: 2023-5-21 20:10
请问下待机动作可以设置成隔一段时间循环一次吗?现在是只要触发就开始无限循环,特别鬼畜
作者: 左羊tgbt    时间: 2023-5-21 22:21
左羊tgbt 发表于 2023-5-21 20:10
请问下待机动作可以设置成隔一段时间循环一次吗?现在是只要触发就开始无限循环,特别鬼畜 ...

目前已经解决,但是1.5没办法存档还是存在
作者: 左羊tgbt    时间: 2023-5-21 22:22
KKsumu 发表于 2020-7-3 16:59
请问一下,我用了1.5版本插件之后,游戏无法存档,提示this._actors.map is not a function,该怎么办? ...

请问你解决了吗,我也没办法存档
作者: 371879728    时间: 2023-5-25 16:42
想问下有案例师范demo么?还有就是1.6以后的版本可以用么?
作者: KKsumu    时间: 2023-6-15 18:05
左羊tgbt 发表于 2023-5-21 22:22
请问你解决了吗,我也没办法存档

没有,我已经放弃了




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