2018年11月7日(水)
ティラノスクリプトで釣りのミニゲームを作ってみたティラノスクリプトでシンプルな釣りゲームを作ってみました。 注意:私は「とりあえず動けばいいや!」という考えでスクリプトを書いてるので、処理が重いとか軽いとか速いとか遅いとか、スクリプトが読みやすいとか読みにくいとか、一切考えていません。 ※2018/11/14:誤字修正&加筆編集しました 目次どんなゲーム?釣り糸を垂らして魚がかかるのを待ち、魚がかかったら(水しぶきがたったら)素早くクリックして魚を釣る、シンプルな釣りのミニゲームです。 ※ GoogleChromeでのみ動作確認済み サンプルデータのダウンロードサンプルゲームのデータ(画像ファイルとシナリオファイル)を配布中です。 ■動作方法 ■動作確認をした環境 ■使用したティラノスクリプト: ver472 ※サンプルのダウンロード元をYahooボックスからGoogleドライブに変更しました。(2022/2/12) ※(23/5/20追記)上記リンクでダウンロードできない場合はこちらからもダウンロードできます。 ざっくりとした仕組みの説明サンプルデータに入ってる「main.ks」の流れを簡単に説明するとこんな感じです。 「main.ks」はティラノスクリプトの標準タグばかりで書かれたスクリプトです。 詳しい説明ファイル構成
それではシナリオデータの「main.ks」の上から順番に説明していきます。
;まず色々定義をします
;魚が暴れるキーフレームアニメを定義 [keyframe name="fishact"] [frame p=0% x=20 y=20] [frame p=50% x=10 rotate="10deg"] [frame p=100% x=-10 rotate="-10deg"] [endkeyframe] ;定数の定義 ;魚タイプ(配列番号が画像の番号に該当 / 0:小タイプ / 1:中タイプ / 2:大タイプ) @eval exp="f.FISH_TYPE=[0,0,0,0,1,1,1,2,2,2]" ;魚の名前(配列番号が画像の番号に該当) @eval exp="f.FISH_NAME=['青の小魚','緑の小魚','黄色の小魚','ピンクの小魚','青の中魚','黄色の中魚','赤の中魚','水色の大魚','黄緑の大魚','赤の大魚']" ;小タイプ(簡単)の待ち時間 @eval exp="f.EASY_TYPE=1200" ;中タイプ(普通)の待ち時間 @eval exp="f.NORMAL_TYPE=900" ;大タイプ(難しい)の待ち時間 @eval exp="f.HARD_TYPE=700" まず魚がかかって暴れてる時のキーフレームアニメ「fishact」を定義しときます。ばたばた動く感じに作ってます。 次に定数の定義をします。 配列についての説明を見る配列というのは、複数のデータを持つ変数です。 f.EASY_TYPE、f.NORMAL_TYPE、f.HARD_TYPEは魚がかかってから逃げるまでの時間を定義しています。 2 メイン画面を表示する(37行目あたり~)
*main
;メイン画面 [wait_cancel] [clearstack] [cm] [freeimage layer=0] [freeimage layer=1] [layopt layer=0 visible=true] [layopt layer=1 visible=true] [layopt layer=message0 visible=false] ;空を表示(背景) [bg storage="sky.png" time=0] ;水を表示(レイヤー1) [image layer=1 storage="sea.png" folder="image" x=0 y=290] ;タッチボタン [clickable target="*start" width=960 height=640 x=0 y=0] [s] 最初の「;メイン画面」のあたりでは、レイヤーを表示したり非表示にしたりして画面を整えています。 「;空を表示」では、背景レイヤーに空の画像(sky.png)を表示し、「;水を表示」ではレイヤー1に水の画像(sea.png)を表示しています。 「;タッチボタン」ではclickableタグでゲーム画面全域にクリック判定用のボタン的なやつを作っています。 3 糸を表示して、水の中に垂らす(60行目あたり~)
*start
;釣りをスタートする [wait_cancel] [clearstack] [cm] [freeimage layer=0] [free name="effect" layer=1] ;糸を垂らす準備 @eval exp="f.tutu=0" @eval exp="f.hit=0" @eval exp="f.tutumax=Math.floor(Math.random()*4)" ;糸を表示(レイヤー0) [image name="line" layer=0 storage="line.png" folder="image" x=470 y=-430] [anim name="line" top="+=390" time=200] [wait time=200] ;タッチボタン [clickable target="*up" width=960 height=640 x=0 y=0] *wait ;魚が来るまで待つ @eval exp="tf.ran=Math.floor(Math.random()*1000)+500" [wait time="&tf.ran"] 「;釣りをスタートする」では、レイヤーを消したり表示したりして画面を整えます。 「;糸を垂らす準備」のあたりで定義している変数は、ぶっちゃけ糸とあんまり関係ないんですが、
f.tutuが魚がつついた回数、f.hitが現在の魚の状況、f.tutumaxが魚がつつく回数、を表す変数になっています。 乱数についての説明を見るここではJavaScriptのMath関数を使って乱数を振っています。 「;糸を表示」のあたりではimageタグで画面外(表示範囲より上)に釣り糸の画像を設置し、 animタグで上から下に降ろします。 「;タッチボタン」ではclickableタグでゲーム画面全域にクリック判定用のボタン的なやつを置きます。 そしてclickableタグの後、いつもの[s]ではなく、waitタグを書くのがポイントです。 今回のように、選択肢(clickableタグも含む)を表示した時、[s]で止めずにwaitタグで制限時間を設ける場合、ジャンプ先でwait_cancelタグを書いておくのが重要みたいです。 尚、ここでは、糸を垂らしてから魚が表示されるまでの時間にランダム要素を持たせるために、乱数を使用しています。 4 魚が表れて釣り針の付近まで来る(88行目あたり~)
*fish_show
;魚が来る準備 @eval exp="f.hit=1" ;魚の種類を決める乱数 @eval exp="f.number=Math.floor(Math.random()*f.FISH_TYPE.length)" ;魚の大きさ判定 ;---小タイプ:簡単 [if exp="f.FISH_TYPE[f.number]==0"] [eval exp="f.type='fish1.png'"] [eval exp="f.wait=f.EASY_TYPE"] ;---中タイプ:普通 [elsif exp="f.FISH_TYPE[f.number]==1"] [eval exp="f.type='fish2.png'"] [eval exp="f.wait=f.NORMAL_TYPE"] ;---大タイプ:難しい [else] [eval exp="f.type='fish3.png'"] [eval exp="f.wait=f.HARD_TYPE"] [endif] ;魚を表示(レイヤー0) [image layer=0 name="fish" storage="&f.type" folder="image" x=-80 y=360] [anim name="fish" left="+=405" time=1000] [wait time=1000] 「;魚が来る準備」でf.hitに1を代入しています。 「魚の種類を決める乱数」では、今から表示される魚の種類を決定するために、f.numberに0~9の乱数を代入しています。
f.FISH_TYPE.lengthはf.FISH_TYPEが持っているデータの数を表します。ここではf.FISH_TYPEは10個のデータを持っていますので、10ということになります。 「;魚の大きさ判定」では、f.numberに代入された魚の種類を表す数値と、配列変数のf.FISH_TYPEを使って魚のタイプを判定します。
f.FISH_TYPE[f.number]がもし0であれば小タイプなので、魚影の画像ファイル名を代入するf.typeという変数に、小タイプの魚影画像である「fish1.png」を代入します。また、魚がかかってから逃げるまでの時間を表すf.waitには定数のf.EASY_TYPEを代入しています。 「;魚を表示」で、今の判定で決まった魚影の画像ファイルを、imageタグとanimタグを使って表示させます。 5 魚が釣り針をつつく(116行目あたり~)
*fish_poke
;魚の行動を待つ @eval exp="tf.ran=Math.floor(Math.random()*1000)+500" [wait time="&tf.ran"] ;魚がつつく [anim name="fish" left="+=70" time=300] [wait time=300] ;f.tutumaxの数だけ繰り返しつつく [if exp="f.tutu>=f.tutumax||f.tutu>=5"] [jump target="*hit"] [else] [eval exp="f.tutu+=1"] [jump target="*fish_back"] [endif] [s] 表示された魚は「;魚の行動を待つ」で1~1.5秒くらい待機したあと、「;魚がつつく」のanimタグで釣り針に近づきます。 その後のif構文で、つついた回数であるf.tutuが、f.tutumax以上になったら(もしくは5以上になったら)、ラベル*hitにジャンプして、魚がかかった時の状況になります。f.tutuの回数がf.tutumaxより少なければ、f.tutuをプラス1し、ラベル*fish_backにジャンプして、魚が一旦釣り針から離れる処理をします。 6 魚が少し離れる(136行目あたり~)
*fish_back
;魚が離れる [anim name="fish" left="-=70" time=300] [wait time=300] @jump target="*fish_poke" [s] animタグを使用して、魚が釣り針から少し離れる処理をします。 7 魚が食いつく(144行目あたり~)
*hit
;ヒットした! [kanim name="fish" keyframe="fishact" time=200 count="infinite"] [anim name="line" top="+=20" time=200] [image layer=1 name="sibuki" storage="hit.gif" folder="image" x=330 y=250] @eval exp="f.hit=2" [wait time="&f.wait"] ;時間オーバーで逃げられる [cm] @eval exp="f.hit=1" [free layer=1 name="sibuki"] [stop_kanim name="fish"] [anim name="fish" left="-90" time=500] [wait time=500] [freeimage layer=0] ;逃げられたメッセージ表示 [ptext layer=1 name="effect" text="逃げられた…" width=960 x=0 y=200 size=28 align=center color="black"] ;タッチボタン [clickable target="*start" width=960 height=640 x=0 y=0] [s] 「;ヒットした!」では、まず、kanimタグでスクリプト冒頭で定義したキーアニメ「fishact」を呼び出して、魚がかかって暴れだすアニメーションを始めます。imageタグで水しぶきの画像も表示します。ちなみに水しぶきの画像はGIFアニメです。 そして、f.hitに2を代入して、魚がかかっている状態であることを表します。 さらに、ラベル*fish_showで定義したf.waitの秒数だけ、待機します。 「;時間オーバーで逃げられる」では、まず[cm]で画面クリック判定用のclickableボタンを削除します。そしてf.hitに1を代入し、もう魚がかかっている状態じゃないことを表します。 8 釣り上げる&結果表示(170行目あたり~)
*up
;糸を引く [wait_cancel] [free layer=1 name="sibuki"] [anim name="line" top="-=150" time=200] [if exp="f.hit==2"] ;---魚釣り成功の場合 [stop_kanim name="fish"] [anim name="fish" top="-=130" time=200] [wait time=500] [freeimage layer=0] [ptext layer=1 name="effect" text="お魚ゲット!!" width=960 x=0 y=30 size=50 align=center color=black] [image layer=1 name="effect" storage="&f.number+'.png'" x=405 y=200] [ptext layer=1 name="effect" text="&f.FISH_NAME[f.number]" width=960 x=0 y=370 size=40 align=center color=black] [elsif exp="f.hit==1"] ;---逃げられてしまう場合 [stop_kanim name="fish"] [anim name="fish" left="-90" time=500] [wait time=500] [freeimage layer=0] [ptext layer=1 name="effect" text="逃げられた…" width=960 x=0 y=200 size=28 align=center color="black"] [else] [freeimage layer=0] ;---まだ魚が来ていなかった場合 [ptext layer=1 name="effect" text="何も釣れなかった…" width=960 x=0 y=200 size=28 align=center color="black"] [endif] ;タッチボタン [clickable target="*start" width=960 height=640 x=0 y=0] [s] この*upラベルは釣り糸を垂らした状態で画面をクリックした時の処理がまとめて書いてあります。 f.hitの数値によって、if構文で違う処理を行います。 まずf.hitが2の場合は、魚がかかってる状態なので、「;魚釣り成功の場合」の処理をします。 f.hitが1の場合は、魚が表示されてるけどまだ食いついていない状態ですので、「;逃げられてしまう場合」の処理を書いています。 elseの場合、つまりf.hitが0の場合は、釣り糸は垂れてるけどまだ画面に魚が表示されていない状態なので、「;まだ魚が来ていなかった場合」の処理を書きます。 if構文をendifで閉じた後は、共通の処理として、 clickableタグで画面クリック判定用のボタン的なやつを置いておきます。これで、クリックするとラベル*startにジャンプして、また釣りが始まります。 ジャンプ先のラベル*startでは、freeタグで文章や魚の画像を消す処理を書いています。「お魚ゲット!!」といった文章や魚の画像はnameパラメータを「effect」、layerパラメータを1、で統一しているので、[free name="effect" layer=1]と書くだけで結果表示はつるっと消えます。 詳しい説明は以上です。 サンプルデータの利用規約(2018/11/7版)このサンプルデータは、ティラノスクリプトでのミニゲーム製作の際の参考資料となることや、データを加工・編集してからゲームに組み込まれることを想定して配布しています。 OKなこと
禁止事項
ご注意
補足
連絡先:nasuislove餅yahoo.co.jp (餅→@) …以上です。思っていたよりめちゃくちゃ長くなってしまいました。 |