PIXI.jsには全く詳しくないんですけど
こういうのを見ると出来そうな気がしてきますよね。
試しに手探りで実装してみたんですけど一応それっぽいのは出来ました。
他にスマートな方法はありそうですけどよろしければ動作チェックしてみてください。
コードは全てイベントコマンド>スクリプトでコピペする事を想定しています。
①スポットライトを表示して画面左右に振らせる。
コード: 全て選択
const radius = 100; const focusY = 200;
const circle = new Bitmap(radius * 2, radius * 2);
circle.drawCircle(radius, radius, radius, '#880000');
const focus = new Sprite();
focus.bitmap = circle;
SceneManager._scene.addChild(focus);
SceneManager._scene._spriteset.mask = focus;
focus.ox = focus.oy = radius; focus.y = focusY;
focus.intervalId = setInterval(() => {
const widthHalf = Graphics.boxWidth / 2 - radius;
focus.x = widthHalf + Math.sin(Graphics.frameCount) * widthHalf;
}, 100);
※特にY軸はfocusYを弄って適当に調節してください。
②スポットライトを一度消す
コード: 全て選択
const lastIndex = SceneManager._scene.children.length - 1;
const focus = SceneManager._scene.getChildAt(lastIndex);
focus.bitmap = null;
③対象イベントにスポットライトを当てる
コード: 全て選択
const eventId = 2;
const lastIndex = SceneManager._scene.children.length - 1;
const focus = SceneManager._scene.getChildAt(lastIndex);
clearInterval(focus.intervalId);
const radius = 100;
const circle = new Bitmap(radius * 2, radius * 2);
circle.drawCircle(radius, radius, radius, '#FF0000');
focus.bitmap = circle;
const character = this.character(eventId);
focus.x = character.screenX() - radius;
focus.y = character.screenY() - radius - 24;
※eventIdが-1の場合はプレイヤ、イベントIDを指定した場合はそのイベントにスポットライトが当たります。
④残りのスポットライトに関連した処理を削除する。
コード: 全て選択
const lastIndex = SceneManager._scene.children.length - 1;
const focus = SceneManager._scene.getChildAt(lastIndex);
SceneManager._scene._spriteset.mask = null;
SceneManager._scene.removeChild(focus);
汎用性なんて全くなく想定外の使用をすれば間違いなくバグりますけど、
自動実行イベントで使用する分にはこの一連の4つのコードを使えば想定の演出くらいは可能かなぁ、と。
欲を言えばライトを二つ以上同時に動かしたかったんですけどマスク処理との相性が悪いですね。