プラグイン立ち絵規格統一のご提案

んーぞー

ユーザー
見栄えを良くするためにツクールで立ち絵を表示したいというユーザーさんは多いと思いますし、そのためのプラグインも作者様各位の努力により多数リリースされています。

ただ、立ち絵というのはコアスクリプトでは特になんの設定もありません。MZでは全身立ち絵が素材として用意されるなどこれまで以上に立ち絵を意識しているように思えますが、いまだに立ち絵は各ユーザー(あるいはプラグイン作者)の設定の工夫に委ねられています。
そのため立ち絵に関する規格はプラグイン作者ごとにまちまちであり、統一されていません。

エンドユーザーさんからすればあるプラグイン内のパラメータでアクターごとに(差分も含めて)立ち絵設定がようやく終わったと思えば、また別の立ち絵プラグインで同様の設定をしなければならないというのは煩雑だと思います。
ただ煩雑なだけであればそこまで問題ではありませんが、例えばあるプラグインには着せ替えが実装されているので衣装差分が表示できるが、別のプラグインには存在しないので衣装が反映されない、などの問題もあります。

顔グラフィックや歩行グラフィックであればコアスクリプトに存在するプロパティですのでこのような事態は起きません。どんなプラグインであっても顔グラフィックを表示したければfaceNameおよびfaceIndexプロパティを参照すれば取得できます。また、顔グラをデータベース上で変更するとそれだけで顔グラ描画機能を持つすべてのプラグインにも反映されます。
ところが立ち絵にはこのようなプロパティが存在しませんので、結果プラグインごとにバラバラな規格になってしまっています。また、立ち絵を変更したくなった場合関連プラグインパラメータすべてを変更しなければならないので煩雑ですし設定漏れリスクも生じます。

本当は顔グラフィック等と同様にデータベース上で設定できればベストなのですが、ないものねだりをしても仕方ありませんのでせめてプラグイン作者間だけでも規格を統一することで立ち絵の管理を一元化してみてはどうか、というのがこの提案です。

例えばある一つの立ち絵管理用プラグインをベースプラグインとし、各立ち絵表示プラグインはこのベースプラグインに定義されている関数によりアクターの立ち絵画像を取得する、という方法が考えられるかと思います。

そのためのたたき台としてこのようなプラグインを作りました。


このプラグインには立ち絵管理用として基本的な機能が用意されています。
立ち絵には標準、ダメージ差分、ステート差分が用意され、ステートやHP割合に応じて複数の立ち絵を設定できます。またそれぞれの条件には衣装・表情差分用にさらに複数のピクチャを設定できます。

スクリーンショット 2021-06-20 0.24.22.png

それら複数ピクチャはプラグインコマンドによって変更できる「ピクチャID」にて切り替えられます。

スクリーンショット 2021-06-20 23.28.52.png

立ち絵画像はGame_ActorpictureName関数により取得されます。この関数はステート>ダメージ>標準の優先度にて立ち絵を参照し、例えばあるアクターが毒状態かつHP割合が70%だとして「毒状態の画像がなければHP75%画像を参照し、それもなければ標準立ち絵画像ファイル名を返す」といった仕様です。

JavaScript:
Game_Actor.prototype.normalPictureName = function() {
    const obj = ACTOR_PICTURES[this._actorId];
    if (obj) {
        const normals = obj.normals;
        if (normals) return normals[this._pictureIndex] || normals[0];
    }
    return "";
};

Game_Actor.prototype.statePictureName = function() {
    const obj = ACTOR_PICTURES[this._actorId];
    if (obj) {
        const states = obj.states;
        for (let i=0; i<states.length; i++) {
            const pictures = states[i];
            if (pictures && this.isStateAffected(i)) return pictures[this._pictureIndex];
        }
    }
    return "";
};

Game_Actor.prototype.damagePictureName = function() {
    const obj = ACTOR_PICTURES[this._actorId];
    if (obj) {
        const damages = obj.damages;
        const hpRate = this.hpRate() * 100;
        for (const damageObj of damages) {
            if (damageObj && hpRate <= damageObj.damageRate) return damageObj.pictures[this._pictureIndex];
        }
    }
    return "";
};

Game_Actor.prototype.pictureName = function() {
    return this.statePictureName() || this.damagePictureName() || this.normalPictureName() || "";
};

このプラグインはあくまでも立ち絵管理機能に特化しており具体的な動作の変更を行うものではありませんが、Window_Baseに立ち絵を描画するdrawActorPicture関数を追加しています。この関数は、顔グラフィックに対するdrawActorFaceのような感覚で使用できます。
また、Scene_Basecreateにて全ての立ち絵をプリロードするようにしています。

この立ち絵管理プラグインが実際に他プラグインと連携するイメージをお伝えするために、誠に勝手ながらトリアコンタンさんのカスタムメニュー作成プラグインをフォークさせていただいて立ち絵表示機能を付けたサンプルを作りました。


プラグインパラメータ「ピクチャ」にて、カスタムメニューにアクターの立ち絵もしくは任意のピクチャを表示できるように機能追加しています。
ここで表示される立ち絵は上述のpictureName関数にてファイル名を取得しているので、現在のアクターのステート、ダメージ、着せ替えを反映します。ちなみにZ軸は背景よりも上かつウィンドウよりも下です。
スクリーンショットはリードのピクチャIDを変更した状態で、衣装差分が反映されています。

スクリーンショット 2021-06-20 22.05.32.pngスクリーンショット 2021-06-20 22.05.44.png

もちろんこの立ち絵管理プラグインはあくまでもたたき台でありこれを使えと言うわけでは全くありませんし、これをベースにするとしてもどしどしプルリクしていただきたいと思っています。

この一元管理が実現すれば今後立ち絵に関するプラグインを新規導入するユーザーさんにとっては飛躍的に設定の労力が軽減され、また差分の一貫性向上効果も期待できると思います。

ただしそれには当然既存プラグインを作り直さなければならず、各プラグイン作者様にリワークをお願いするのも心苦しいのですが、どうかご検討いただければ幸いです。

ところで予想される懸念事項として、新規ユーザーにとっては設定が簡略化されるとしても、すでに立ち絵関連プラグインを導入済みのユーザーさんにパラメータ再設定の負担を強いることになるのはいかがなものか、というものがあります。このような点についても議論していきたいです。

プラグイン作者様各位におかれましては、ぜひ積極的な議論の参加をお願い申し上げます。


よろしくお願いいたします。
 
最後に編集:

しぐれん

ユーザー
内容としては大いに賛成します。

この企画を進めるのであれば、賛同者がある程度必要になるでしょう。
少なくとも国内のユーザーの間では完全統一が必要です。
海外製プラグインについては連結用のプラグインを開発することで可能になるでしょう。

立ち絵機能について、以下のような機能が必要だと思います。

1.立ち絵構造定義クラス
Game_***に相当するクラスです。
外部のプラグインから立ち絵に対して何らかの命令を送る際に必要になると思います。

またSprite_Actorと同様にダメージ・状態異常などのモーションを取らせる命令もあると良いと思います。
これについては想定済みのようですね。

2.実装されている機能を返す関数
プラグインが実装している機能の一覧及び、任意の機能について実装しているかを返す関数です。
横から機能を借りる場合に使います。
 

んーぞー

ユーザー
>しぐれんさん

ご賛同ありがとうございます。

この企画を進めるのであれば、賛同者がある程度必要になるでしょう。
少なくとも国内のユーザーの間では完全統一が必要です。
海外製プラグインについては連結用のプラグインを開発することで可能になるでしょう。
そうですね、できる限りユーザー間の意思統一は必要だと思います。
ただし当然ながら強制はできませんので、未対応プラグインに関しては海外製プラグインへの対応と同様に連結プラグイン等で対応可能ならそれでOKかもしれません。

立ち絵機能について、以下のような機能が必要だと思います。

1.立ち絵構造定義クラス
Game_***に相当するクラスです。
外部のプラグインから立ち絵に対して何らかの命令を送る際に必要になると思います。

またSprite_Actorと同様にダメージ・状態異常などのモーションを取らせる命令もあると良いと思います。
これについては想定済みのようですね。

2.実装されている機能を返す関数
プラグインが実装している機能の一覧及び、任意の機能について実装しているかを返す関数です。
横から機能を借りる場合に使います。
技術面でのご提案、大変参考になります。ありがとうございます。

申し訳ありませんが2については私の勉強不足によりイメージできませんでした……。
具体的なコードとしては、どのようなイメージなのでしょうか?(もちろん、ざっくりで問題ありません)
 

しぐれん

ユーザー
2についてですが、規格統一用プラグインを別個に開発して、それに機能を載せます。
立ち絵管理のプラグインは、2で定義されたクラスを継承した実装状況オブジェクトを取得できる状態にします。
プラグインごとの機能差はあるでしょうから、それを吸収できるようにするためです。

例えばプラグインAでは立ち絵合成があり、プラグインBには無いとします。
そういった場合に立ち絵合成を前提した機能があった場合…などを想定しています。
 

まっつUP

ユーザー
んーぞー様

初めまして。
私のプラグイン作者としての節穴だらけの私見で意見を述べたいと思います。


ActorPictures.jsについて

全くシンプルでアクターの状況に応じた画像名を取得できるようになっていると思います。
もし次に一から立ち絵表示系のプラグインをつくるならそれを利用していたかもしれません。
しかしながら、ツクラーやゲームごとにどのような必要とする立ち絵またはその差分の管理方法と表示制御が異なるため
これでは十分でない場合もあります。
ファイル名の命名規則による制御をする場合など、プラグインパラメータで画像名を設定することが不要または不十分の場合などです。
また、稀でしょうがアクターとして設定していない何かしらの登場人物の立ち絵を多く使いたい場合もです。
したがって、常にこの立ち絵管理用プラグインをベースプラグインとすることには賛成することも反対することもしません。


その内容について

・立ち絵を表示したいシーンの種類数は少なくはないと思います。プラグインパラメータを外部からも参照できると助かる方がいるかもしれません。例えば、そのアクターのものとして設定している立ち絵などです。特定のインデックスの値が欲しい場合もあるでしょう。

・Scene_Base.prototype.createにフックして(おそらく)全立ち絵を毎回先読みしているようですが、該当パラメータの設定数次第では尋常じゃない量の画像が同タイミングで先読みされるのではないでしょうか。
また、マップシーン以外なら大抵問題なさそうですが表示する直前に必ずキャッシュされているかどうかは怪しいところです。
パラメータで先読みの可否制御などができたほうが良いかもしれません。

・現状アクターへの操作はセーブ時に保存されます。(ここでいうセーブは実際にゲームをプレイしているときのセーブです。)
しかし、マップシーンで立ち絵を表示中かどうかはデフォルトのイベントコマンドで使われているピクチャと異なり保存されません。これはマップシーンでの表示制御は後続のプラグインの負担であるためだと思いますが、この場合そういったプラグインが複数あらわれた場合に全く異なる保存方法を採用している場合に厄介かもしれません。
いずれかのみ使う、表示制御の機能のいくらかもベースプラグインにするなどで問題がない場合もあると思います。
セーブ内容に含まれるデータの扱いは割とシビア(シビアに扱っているのは作者だけの時があるため)なのであらかじめ十分かどうか確認しておく必要があると思いました。驚くことにイベントシーン以外でもキャラ画像を表示しておくゲームを作る方は割と多いです。

・標準ピクチャと同数のステートピクチャのそれぞれのステート分やダメージピクチャのそれぞれの基準分を使用者が用意できるとは思えません。足りない分のインデックスには同名を置いておけばよいと思いますがそれだと無駄が多いですね。
また、個人的に特定のステートの特定のHP基準では評価できなさそうなのが気になりました。

・「ピクチャ」がデフォルトのイベントコマンドで使われているピクチャと表現が被ってややこしいです。さらにピクチャIDとあるのでイベントコマンドのようにID別に表示管理をしているというような誤解を招く可能性があります。(実際には表示管理がない。)
 

んーぞー

ユーザー
しぐれんさん、まっつUPさん

誠に貴重なご意見ありがとうございます!
お二人のご意見は大変的を射たものであり、個別のプラグインごとに全く異なる実装を一つのプラグインでカバーすることは非常に難しいことだと改めて理解しました。

その上で、現状のActorPictures.jsの仕様及び私の見解を述べさせていただきます。

このプラグインはあえて「現在のアクターの状況を考慮した立ち絵画像ファイル名を返す」という関数(Game_Actor#pictureName)のみで個別立ち絵プラグインへの橋渡しをする、という仕様にしています。
その理由は、pictureNameをアクターのプロパティのように扱いたいからです。
本スレッドの最初に述べた通り、例えば顔グラフィックであればどんなプラグインであっても(余程特殊な処理をしているプラグインであれば例外かもしれませんが)Game_ActorfaceNameおよびfaceIndexを参照すれば現在のアクターの顔グラフィックを取得できます。歩行グラフィックやサイドビューグラフィックももちろん同様です。
それは言うまでもなく、それらがコアスクリプトに定義されている関数であるからです。

これもまた冒頭で述べたとおり、例えば顔グラフィックであればデータベース上で顔グラを変更すると顔グラ描画機能を持つ全てのプラグインにも(プラグインパラメータの変更などの煩雑な手順を踏まずとも)自動的に反映されますよね。全てのプラグインが同じ関数/プロパティを参照していれば、このようなことができます。コアスクリプトは誰もがそれを前提としているデファクトスタンダード(追記:正しくはデジュリスタンダードですね)であるため個別作者による「ブレが起きない」のです。

有り体に言えば、このプラグインのpictureNameという関数を「コアスクリプトのfaceNamecharacterName関数と同列に扱って欲しい」と思っています。

では具体的に個々の立ち絵プラグイン作者様にはどのような対応をしていただきたいかというと、「立ち絵を描画する関数の立ち絵画像ファイル名を取得する部分をactor.pictureName()に置き換えてほしい」です。

例えばあるプラグインが、現状では以下のような関数でウィンドウに立ち絵を描画しているとします。

JavaScript:
Window_XXX.prototype.drawActorStandingPicture = function(actor, x, y) {
    const standingPictureName = STANDING_PICTURE[actor.actorId()];  // プラグインパラメータで取得したアクター立ち絵ファイル名配列
    const bitmap = ImageManager.loadPicture(standingPictureName);
    const width = bitmap.width;
    const height = bitmap.height;
    this.contents.blt(bitmap, x, y, width, height, 0, 0);
};

これを、以下のように書き換えていただきたいのです。

JavaScript:
Window_XXX.prototype.drawActorStandingPicture = function(actor, x, y) {
    const standingPictureName = actor.pictureName();  // ActorPictures.jsからの関数
    const bitmap = ImageManager.loadPicture(standingPictureName);
    const width = bitmap.width;
    const height = bitmap.height;
    this.contents.blt(bitmap, x, y, width, height, 0, 0);
};

これはウィンドウの例ですが当然プラグインによってはSpriteや、あるいは全く独自のクラスにて描画していることもあるでしょうが、どんなプラグインであっても画像ファイル名を取得している箇所はあるのではないかと思っています。その部分さえ置き換えてしまえば最小限の工数で規格統一ができるのではないかと考えているのですが、見通しが甘いでしょうか。

ただしこの方式では、しぐれんさんのおっしゃる通り立ち絵合成機能を持つプラグインには対応できません。この方式で対応できるのはいわゆる「一枚絵」方式で立ち絵を描画しているプラグインのみです。
立ち絵合成プラグインについてはそもそもが全く異なる実装であるため、今回の規格統一の対象外と考えていたのですが、それは最初に言っておくべきでした。申し訳ありません。

つまり個別のプラグインの個別の関数などを全てカバーすることは非現実的なので、画像ファイル名というほぼ間違いなくどんなプラグインでも参照しているであろう箇所だけを用いて橋渡しとする、というのがこのプラグインの趣旨です。
ファイル名取得後の処理についてはこのプラグインは一切干渉しません。それは、個別のプラグインに任せるべきであると考えているからです。


>まっつUPさん
はじめまして!
・Scene_Base.prototype.createにフックして(おそらく)全立ち絵を毎回先読みしているようですが、該当パラメータの設定数次第では尋常じゃない量の画像が同タイミングで先読みされるのではないでしょうか。
また、マップシーン以外なら大抵問題なさそうですが表示する直前に必ずキャッシュされているかどうかは怪しいところです。
パラメータで先読みの可否制御などができたほうが良いかもしれません。
全くおっしゃる通りです。プラグインパラメータもしくはプラグインコマンドによる可否制御はつけたほうがいいですね。

・標準ピクチャと同数のステートピクチャのそれぞれのステート分やダメージピクチャのそれぞれの基準分を使用者が用意できるとは思えません。足りない分のインデックスには同名を置いておけばよいと思いますがそれだと無駄が多いですね。
全てのステートやHP割合に対応する画像を用意するとなるとユーザー負担が尋常でないことは理解しております。そのため、現状でも該当画像が存在しない項目は未設定のままにしておけば別の画像ファイル名がフォールバックとして機能するようにしています。

JavaScript:
Game_Actor.prototype.statePictureName = function() {
    const obj = ACTOR_PICTURES[this._actorId];
    if (obj) {
        const states = obj.states;
        for (let i=0; i<states.length; i++) {
            const pictures = states[i];
            if (pictures && this.isStateAffected(i)) return pictures[this._pictureIndex];
        }
    }
    return "";
};

Game_Actor.prototype.pictureName = function() {
    return this.statePictureName() || this.damagePictureName() || this.normalPictureName() || "";
};

例えば今アクターが毒状態にかかっているが、そのアクターへの毒状態用画像はプラグインパラメータには未設定であるとします。その場合statePictureNameは空文字列を返すので、値はfalsyになります。
するとpictureNameでは続いてdamagePictureNameを、それもfalsyであればnormalPictureNameを評価するようになっています。
ですので、極論標準立ち絵画像一種類のみの設定でも問題なく動作するようにしています。

・「ピクチャ」がデフォルトのイベントコマンドで使われているピクチャと表現が被ってややこしいです。さらにピクチャIDとあるのでイベントコマンドのようにID別に表示管理をしているというような誤解を招く可能性があります。(実際には表示管理がない。)
これもおっしゃる通りです。「立ち絵インデックス」など、もっとふさわしい名前を考える必要がありますね。
 
最後に編集:

まっつUP

ユーザー
例えば、this._pictureIndexが7だったとして
ステート毒の該当のパラメータの設定が1種類(画像一枚のみ)の場合はこれが返されませんよね。
(他の基準の評価に入りますよね。)
this._pictureIndexにかかわらず、ステート毒にかかっているときはその1種類の画像を表示したい方もいると思います。

ところで、Game_Actor.prototype.statePictureNameの内容ですが気になったところがあります。
パラメータの説明には「アクターのステート差分ピクチャです。上にあるものほど優先されます。」
とありましたが、現状ステートID昇順に並び替えた配列を先頭から走査しているように見えますがどうでしょうか。
 

んーぞー

ユーザー
例えば、this._pictureIndexが7だったとして
ステート毒の該当のパラメータの設定が1種類(画像一枚のみ)の場合はこれが返されませんよね。
(他の基準の評価に入りますよね。)
this._pictureIndexにかかわらず、ステート毒にかかっているときはその1種類の画像を表示したい方もいると思います。
ご意見ありがとうございます。以下のような処理は、私も考えました。

JavaScript:
Game_Actor.prototype.statePictureName = function() {
    const obj = ACTOR_PICTURES[this._actorId];
    if (obj) {
        const states = obj.states;
        for (let i=0; i<states.length; i++) {
            const pictures = states[i];
            if (pictures && this.isStateAffected(i)) return pictures[this._pictureIndex] || pictures[0]; // フォールバック
        }
    }
    return "";
};

ただし、pictureIndexは主に衣装差分に使用することを想定しています。
例えばリードの7番目の衣装が制服だとして、現在pictureIndexに7が代入されているので制服グラフィックが表示されているとします。
素材としては、通常の鎧を着た画像には毒状態画像が用意されているが、制服には毒画像は存在しないものとします。
もし上記コードを採用した場合、リードが毒にかかるとさっきまで制服を着ていたはずなのに突然鎧を着て毒に苦しむ姿に変わってしまいます。
これは違和感が大きいと判断したので、現状のコードにしたという次第です。

ところで、Game_Actor.prototype.statePictureNameの内容ですが気になったところがあります。
パラメータの説明には「アクターのステート差分ピクチャです。上にあるものほど優先されます。」
とありましたが、現状ステートID昇順に並び替えた配列を先頭から走査しているように見えますがどうでしょうか。
いえ、ソートしているのはダメージピクチャのみです。ステートはソートしていないのでプラグインパラメータの並び順のままです。

JavaScript:
const ACTOR_PICTURES = [];
    for (const str of JSON.parse(PluginManager.parameters(PLUGIN_NAME).actorPictures)) {
        const obj = JSON.parse(str);
        const actorId = Number(obj.actorId);
        const normalPictures = JSON.parse(obj.normalPictures);
        const statePictures = [];
        const stateArray = JSON.parse(obj.statePictures);
        for (const stateStr of stateArray) {
            const stateObj = JSON.parse(stateStr);
            statePictures[Number(stateObj.stateId)] = JSON.parse(stateObj.pictures);
        }
        const damagePictures = [];
        const damageArray = JSON.parse(obj.damagePictures);
        for (const damageStr of damageArray) {
            const damageObj = JSON.parse(damageStr);
            damageObj.damageRate = Number(damageObj.damageRate);
            damageObj.pictures = JSON.parse(damageObj.pictures);
            damagePictures.push(damageObj);
        }
        damagePictures.sort((a, b) => a.damageRate - b.damageRate); // ダメージはソート
        ACTOR_PICTURES[actorId] = {
            normals: normalPictures,
            states:  statePictures,
            damages: damagePictures
        };
    }
 

まっつUP

ユーザー
なるほど、少なくともパラメータの説明は誤った記述ではないのですね。
Game_Actor.prototype.statePictureNameの内容はどうですか。
for文の添え字でステートの付加条件をみているようですが
例えばiが1の時は、IDが1のステートにかかっているかの条件をみると思いますが間違いないですか。
 

んーぞー

ユーザー
for文の添え字でステートの付加条件をみているようですが
例えばiが1の時は、IDが1のステートにかかっているかの条件をみると思いますが間違いないですか。
はい、おっしゃる通りです。

この配列のインデックスはステートIDに対応しています。
例えばあるアクターに対して毒画像と眠り画像だけを設定していた場合、毒のステートIDは4で睡眠は10なので以下のような配列になります。

JavaScript:
[null, null, null, null, ["Actor1_Poison"], null, null, null, null, null, ["Actor1_Sleep"]]

statePictureName中では、if (pictures &&〜により未設定ステートはフィルタリングされます。

JavaScript:
const states = obj.states;
for (let i=0; i<states.length; i++) {
    const pictures = states[i];
    if (pictures && this.isStateAffected(i)) return pictures[this._pictureIndex];
}
 

まっつUP

ユーザー
ご返答いただきありがとうございます。
プラグインの仕様がそうであり、仕様通りの動作の記述になっているのであれば問題ありません。
ベースプラグインとして最低限の機能を提供するものとのことですので、基本的に単純なつくりになっているのは良いことだと思います。
 

んーぞー

ユーザー
申し訳ありません、完全に勘違いしていました…まっつUPさんのおっしゃっていた通り、現状のコードでは「上に設定したステートほど優先される」という仕様が反映されていませんでした。

以下のようなコードにすることで仕様通りの動作になることを確認しました。
こうすることでACTOR_PICTURES.statesの中身がACTOR_PICTURES.damagesと同様にオブジェクトになりますので、型が統一されて扱いやすくなるという効果も期待できるかと思います。

JavaScript:
const ACTOR_PICTURES = [];
for (const str of JSON.parse(PluginManager.parameters(PLUGIN_NAME).actorPictures)) {
    const obj = JSON.parse(str);
    const actorId = Number(obj.actorId);
    const normalPictures = JSON.parse(obj.normalPictures);
    // ここから変更
    const statePictures = [];
    const stateArray = JSON.parse(obj.statePictures);
    for (const stateStr of stateArray) {
        const stateObj = JSON.parse(stateStr);
        stateObj.stateId = Number(stateObj.stateId);
        stateObj.pictures = JSON.parse(stateObj.pictures);
        statePictures.push(stateObj);
    }
    // 変更ここまで
    const damagePictures = [];
    const damageArray = JSON.parse(obj.damagePictures);
    for (const damageStr of damageArray) {
        const damageObj = JSON.parse(damageStr);
        damageObj.damageRate = Number(damageObj.damageRate);
        damageObj.pictures = JSON.parse(damageObj.pictures);
        damagePictures.push(damageObj);
    }
    damagePictures.sort((a, b) => a.damageRate - b.damageRate);
    ACTOR_PICTURES[actorId] = {
        normals: normalPictures,
        states:  statePictures,
        damages: damagePictures
    };
}

Game_Actor.prototype.statePictureName = function() {
    const obj = ACTOR_PICTURES[this._actorId];
    if (obj) {
        const states = obj.states;
        // statesの要素がオブジェクトになった
        for (const stateObj of states) {
            if (stateObj && this.isStateAffected(stateObj.stateId)) return stateObj.pictures[this._pictureIndex];
        }
    }
    return "";
};

度重なるご指摘をいただいていたにもかかわらず、過ちに気づけなかったことをお詫び申し上げます。

この修正はアップデートの際に反映します。
その際はこれ以外にもこれまでのご意見を反映したいと思います(「ピクチャ」という文言をやめる、など)。
 

まっつUP

ユーザー
いえいえ、プラグインパラメータの説明との差異が解消されたようで何よりです。
より多くの方の意見を伺えばさらにベースプラグインとして完成度が高まるかもしれませんね。
引き続き開発のご健闘をお祈りします。
 

んーぞー

ユーザー
これまでにいただいたご意見をフィードバックし、ActorPictures.js1.1.0に更新いたしました。


  • ステート立ち絵の優先順位がおかしかった点を修正
  • プラグイン内説明の「ピクチャ」という文言を全て「立ち絵」に変更
  • 立ち絵のプリロードを、自動的なもの(プラグインパラメータ)と手動によるもの(プラグインコマンド)の2種類に
    • プラグインパラメータ全ての立ち絵をシーン開始時に自動プリロードオンにするとあらゆるシーンの開始時に自動的に全ての立ち絵がプリロードされます。
      • デフォルトはオフです。
    • プラグインコマンド立ち絵をプリロードするを呼び出すことで、任意のタイミングでプリロードできます。
      • このコマンドの引数はすべてパーティ内アクターの2種類が用意されています。
  • MZ1.3.0のサブフォルダに対応

ご不明点やご意見等ありましたらお気軽にお知らせください。
よろしくお願いいたします。
 
最後に編集:

んーぞー

ユーザー
ActorPictures.js1.2.0に更新いたしました。


本バージョンにて、立ち絵のズレを画像ファイルごとに調整するためのプラグインパラメータを追加いたしました。
スクリーンショット 2021-07-04 7.40.02.png

中心X座標とは、画像の水平方向中心座標を指定するためのパラメータです。例えば立ち絵を画面中央に配置するプラグインがあったとします。何も補正がないと、例えばMZ付属全身立ち絵Actor1-6などの、顔が中央に配置されていない画像の場合違和感があります。
スクリーンショット 2021-07-04 7.52.39.png

これを矯正するために、顔の位置を画像の中心とみなすためのパラメータになります。

Y座標オフセットとは、垂直方向に画像の表示位置をずらすためのパラメータです。例えば帽子などの装飾品により、顔の位置が他と比べて低い画像を調整するために使用します。

スクリーンショット 2021-07-04 7.59.22.png

XY座標両方の補正後の見た目は以下のようになります。

スクリーンショット 2021-07-04 8.02.37.png

なおこれらのパラメータはアクターではなく画像ファイルを対象とした指定である点にご注意ください。

中心X座標ImageManager.centerXにより取得できます。画像ファイル名を引数に取ります。未設定の場合、-1を返します。

JavaScript:
ImageManager.centerX = function(pictureName) {
    const obj = PICTURE_CALIBRATIONS[pictureName];
    if (obj) {
        return obj.centerX;
    } else {
        return -1;
    }
};

Y座標オフセットImageManager.offsetYにより取得できます。こちらも画像ファイル名を引数に取ります。未設定の場合、0を返します。

JavaScript:
ImageManager.offsetY = function(pictureName) {
    const obj = PICTURE_CALIBRATIONS[pictureName];
    if (obj) {
        return obj.offsetY;
    } else {
        return 0;
    }
};

加えて、本バージョンではWindow_Base#drawActorPictureの引数が追加されました。
第四引数に描画幅、第五引数に描画高さ、第六引数に画像を中央揃えするかどうか、第七引数に画像を垂直方向にずらすかどうかの指定ができるようになりました。第六・第七引数は上記プラグインパラメータを反映します。第四引数以降はすべて省略可能です。

JavaScript:
Window_Base.prototype.drawActorPicture = function(actor, x, y, width, height, alignCenter=false, offsetVertically=false) {
    const pictureName = actor.pictureName();
    const bitmap = ImageManager.loadPicture(pictureName);
    const bw = bitmap.width;
    const bh = bitmap.height;
    const w = width || bw;
    const h = height || bh;
    let sx = 0;
    if (alignCenter && w < bw) {
        const centerX = ImageManager.centerX(pictureName);
        const cx = (centerX > 0) ? centerX : (bw / 2);
        sx = (cx - w / 2).clamp(0, bw);
    }
    const sy = offsetVertically ? ImageManager.offsetY(pictureName) : 0;
    this.contents.blt(bitmap, sx, sy, w, h, x, y);
};


また、ActorPictures.jsを利用したプラグインのサンプルも兼ねて、以下の2つのプラグインを作成いたしました。
上記新プラグインパラメータを使用して座標ズレを調整していますので、その例としてもご覧いただけます。



ActorPictureOnAltMenuScreen.jsは、ロンチプラグインAltMenuScreen.jsにより変更されたメニュー画面にて、顔グラフィックの代わりに立ち絵を表示するだけの非常にシンプルなプラグインです。

スクリーンショット 2021-07-02 17.26.17.png

PictureMessage.jsはメッセージにて立ち絵を自動表示するためのプラグインです。詳細はフォーラムのスレッドをご覧ください。



上記のいずれも、ActorPictures.jsにて設定された立ち絵を反映します。設定が一元化されるので設定の労力が軽減されますし、差分が一貫して使用されるという効果もあります。



本スレッドの趣旨から言うと、このような立ち絵の一元管理が他の立ち絵表示プラグインにも適用されればユーザーさんにとって大きなメリットがあると信じます。


ご不明点等あればお知らせください。
よろしくお願いいたします。
 

んーぞー

ユーザー
ActorPictures.js1.3.2に更新いたしました。


立ち絵のループアニメ再生に対応しました。


素材規格としては単純に、アニメのパターンを任意の数だけ横方向に並べたものを使用します。

スクリーンショット 2021-07-04 21.40.23.png

アニメのパターン数はプラグインパラメータアニメパターン数にてユーザーが指定します。
また、パターンの間隔もプラグインパラメータにて指定できます。

これに伴い、画像ファイルの幅を取得する際に1パターン分の幅のみを取得するための関数をImageManagerに定義しています。

JavaScript:
ImageManager.pictureWidth = function(pictureName) {
    const bitmap = this.loadPicture(pictureName);
    return bitmap ? bitmap.width / this.animationNumPattern(pictureName) : 1;
};


このアニメ機能は会話時立ち絵自動表示プラグインにて使用されています。アニメ機能利用サンプルとしてご覧ください。


また、トリアコンタンさんのカスタムメニュー作成の改造プラグインもこのアニメ機能に対応するようにアップデートいたしました。こちらもサンプルとしてご活用ください。




ご不明点等あればお知らせください。
よろしくお願いいたします。
 
最後に編集:
トップ