さて。

ティラノで3DRPGを作りたい!!! キーボード対応の!!!

と言うわけで簡単にテスト的な物を作っています。入院中の暇つぶしです。

またコイツ発売予定のゲーム放置して何やってんだ、と思うかもしれませんがすみません、入院中でエロいものにほぼ一切触れられないので(監視カメラ様が見てる)、エロゲーとかの制作が停滞しています。いやまじで数えただけで狭い病棟内に監視カメラ7つくらいあった。病室10個くらいの狭い病棟なのに! 見つけてないのもいくつかあると思う。もしかしたら10ある病室すべてについてるかも、プライバシーの面からあまり考えたくないけど。精神病棟なめんなって感じだわ。たぶん監視カメラではディスプレイの文字までは見えないとは思うけど、もしかしたらこの画面を監視カメラが録画しているかもしれないなんていう状態でエロテキスト書けるメンタルは私にはない。パネエわ精神病棟…

あとミカゲィトは、ティラノのバージョンの違いのせいで動かなくなってしまったので、どうしようか考えてます…
別に古いティラノビルダー使うままでもいいんですけど、でも最新のビルダーだと、ティラノスクリプトのバージョンも最新化されたのは魅力的かなと。
なので、メインPCとサブPCを二台並べて、最新のティラノへの移植作業を行おうと思っています…のでこっちも退院待ちだなあ。早く退院したいです…

閑話休題。

あ、ここで作る3DRPGと言うのは、古き良きウィザードリィやメガテン、魔導物語のような、疑似3DRPGのことであり、3DCGで作られた画面のRPGの事じゃないです。

というわけでティラノでキーボードを使えるようにします。
まずはキーボードを押したかどうかについてを取得するためのプログラムをJAVAscriptで記述します。
ティラノビルダーのコンポーネントから、スクリプト>jscriptを選んで、そこに

document.onkeydown = function(e) {
tf.onky_flag=true
var keyCode = false;
if (e) event = e;
if (event) {
if (event.keyCode) {
keyCode = event.keyCode;
} else if (event.which) {
keyCode = event.which;
}
}
f.osita=event.keyCode;
};

と記述しました。
ティラノスクリプトの場合は、[iscript]~[endscript]でくくってください。
最後の方の「f.osita」と言う変数にキーコードを入れる処理、が重要です。
そしてこのJAVAscriptの記述部分を、マクロ「keymati」にして、いつでも呼び出せるようにします。

次に、キーが押された、と判断する部分です。これはキー入力があってもなくても毎回通る部分になります。
内容は以下の通りです。

*hantei
[if exp="f.osita==38"] (キーコード38=↑キーが押された)
 [jump target="*前に移動"] 
[elsif exp="f.osita==40"] (キーコード40=↓キーが押された)
 [jump target="*方向転換"] (後ろを向きます)
[elsif exp="f.osita==37"]
 [jump target="*左を向く"]
[elsif exp="f.osita=="39"]
 [jump target="*右を向く"]
[endif]
[jump target="*start"]

こんな感じです。
一応ここではティラノスクリプトで記述しましたが、ジャンプ部分はビルダーのコンポーネントのジャンプからでも作れるよ。
まぁ実は他にもメニューボタンが押されたときの処理なんかもはさんだりするけど(たとえばキーコード77=Mキー、でマップを開く、とか)それはまぁアイディア次第でそれぞれいろんなキーに対応させたりすればいいと思います。

あと、ティラノビルダーのゲームセッティングから「キーボード・マウス」のキーの設定で「シフトキー→ゲームを進める」に設定しておくと、メッセージ送りもキーボードでできるようなります。


で、大まかに記述するとこんな感じ。

*start
[clearstack] (jumpとかマクロとかサブルーチン多用するためスタック(ごみ)を消している)
[eval exp="f.osita=0"] (f.ositaを初期化。しないと、前回何かボタンを押しているとその処理が連続で行われてしまう)
[keymati] (キー入力待ちマクロ呼び出し)
[wait  time="1500"  ] (キー入力を待つ時間。この間にキー入力されると移動・方向転換などを実行となる)
[jump  target="*hantei"  ]

ゲーム上では、これをひたすら繰り返すことになります。イベントが発生しても、終了次第、また*startに戻る形です。
あとは「*前に移動」「*右を向く」などのラベルを作って処理をしていくだけです。そっちの処理についてはまた別の記事にします。


ただ、これだけですと、キーボードのない環境、つまりスマホなどでは操作のできないゲームになってしまいます。
なので画面にボタンを作ります。

[macro name="button_main"]
[button  fix="true" target="*前に移動"  x="480"  y="310"  graphic="ue1.png"  width="101"  height="43"  enterimg="ue2.png"  ]
[button  fix="true"  target="*左を向く"  graphic="hidari1.png"  width="101"  height="43"  x="420"  y="358"  enterimg="hidari2.png"  ]
[button  fix="true"  target="*右を向く"  x="530"  y="358"  graphic="migi1.png"  width="101"  height="43"  enterimg="migi2.png"  ]
[button  fix="true"  target="*方向転換"  x="480"  y="410"  graphic="sita1.png"  width="101"  height="43"  enterimg="sita2.png"  ]
[endmacro]

これはのちに呼び出すことも考えて、マクロ化しています。
先ほど記述した分と合わせるとこんな感じです。

[button_main]
*start
[clearstack] (jumpとかマクロとかサブルーチン多用するためスタック(ごみ)を消している)
[keymati] (キー入力待ちマクロ呼び出し)
[wait  time="1500"  ] (キー入力を待つ時間。この間にキー入力されると移動・方向転換などを実行となる)
[jump  target="*hantei"  ]

で、*hanteiに飛んだあとは、*startに戻ります。
FIXボタンにするのは、「*start→*hantei→*start→…」を繰り返すたびに毎回ボタンを呼び出していると、画面が激しくちらつくため、常に画面に出しっぱなしにするという形にしています。
イベント発生時や、メニューを開いたときなどには一度消し、必要な時に[button_main]で呼び出します。
とりあえず、これで画面上のボタンを表示しても、キーボードの上下左右キーを押しても、ゲームが反応するようになりました。

まぁそれで、ボタン表示と同じくらいのタイミングで主人公キャラクターなどを画面に表示しつつ、あと主人公が見てる景色なんかも画面にはめ込んで作ったゲーム画面はこんな感じです。

WS001015

マップを動き回ることについてまで記事にすると長くなるので、とりあえず「キー入力のできるゲームが出来た」ということにして、一旦記事はここで区切ります。
メニューやマップボタンを押したときの挙動についても、スリープゲームタグとか使っててややこしいので、それもまた別記事にします。…気が向いたら。
…あくまでも覚書なので、記事にするかは私の気分次第でごわす。