くらむぼん様のOnlineAvatarについて【解決】

返信する
tetu
記事: 57
登録日時: 2019年8月02日(金) 18:25

くらむぼん様のOnlineAvatarについて【解決】

投稿記事 by tetu »

こちらのプラグインを
ゲーム内のスイッチのONOFFによって
プラグインの通信自体をあり、なし(プラグインを停止)
することはできませんでしょうか?
スクリプトで条件分岐のスイッチのONOFFを記載したら
書き方がおかしいのか value が無いよ?とういうエラーがでます
色々自分なりに試してみましたがONOFFをできませんでした
ご助力お願いしたいです
最後に編集したユーザー tetu [ 2020年3月07日(土) 23:35 ], 累計 1 回
アバター
Plasma Dark
記事: 736
登録日時: 2020年2月08日(土) 02:29
連絡する:

Re: くらむぼん様のOnlineAvatarについて

投稿記事 by Plasma Dark »

スクリプトで条件分岐のスイッチのONOFFを記載したら
書き方がおかしいのか value が無いよ?とういうエラーがでます
書いた内容を貼り付けていただけると助言しやすくなります。
ゲーム内のスイッチのONOFFによって
プラグインの通信自体をあり、なし(プラグインを停止)
することはできませんでしょうか?
firebase にはメソッドとして goOffline と goOnline がありますので、
スイッチ変化にフックしてそれらを呼び出せば実現可能かと思います。
https://firebase.google.com/docs/refere ... e.Database
tetu
記事: 57
登録日時: 2019年8月02日(金) 18:25

Re: くらむぼん様のOnlineAvatarについて

投稿記事 by tetu »

条件分岐は
$gameSwitches.value(設定したい番号)
こちらをifでの分岐で行いました
各、OnlineManager.〇〇〇 = function()の下にこちらを記載してifの中に全部入れたらどうなるのかなぁと思って
やってみました
これをやると、valueがエラーになります
もしかしたら、このプラグイン自体が(function() {で全部をくくっているため
起動時に$gameSwitches.valueこれをスクリプトで定義する前に動いていたりするのかなぁ~など
色々試行錯誤しております
見当違いの事をしているのかもしれませんが、if else で分けることができたら
もしかしたら、サーバー変更などもできるんじゃないかなぁなど考えております
アバター
Plasma Dark
記事: 736
登録日時: 2020年2月08日(土) 02:29
連絡する:

Re: くらむぼん様のOnlineAvatarについて

投稿記事 by Plasma Dark »

もしかしたら、このプラグイン自体が(function() {で全部をくくっているため
起動時に$gameSwitches.valueこれをスクリプトで定義する前に動いていたりするのかなぁ~など
無名関数でくくっているから、というわけではありません。
が、 $gameSwitches に Game_Switches インスタンスを代入する前に初期化が走るので、その部分は認識通りかと思います。

まず、 OnlineAvatar.js は firebase.database を利用した非同期型イベント駆動のプログラムを主としています。
このあたりは firebase の公式ドキュメントに詳しく書かれていますが、アレを読むにも多少の知識が必要なので、ざっくり噛み砕いてみます。

公式ドキュメント:
https://firebase.google.com/docs/databa ... data?hl=ja

例えば、 OnlineAvatar.js 内の以下の記述から見ていきましょう。

コード: 全て選択

this.switchRef = firebase.database().ref('switches')
これは firebase のデータベース上の switches という名前のデータへの参照です。
firebase.database.Reference 型には、 on メソッド等でイベントを登録し、登録された内容のイベントが発生した際に、対応して登録した処理を実行させる仕組みがあります。

コード: 全て選択

this.switchRef.on('child_added', function(data) {
  $gameSwitches.setValue(data.key, data.val(), true);
});
on の第一引数はイベントの種類です。これは先程の公式ドキュメントにどんなイベントか書かれているので詳細はそちらを参照してください。
child_added は参照しているデータに子要素が追加された時に発生するイベントです。
firebaseのデータベース上に登録されたスイッチリストの子要素、つまり、スイッチそのものですね。
他のプレイヤーがオンラインでfirebaseデータベース上にスイッチを追加した時に、それを検知して実行する処理を書いています。

イベント発生時の処理として書かれているのは、 $gameSwitches.setValue なので、このコードは firebaseデータベース上に誰かがスイッチを追加したら、自分のゲームのスイッチも同期する、というコードです。
正確には、スイッチが追加されたイベントと、イベントを検知した時に実行する処理(長いので以後イベントハンドラと呼びます)を登録するだけであって、 on メソッド実行時にその場でゲーム自体の処理を止めて誰かがスイッチを追加したかな?と待ち続けることはありません。

長くなりましたが、つまるところ、これらのイベントハンドラ登録処理だけを条件分岐で切り替えようとする、というアプローチは接続状態を変えたいという要求にはそぐわないのです。
接続状態を変えたい場合どうすればよいか、については次の書き込みに書きます。
アバター
Plasma Dark
記事: 736
登録日時: 2020年2月08日(土) 02:29
連絡する:

Re: くらむぼん様のOnlineAvatarについて

投稿記事 by Plasma Dark »

firebase への接続状態(つまり、 OnlineAvatar.js におけるオンライン状態)を切り替えるためには、 firebase.database.Database に定義された goOffline 及び goOnline メソッドを使用します。
(最初の返信に貼ったURLでリファレンスを確認できます)

特定のスイッチと連動したいということでしたので、 Game_Switches.prototype.setValue にフックしてしまうと良いでしょう。

コード: 全て選択

OnlineManager.goOffline = function () {
  firebase.database().goOffline();
};

OnlineManager.goOnline = function () {
  firebase.database().goOnline();
};

const offlineSwitch = 1; // プラグインパラメータ化するなり何なりご自由に
const _Game_Switches_setValue = Game_Switches.prototype.setValue;
Game_Switches.prototype.setValue = function (switchId, value, byOnline) {
  _Game_Switches_setValue.call(this, switchId, value, byOnline);
  if (switchId === offlineSwitch) {
    if (value) {
      OnlineManager.goOffline();
    } else {
      OnlineManager.goOnline();
    }
  }
};
こんな感じのコードを書いたプラグインを OnlineAvatar.js の下に追加すれば動くんじゃないかなと思います。
firebase オブジェクトのスコープ次第では、 OnlineManager 周りの記述を OnlineAvatar.js そのものに追加する必要はあるかもしれません。

※条件式にスペルミスがあったため修正しました。
最後に編集したユーザー Plasma Dark [ 2020年3月08日(日) 02:55 ], 累計 1 回
tetu
記事: 57
登録日時: 2019年8月02日(金) 18:25

Re: くらむぼん様のOnlineAvatarについて

投稿記事 by tetu »

無事動かすことができました

なぜかofflineSwitch が設定されていないよ?というエラーが出ましたが
const offlineSwitch = 1;この部分を//const offlineSwitch = 1;にし
if (switchId === offlieSwitch)こちらの表記に
直接設定したいスイッチ番号を記載したところ動作しました
tetu
記事: 57
登録日時: 2019年8月02日(金) 18:25

Re: くらむぼん様のOnlineAvatarについて

投稿記事 by tetu »

こちらの処理でONOFFを切り替えて通信回数?容量を減らす工夫をしてみます
一番いいのは、このプラグインを二つ起動してfirebaseのデーター保管先を2個所などにできれば
良いのですが、さすがにそれは出来なさそうなのでコレでいったん解決にされていただきます
ありがとうございました。
返信する

“MV:質問”に戻る