ティラノスクリプトでカードを沢山生成してみた
本格的にゲームを開発する前の確認
以前の記事でティラノスクリプトでカードゲームを作ろう、という話をしました。
理屈としてはできそう、と思っていましたが、カードを沢山ゲームで取り扱って本当に大丈夫なのかが気になったので、とりあえず大量のカードを生成して動かしてみました。
動画では以下の順で操作を行っています。
1. 999枚のカードを生成
2. 999枚のカードを画面上に重ねて表示
3. 999枚を順に右側にアニメーションで動かす
4. TOPのカードを1枚めくる
5. TOPのカードを1枚伏せる
6. 山を崩す(これはおまけです)
生成と表示、アニメーションはそれぞれ10秒弱かかっています。
ボクのPCは少し古めではありますがゲーミングPCなので、これを一般的なスペックにおくのは無理があると思います。
平均的なユーザの環境を考慮すると、一気にカードを生成したり表示したりするのは設計上避けるべき、ということがわかりました。
また、一度表示までさせてしまえば、999枚であっても比較的スムーズに動くこともわかりました。消費RAMも100MBオーダーなので問題ないと結論付けます。
どういうコードで実装しているのか
ティラノスクリプトのタグを駆使してマクロを作りました。
将来的にはクラス化してもう少し綺麗にしたいと思います。
jumpタグを使って無理やりイテレーションを作っていますが、jump先のラベルは同じファイル名で重複してはいけないので、長い名前にしなくてはいけません。
カード生成
new_deckはcountで指定した数だけnew_cardをid=数字で呼び出します。
new_cardでは"card+id"という名前のキャラクタオブジェクトを作ります。
[macro name="new_deck"]
[iscript]
tf.card_count = mp.count
[endscript]
*new_deck_loop_head
[jump cond="tf.card_count<=0" target="*new_deck_loop_end"]
[new_card id="&tf.card_count"]
[iscript]
tf.card_count = tf.card_count - 1
[endscript]
[jump target="*new_deck_loop_head"]
*new_deck_loop_end
[endmacro]
[macro name="new_card"]
[iscript]
tf.cardid = "card" + mp.id
[endscript]
[chara_new name="&tf.cardid" storage="chara/card/facedown.png" width="120" height="170" jname="カード"]
[chara_face name="&tf.cardid" face="up" storage="chara/card/faceup.png"]
[chara_face name="&tf.cardid" face="down" storage="chara/card/facedown.png"]
[endmacro]
カード表示
deck_showはcard+idをzindexをずらしながら同じ場所に重ねていきます。
[macro name="deck_show"]
[iscript]
tf.card_count = mp.count
[endscript]
*deck_show_loop_head
[jump cond="tf.card_count<=0" target="*deck_show_loop_end"]
[iscript]
tf.cardid = "card" + tf.card_count
tf.zindex = mp.count - tf.card_count + 1
[endscript]
[chara_show name="&tf.cardid" left="&mp.left" top="&mp.top" zindex="&tf.zindex" time="0"]
[iscript]
tf.card_count = tf.card_count - 1
[endscript]
[jump target="*deck_show_loop_head"]
*deck_show_loop_end
[endmacro]
カード移動
deck_moveは指定したleft, topの座標に500msかけて1枚ずつカードを移動します。
[macro name="deck_move"]
[iscript]
tf.card_count = mp.count
[endscript]
*deck_move_loop_head
[jump cond="tf.card_count<=0" target="*deck_move_loop_end"]
[iscript]
tf.cardid = "card" + tf.card_count
[endscript]
[anim name="&tf.cardid" left="&mp.left" top="&mp.top" time="500" effect="easeOutQuint"]
[iscript]
tf.card_count = tf.card_count - 1
[endscript]
[jump target="*deck_move_loop_head"]
*deck_move_loop_end
[endmacro]
終わりに
なんだかマニアックな内容になってしまいましたが
- 開発は順調です!
- ティラノスクリプトでカードゲームが性能的に問題なく作れそう!
ということが伝えたいことになります。