見出し画像

[ティラノスクリプト]スキップや文字送りでフリーズしてしまうバグの回避方法

今回は少し技術的な話をさせていただこうと思います。
けっこう何個か記事を拝見しており、今回のゲーム制作で困って改造したことを整理しております。複雑に構成していないデフォルトの方は、そこまで需要はないかもしれません。

今回の事象

スキップやオートなど自動文字送りやテキスト送りを早くしてしまうことでフリーズしてしまう事象が起こりました。
これは他のサイト様でも一定回避方法が語られていますが、それだけでは直りませんでした。

検証してみると、主にスキップやオートスピードが速い状態で画像切り替えや色々な処理を同時にやるとフリーズしてしまうというものでした。

キャラの画像もデバックモードで見ると重なっている

ここまでは、ねこの様のnoteのテストプレイでskipの回避方法の記載があったので、それを適応して乗り切れるものでした。

さらなる問題

まずはマウスホイールの動きに連動した場合に、同じ現象が起きてしまいました。しかもスキップ時も発生したり、しなかったりと原因が分からない時は正直悩みました。
他にもオートのスピードMAX時や、エンタークリックを連打すると同じことが再現されていき、色々な処理を短時間で行ったことが原因だと把握しました。
私の場合はそれが画像切り替え複数と文字送りの組み合わせが原因でしたので、至ってシンプルでした。

対処方法

ここからは個人的に改造したり触っている部分なので、同じことをすぶ場合は自己責任で。きっと別の方法で似たようなこともできるはず。

ざっくりやっていること

kag.key_mouse.js

マウスホイールの挙動のwheel_doenの”next”を個別の挙動にするために"next_wheel"(任意)にします。nextのままだと他のnextにも影響が出てしまうので、あくまでマウスホイール挙動の時のみに限定するためです。

mouse: {
	right: "hidemessage",
	center: "menu",
	wheel_up: "backlog",
	wheel_down: "next_wheel"
},

次に"next_wheel"の中身を記述します。
"next"とつなげて書くと管理しやすいです。
その中で「this.kag.stat.chara_time」と「this.kag.cutTimeWithSkip」を0に設定します。これでマウスホイール時のみキャラの切り替え速度を変更することができます。

next_wheel: function() {
	this.kag.key_mouse.canClick() && $(".layer_event_click").click(),
	this.kag.stat.chara_time = 0,
	this.kag.cutTimeWithSkip(0)
},

ちなみにEnter連打でフリーズするのは、ここにある"next"にwaitを設定するとフリーズしなくなりました。

next: function() {
	this.kag.ftag.startTag("skipstop"),
	this.kag.ftag.startTag("wait", {
	time: 600
	}
		),
	this.kag.key_mouse.canClick() && $(".layer_event_click").click(),
	this.kag.stat.chara_time = 600,
	this.kag.cutTimeWithSkip(600)
}

kag.tag.js

440行目あたりにある「tyrano.plugin.kag.tag.l」以降を変えていきます。
ここではis_skipとis_auto時に「this.kag.stat.chara_time」と「this.kag.cutTimeWithSkip」を0に設定します

start: function () {
    var that = this;
    this.kag.ftag.showNextImg();
    if (1 == this.kag.stat.is_skip)
      this.kag.stat.chara_time = 0,
  		this.kag.cutTimeWithSkip(0),
      this.kag.ftag.nextOrder();
    else if (1 == this.kag.stat.is_auto) {
      this.kag.stat.chara_time = 0,
  		this.kag.cutTimeWithSkip(0),
      this.kag.stat.is_wait_auto = !0;
      var auto_speed = that.kag.config.autoSpeed;
      if ("0" != that.kag.config.autoSpeedWithText) {
        var cnt_text = this.kag.stat.current_message_str.length;
        auto_speed = parseInt(auto_speed) + parseInt(that.kag.config.autoSpeedWithText) * cnt_text
      }

再びkag.key_mouse.js

最後らへんにある"clearSkip"に追記します。
これはskipを停止した時の動作に追加しております。
キャラ切り替え速度を戻しているのと、停止時に間隔を空けています(ここは好みで入れなくても大丈夫かもしれない)

clearSkip: function() {
	if (1 == this.kag.stat.is_skip && 0 == this.kag.stat.is_strong_stop)
	this.kag.ftag.startTag("skipstop"),
	this.kag.ftag.startTag("wait", {
		time: 1000
	}),
	this.kag.stat.chara_time = 600,
	this.kag.cutTimeWithSkip(600)
	return
	this.kag.stat.is_skip = !1, !1;

以上で問題なく動作しました。

そもそもの原因は?

こちらの原因は前述でもありますが、基本はティラノスクリプトの処理落ちなので、処理負荷を軽減してあげれば解決です。
モンキーテストなどで自分で改造してある部分を混ぜるとたまに出るかもしれません。私はメニュー画面とスキップを組み合わせて、テキストが読み終わるまでに速度を変更してメニューを閉じるとフリーズする事象がありました。そのため1秒近いウェイトをメニューに入れることで回避しました。

それでは、また何かお役に立てそうな情報があれば書いていきたいと思います。


この記事が参加している募集

ゲームで学んだこと

この記事が気に入ったらサポートをしてみませんか?