フワフワソが「ソラとピヨちゃん」や「宮本県」を作るブログ(フワフワソ・ラウンジnew!)

ラノベとテクノを愛するふわふわがノベルゲームを作っています。あと日常のことやイベントの告知なども。スクリプト関連の記事は自分用の備忘録です

ややこしい比較演算(括弧を使う)

&&と||には優先順位があります。そして()を使って複雑な条件分岐をすることができます。

 

ティラノwikiより引用です。

tyrano.wiki.fc2.com

( ) を使った比較演算

かつ を使うときは 注意。
[if exp="f.flag1 == 1 && f.flag2 == 2 | | f.flag1 == 3"]
の場合 f.flag1が1でありf.flag2が2である。 または f.flag1が3となる。

つまりは、最後のかつ | | で判断されやすいので注意すべきではある。

[if exp="f.flag1 == 1 && (f.flag2 == 2 | | f.flag1 == 3)"]
の場合 f.flag1が1であり (f.flag2が2 または f.flag1が3)となる。

判定を( )で分けることで回避できるがウッカリすると強固な判定となってしまうのでこれも注意が必要である。
()を使うことで多重if文を一個にまとめることができます。
このへんいつも分からなくなるんですよね…。ティラノで()使えたっけ?みたいにうろ覚えになってしまいます。
wikiにはお世話になっています!
 
 

ティラノのホバー要素のトラブルあれこれ

 選択肢にマウスカーソルが乗った時に、ホバーで画像を出す方法。

選択肢の背景が変わるのは[button]タグに実装されていますが、そうじゃなくて別の場所に画像を出すパターンです。

[iscript]で実装できることまではわかりました。

 

jQueryで hoverを使う場合の例。参考にさせていただきました。

7yen.hateblo.jp

 

jQueryで mouseover,mouseoutの場合

以下のサイト様からanimateメソッドのところを参考にしました。

qiita.com

 

 そしてできたのがこれ。animateの縦移動とイージングのeaseOutBackを使ってホバーで画像がひょこっと飛び出すようにしています。

;ボタン定義

[button storage="sentaku.ks" target=*jumpjyunbi1 preexp=1 exp="f.sentaku = preexp" name="sentaku1,sentaku" graphic="tips/hukidashit.png" fix="true" auto_next="false" x=380 y=165 ]
[button storage="sentaku.ks" target=*jumpjyunbi2 preexp=2 exp="f.sentaku = preexp" name="sentaku2,sentaku" graphic="tips/hukidashit.png" fix="true" auto_next="false" x=380 y=396 ]



;選択肢1の予測アイコン表示
[image layer=6 name="yosokuhover1,yosokuhover11,yosokuhoverall" folder="image" storage='tips/yosokub.png' x=180 y=130 time=0 wait=true]
[image layer=6 name="yosokuhover1,yosokuhover12,yosokuhoverall" folder="image" storage='tips/yosokub.png' x=180 y=310 time=0 wait=true]
[image layer=6 name="yosokuhover1,yosokuhover13,yosokuhoverall" folder="image" storage='tips/yosokub.png' x=180 y=490 time=0 wait=true]
;選択肢2の予測アイコン表示
[image layer=6 name="yosokuhover2,yosokuhover21,yosokuhoverall" folder="image" storage='tips/yosokub.png' x=180 y=30 time=0 wait=true]
[image layer=6 name="yosokuhover2,yosokuhover22,yosokuhoverall" folder="image" storage='tips/yosokub.png' x=180 y=210 time=0 wait=true]
[image layer=6 name="yosokuhover2,yosokuhover23,yosokuhoverall" folder="image" storage='tips/yosokub.png' x=180 y=390 time=0 wait=true]
[anim name="yosokuhoverall" opacity=0 time=0]

;ホバー処理
[iscript]

$(".sentaku1").on({
mouseover: function(){
$(".yosokuhover11").css({position:"absolute",top:130});
$(".yosokuhover11").animate({top:'30px',opacity: 1}, 300 ,'easeOutBack');
$(".yosokuhover12").css({position:"absolute",top:310});
$(".yosokuhover12").animate({top:'210px',opacity: 1}, 400 ,'easeOutBack');
$(".yosokuhover13").css({position:"absolute",top:490});
$(".yosokuhover13").animate({top:'390px',opacity: 1}, 500 ,'easeOutBack');
},
mouseout: function(){
$(".yosokuhover1").animate({opacity: 0}, 200);
}
});

$(".sentaku2").on({
mouseover: function(){
$(".yosokuhover21").css({position:"absolute",top:130});
$(".yosokuhover21").animate({top:'30px',opacity: 1}, 300 ,'easeOutBack');
$(".yosokuhover22").css({position:"absolute",top:310});
$(".yosokuhover22").animate({top:'210px',opacity: 1}, 400 ,'easeOutBack');
$(".yosokuhover23").css({position:"absolute",top:490});
$(".yosokuhover23").animate({top:'390px',opacity: 1}, 500 ,'easeOutBack');
},
mouseout: function(){
$(".yosokuhover2").animate({opacity: 0}, 200);
}
});
[endscript]

これを何のために作ったかというと、選択肢の結果の予測画像をホバーで出したかったためです。 

なので、実際の利用時には、storage='tips/yosokub.png'のところをstorage=&f.s1yosoku[1]や&f.s1yosoku[2]などとしてあります。[eval exp="f.s1yosoku[1] = 'tips/yosokub.png'"]という形で画像のファイル名を変数に入れることで、条件次第で常に違う画像をホバーさせることができます。

 

 実装はできましたが、問題が発生しました。

ホバー画像が出ない時があるのです。

 

原因究明に時間がかかりましたが、原因は[iscript]にたどり着く前に「文字送り」をめちゃくちゃ連打することなのがわかりました。

連打プレイはありえないことではありません。早く先を読みたいと思ってたり、リプレイで飛ばしたいテキストが分かってるときなどに、キーボードのリターンキー連打で発生します。

また、文字送りをマウスホイールに割り当てて、マウスホイールを素早く転がしながらテキストを読んでいると、かなりの頻度でこの不具合に突き当たります。

 

解決法その1

連打ができないようにすればいいのではないか?と思い、[iscript]の手前で入力を殺すことにしました。つまり、文字送りの入力をできなくしてから[iscript]の処理を行うのです。

入力を止める機能はデフォルトでは実装されていません。なのでいろいろ検索したところ、config.tjsをいじる方法が公開されていました。

ティラノスクリプトマウス&キーボード操作の改造 · GitHub

こちらを参考に特定のフラグがたった時に入力をできなくさせたのですが、それでも解決しませんでした

入力ができないというよりも、入力後にfalseを返して何もしない状態にするようですが、それでもダメなようです。(原因よくわからない)

 

解決法その2

[iscript]じゃない方法でホバーを出します。[button]のenterimgを使います。通常はボタンの画像を変えるだけですが、下記のサイト様で、buttonタグのホバー時にx,y座標を変更するプラグインが公開されていました。これによって、ボタンと別な場所にホバー画像を出すことができます。

kido0617.github.io

この方法だと、[iscript]と違って、文字送り連打をしてもホバーがしっかりと働きます。なので不具合の原因がiscriptにある、というのが確認できました。

ちなみにiscriptの中身を、mouseoverではなくhover使用にしたり、animateを別な効果にしたりしてもやっぱり不具合は出るので、iscriptを使うことそのものが問題であると感じています。

さて、このマクロで一応解決はしたのですが、わたしの狙ったような挙動にはならなかったので、この方法も使わないことにしました。(ボタン画像を離れた場所に出すと、いったんenterimgが外れた感じになるため)

 

解決法その3

以前から感じていたのですが、ティラノでは動的に何かをしようとすると、スクリプトが不具合を起こすことがあります。例えば、文字の高速送りをctrlキーに割り当てて早送りするのはノベルゲーでは基本的なフォーマットですが、これをやると、わりとよくエラーが出ます。音楽が再生されないのはしょっちゅうですが、ときにはスクリプトを謎に飛び越えたりもします。

これと同じような仕組みで、文字送りキー連打が不具合を引き起こしてる可能性があります。

(ちなみに連打されているときに「テキスト+クリック待ちタグ」があるときは大丈夫です。

5回分くらいの「テキスト+クリック待ちタグ」が用意されていると、連打しても、クリック待ちのスタック的なもの(?)を消化して、[iscript]がきちんと処理されます。

ところが、「テキスト+クリック待ちタグ」が一回分くらいしかないときに連打すると、[iscript]が働かなくなります。)

内部的な仕組みはわかりませんが・・。

とりあえず、動的に何かをするとよくない=高速で文字を表示させるのが悪いのかもしれない、と思い、文字表示を遅くしました。

前回のエントリでconfig.tjsの文字速度を早くしてあったので、これをデフォルトの速さに戻しました。

しかし、解決しませんでした。

 

仕方がないので解決はあきらめました。

こちらにできることとしては、

[iscript]の前には、「テキスト+クリック待ちタグ」を5回分くらい確実に用意すること。

これによって、連打されても文字送りのスタック的なもの(?)を消化させるようにして、[iscript]が働きやすくします。

あとは、readme的なもので対処です。つまり、「ctrlで早送りをすると不具合が出がちです。また、マウスホイールで文字送りのとき、マウスホイールをたくさん回しすぎると、ホバー画像が出ない時があります。リターンキーでの文字送りも、連打しすぎるとホバー画像が出ない時があります」

こういった感じで何とかするしかありません・・。

一番肝心なのは、動的要素のあるゲームはティラノで作らないこと、だと感じました。

 

 

 

 

 

tipプラグインを使ってみた

自分で作ったtips画面がちょっと重いので、tipプラグインをお借りしてみました。

まず、そこに至った経緯。

 

1)ボタンを大量に表示させると重くなる

f:id:fuwafuwaso:20200502190513p:plain

自作tips画面です。

[image]や[button]を使って、既読未読の画像を切り替えながら、ボタンを40個くらい表示させてました。この自作tips画面とメイン画面とを行き来すると、さすがにもたつきが出ます

2)ティラノの仕様で、文字を瞬間表示させることができない

f:id:fuwafuwaso:20200502190512p:plain

これは意外なんですが、ティラノは、メッセージウィンドウで数行の文字表記をする、ギャルゲタイプのシステムしか想定していないと思われます。

この画面のようにノベル風に画面いっぱいに文字を大量に出そうとしても、瞬間表示ができません。[no_wait]というタグはありますが、ウェイトが0の瞬間表示になるのではなく、高速表記になるようです。

つまり、文字の表示される軌跡が見えるくらいのスピードです。

config.tjsをいじると、若干文字表示は早くなります。skipSpeed = 30となってるのを1にします。(0にしようとしたのですが、不具合報告を見かけたので1に)

// ◆ スキップスピード (ミリ秒/文字)
//スキップ時にどれくらいの早さで進むかを設定できる
;skipSpeed = 1;

しかしこれでもやはり瞬間にはなりません。文字表示の軌跡が見えます。

 

ではどうするか?

・解決法1

こちらのサイト様で瞬間表示用のプラグインが公開されています。

studio-overdrive.com

ただし、ティラノのバージョンが古く、現行のものではバックログが記録されなかったり、クリック待ち画像がうまく出なかったりします。

バックログはあきらめるとか、クリック待ち画像は設定で消すとかで、無理やり対応はできるかと思います。

・導入方法(バージョンが古いティラノ用なので、現行バージョンに入れるには以下のような工夫がいります):

boost_mode.ksの入ったboost_modeフォルダをscenarioフォルダに入れる。

boost_mode.jsの入ったboost_modeフォルダをothersフォルダに入れる。

first.ksで[call storage="boost_mode/boost_mode.ks"]

あとは[boost_mode_on][boost_mode_off]で高速化の切り替えができます。

ただ、やはりバックログやクリック待ちがないとだめ、というときには別の工夫がいります。

 

・解決法2

[ptext]を使う。

作者様のツイートされている方法です。

 [ptext]を使うと、大量の文字でも一瞬で表示できます。(ツイートでは[text]になってますが今はこのタグはリファレンスにないのかも?)

改行についてはhtmlの<br>タグを入れれば可能になります。

[ptext  text="あああああああ<br>ああああああ<br>あああああ<br>あああ" size=30 x=200 y=300 ]

 ただし、現行のバージョンでは改行タグが使用出来ない可能性があります。

私はv472を使用しているのですが、以降のバージョンではptext内の改行タグがそのまま<br>という文字で出力されてしまいます。(v501まで確認しましたが、解決していませんでした)

 ここは、ティラノをバージョンアップしないという手で行きたいと思います。

(今からティラノを入手される方は、公開されてる過去バージョンver475だとたぶんだめなので、ver461あたりを使用されるといいと思います)

 

・ptextで文章を作成する方法

 これが意外とめんどくさいです。

改行は<br>で解決するとしても、すべてのテキストを一行で書かなければいけません。

以下の書き方は大丈夫です

[ptext  text="古池や<br>かわず飛び込む<br>水の音<br>とかそんなことをいっぱい書く" size=30 x=200 y=300 ]

以下はダメです。タグが切れてしまいます。

[ptext  text="古池や<br>

かわず飛び込む<br>

水の音<br>

とかそんなことをいっぱい書く" size=30 x=200 y=300 ]

 つまり、作成中の文章の視認性をよくするためにテキストエディタ上で改行を入れると、もうそこでタグが切れてしまいます。これによって長い文章を作成する作業がとんでもなくめんどくさいです。(ここでいう改行は、<br>タグとは違うもの。エンターキーを押したときに入る、「↓」や「⏎」などで表示される不可視の改行コードのこと)

 

解決法として、エディタ上で長い文章を書いてから、一括で改行コードを削除すると若干楽になります。

サクラエディタの場合

置換→正規表現にチェック→改行コードを空白に置き換える

改行コードはLFの場合、\n になります。

たぶんティラノの場合LFだと思いますが、CRLFのときは、\r\n です。

これで文末の改行コードが削除され、長い文章が一行につながります。(もちろん<br>タグは残したままです!)

 

・TIPプラグインを導入

こういった試行錯誤の末、tipsプラグインをお借りしてみることにしました。

TIPプラグイン - めも調

htmlでtip画面をかぶせているので、私の自作tip画面より軽くて速いです。

冒頭の「1)ボタンを大量に表示させると重くなる」という問題はこれで解決できました。

工夫として、メイン画面から常にtips一覧を表示できるようにしました。

プラグイン公式では、ボタンの設定にexp="TYRANO.kag.menu.displayTiplist()"をするようになっています。

TIP一覧表示は [button] タグに exp="TYRANO.kag.menu.displayTiplist()" を指定してください。
例:[button x=0 y=0 fix=true graphic="button_tip.gif" exp="TYRANO.kag.menu.displayTiplist()"]

やってみたのですが、これだけだと、tips一覧からメイン画面に戻った時に、メッセージがワンクリックぶん進んでしまうので、バックログを取得して再表示させるようにしました。

初期設定。ボタン設定

[button x=1765 y=830 graphic="tips/mokuji/lhack-in.png" name="tipsall,tips12" fix="true" auto_next="false" preexp="12" exp="TYRANO.kag.menu.displayTiplist()" storage="lifehack.ks" target=*lifehack_tipver]

 

ボタンを押したらここに来る。

lifehack.ks内

*lifehack_tipver

[iscript]
f.loghukki = $(".current_span").html();
[endscript]
[er]
[nowait]
[emb exp="''+f.loghukki"]
[endnowait]
[return]

ちょっと変な使い方かもしれませんが、これで一応意図した動きはできました。

(ただし、これも現行のティラノではうまくいきません。バックログを取得すると変なタグが入ってしまいます。こういった事情もあって、古いバージョンのティラノを使い続けています)

ここの処理まるっといらなかったです! バックログが2重になるバグが出たので。

ワンクリックぶん勝手に進む謎はよくわからないうちにかいけつできました@_@;

ただの空returnにしたせい?

 

また、このプラグインのテキスト作成も、csv形式なので、一行ですべてを記述する必要があります。そのときには、上記のサクラエディタの場合」のやり方が役に立つと思います。

ptextだけでやるのと違ってhtmlタグを使ってTIPS内に画像も差し込めますし、全部画像にすることもできそうです。とてもすばらしいプラグインです。

テキスト表示もhtmlなんでしょうか。

2)ティラノの仕様で、文字を瞬間表示させることができない」

という問題もこのプラグインで解決できます。