2015年1月27日火曜日

プチコン3号で1画面プログラム「BLK2048」をリリース

飛び出すブロック崩し BLK2048 をリリースしました。


名前にもあるように 2048 面が選択できます。


投稿プログラム : BLK2048 - プチコン3号まとめWiki


公開キーは 【1D34VKKV】 です。


プレイするには、ダウンロードしたフォルダの BLK2048 を実行してください。


 


1画面プログラムはワンライナーのようなもので、スクロールしない1画面の範囲におさめた文字数の少ないプログラムのことです。


最初は習作として作っていたブロック崩しでしたが、飛び出すアニメーションをつけて大喜利に出そうと検討したとき、せっかくならまだやったことがない1画面プログラムにできるかどうかやってみようと思いチャレンジしました。


f:id:SakuraCrowd:20150126213022p:plain


もう、見た感じうじゃーっとしてて保守してくださいとか言われたら、反射的にいやです(`・ω・´)とお断りするレベルのプログラムです。


でも、やってみるとこれはこれで面白いです。


 


1画面プログラムを作るときに意識したこと


自分の感想では50~60行くらいの普通のプログラムならなんとかぎゅぎゅっと圧縮すれば1画面にいけると思いました。


圧縮といっても、機械的に次のことをやっただけです。



  • 数字のあとの命令文はくっつけて書く(ENDIF だけは区切る必要あり)

  • ラベルの前の文はくっつけて書く

  • 文字列の前後の文はくっつけて書く

  • 配列[]のあとの文はくっつけて書く


とにかく、区切る必要のないものはくっつけて書くだけです。


IF 文は ENDIF を忘れると条件分岐の処理として後の命令が呼び出されてしまうので1行IFで省略している場合は、ENDIFを書いてから圧縮したほうがよいです。


 


変数名など省略できるものはなるべく少ない文字数にしました。


しかし、どの変数が何を表すのかがわかりにくくなります。


そこで、プログラムにコメントを書くかわりに、パソコンのテキストで変数名の管理をしました。


このアルファベットは使ってないよね?とびくびくしながら変数を使う問題がこれで解消できます。


 


50~60行というのもさらっといいましたがわりと短いです。


普通に書いてたら、変数宣言と初期化だけでそれぐらい使うかもしれません。


プログラムを書く上で気をつけたのは、同じ命令はなるべく1回書くだけにする。


たとえば、何度も BUTTON の入力を行ったり、 LOCATE で表示位置を変えないようにして、1箇所ですむように、仕様も含めて工夫しました。


 


「本当にやりたいことは何だ?」


これは私がお世話になった方からよくされたアドバイスですが、1画面プログラムのような限られた文字数の中で、この問いかけは何度も思い出されました。


ちょっとシチュエーションは違うのですが、要するに限られた中で取捨選択をしてよりよいものを作るというトレーニングという側面が1画面プログラムにはあるのかなーと思ったり思わなかったりしました。


 


作品の紹介


そんなこんなで作ったのがこんな感じです。


f:id:SakuraCrowd:20150126230057p:plain


f:id:SakuraCrowd:20150126230121p:plain


f:id:SakuraCrowd:20150126215800p:plain


f:id:SakuraCrowd:20150126230139p:plain


f:id:SakuraCrowd:20150126223134p:plain


 


f:id:SakuraCrowd:20150126223109p:plain


なんかよくわからないかもしれませんが、ブロック崩しで崩したブロックがくるくる回転しながら手前にとびだしてきているところです。


これが、意外ときれいで爽快です。自画自賛で3割り増しだとは思うのですが、そう思いました。



[プチコン3号]BLK2048[1画面プログラム][ブロック崩し][petitcom] - YouTube


私のプレイ動画ですが、ブロック崩しがこんなに難しいとは思いませんでした。


この動画は撮影のために操作しづらい姿勢でやっているというのはあるのですが、それにしても瞬殺レベルです。途中からはバーをのばした鑑賞モードにしています。


鑑賞モードを作ってよかったと本当に思いながら撮影しました。


その後、あらためて本気で挑戦しましたが、ブロック数が100個を超えるものはクリアできませんでした。(´・ω・`)


 


球の反射


ブロックと球との当たり判定が、ぐぐってもジャストなものがなかなかでてこなくて結局自分でいろいろと工夫してそれっぽくしてみました。


持っているゲーム開発のための物理の本などをみても、当たった方向に対して、移動の増分値の符号を反転させると書いてあるだけで、肝心な当たった方向の検知については書かれていませんでした。


 


まずは、壁の上下左右のどこにぶつかったのかを次の前提条件から判別します。



  • ブロックの上と下、左と右が同時にぶつかるということはありません。

  • 水平方向と垂直方向でそれぞれ進行方向にブロックがあります。


そこで、SPHITSP でブロックとぶつかったら、そのブロックとの水平方向と垂直方向の差分を比較します。


水平方向のほうが差分が大きいなら、水平方向で進行方向にブロックがあると判断します。


そのときは球を移動させる水平方向の増分値 V に -1 をかけて逆にします。


同様に垂直方向の差分が大きければ垂直方向の増分値 W に -1 をかけて逆にします。


もしも差分が同じならば角にあたったと判断して、V,W両方に -1 をかけて進行方向を逆にします。


 


周りの壁については球の座標を比較して、超えたら増分値 V, W の該当する変数に -1 をかけています。


左側にあるバーとの接触の際は、球がバーのどの位置にいようとも右側に跳ね返すようにしました。


途中までは物理の勉強などをしようとしていたのですが、途中でブロック崩しを作るのであって物理エンジンを作るのではない(そもそも難しすぎる)と思い直しました。


そうしたら、変なこだわりが消えて、ケースバイケースの処理を組み合わせて短いプログラムで、それっぽく動かせるようになりました。


それはそれとして、球の反射に関するよい説明などありましたら教えていただけるとうれしいです。


 


2015年1月15日木曜日

マッハこうもり ver1.1 のプログラムの説明

 バージョンアップした説明を書こうとして、ひさびさに マッハこうもり - プチコン3号まとめWiki を見に行ったのですが、正月早々にもかかわらずプレイしてくれた方からコメントがあり、心の中ではカーニバルがわっしょいわっしょいと歓声をあげるくらいうれしかったです。


プレイしていただき暖かいコメントまでいただいたことに改めてお礼を申し上げます。


 


その中に、2つ質問が書かれていたので、その回答をしようと思います。


説明が下手なので、図をちまちまと作ってきました。


#気づけば3時間も書いてました。きっと暖かい声援の力が大きいと思います。


時間があれば見てあげてください。


 


Q1.BGの並べ方


マッハこうもりは昨日も書きましたが SBMAP に対応しています。


SBMAP のデータを読み込む処理も、サンプルゲームの GAME3JUMP の LOADSUB サブルーチンの処理をベースにしています。


SBMAP のBGのデータ形式は、1つの整数値に 16 ビットずつ 2 つの横に並んだ BG の値が設定してあったりして、少し面倒な感じはしますが、基本的には1行ずつ読み込む素直な形式です。


簡単に説明するために、 4×3の小さなマップを例にして説明します。


f:id:SakuraCrowd:20150114212139p:plain


f:id:SakuraCrowd:20150114212216p:plain


 


マッハこうもりでは、横長なマップにしているため、読み取り方を少し変更しています。


ごちゃごちゃしていますが、 MACH_BAT1_1 の loadSbMap 関数で行っていますので参考にしてください。


 


f:id:SakuraCrowd:20150114212305p:plain


 


Q2.背景の動かし方


背景、前景は BGANIM "XY+" で少しずつ動かしています。


マッハこうもりとケーキのスプライトは原点スプライトというもうひとつのスプライトにリンクさせて、原点スプライトを SPANIM "XY+" で BG と同じ分量だけ動かしています。ただし、ずらす値が BGANIM と SPANIM では+とーが逆になります。


ここらへんの処理は MACH_BAT1_1 の scrollMap 関数で行っていますので参考にしてください。


f:id:SakuraCrowd:20150114212628p:plain


SPANIM と BGANIM の両方を同時に使ってスクロールしています。


それぞれのスクロールだけのイメージは次のとおりです。


f:id:SakuraCrowd:20150114212639p:plain


 


長い記事を最後まで読んでいただきありがとうございます。


自分の作ったプログラムをわかりやすく説明することも大変なんだなと思いました。


こうやって書くことで、少し頭の中が整理できた気がします。


2015年1月14日水曜日

プチコン3号でマッハこうもり ver1.1 を公開しました。

あけおめ。ことよろ。お久しぶりです。


 


マッハこうもりの後に別の作品を作っていたのですが、大喜利のテーマ「飛び出す」を満たすアイデアが思いついたので実装して「マッハこうもり ver1.1 」を公開しました。


公開キーは 【4KE523YD】 です。


プレイするには、ダウンロードしたフォルダの MACH_BAT1_1 を実行してください。


ver1 をプレイしたい場合は同じフォルダの MACH_BAT1 を実行してください。


 


マッハこうもり ver1.1 の特徴


ver1.1 では「まおうさま」が魔法を使ってマッハこうもりをサポートしてくれます。


Xボタンを押すと、会話と詠唱がはじまり、前景に隠れていたケーキが一定時間飛び出して表示されます。魔法は3回使えます。


これで、わかりづらいケーキの位置もばっちりです。


#詠唱やBEEP音、雷のような演出などで結局丸一日かけてしまいました。


#値段と使用時間を考えるとプチコンのコストパフォーマンスはかなり高い気がします。


f:id:SakuraCrowd:20150113232632j:plain



[プチコン3号]マッハこうもり ver1.1 MACH_BAT1_1 [petitcom] - YouTube


SBMAP の簡単な紹介


YouTube の説明文にも書いたとおり、マッハこうもりのマップはサンプルツール SBMAP に対応しています。


前のブログにも書いたとおり SBMAP は、4層のBGのマップを簡単に編集することができる最初から入っている便利なプログラムです。


サンプルツール SBMAP はキーボード画面の下のほうにある緑のアイコンで SMILE TOOL MENU を起動して、 MAP を選択すると起動できます。


あらかじめ、 PROJECT 命令文でマッハこうもりのフォルダを指定してから、 SBMAP を起動して、 MACH_BAT1_1 をロードしてください。


SBMAP でロードするには Y ボタンを押して、キーボードから L を入力して、ファイル名を入力します。セーブも同じ手順でキーボードから S を入力して行います。


「緑のアイコンにSMILE TOOL MENU 以外を設定しているよ!」という玄人の方は私よりもそこらへんは詳しいと思いますので説明は割愛します。


 


MACH_BAT1_1 のマップデータの特徴


マッハこうもりで表示されるマップは BG 単位で横が 64*5=320、縦が 12 です。


SBMAP で開くとわかりやすいと思いますが縦に5分割されてマップが設定されています。端数の最後の4行は無視されます。


f:id:SakuraCrowd:20150113225702j:plain


マッハこうもりで使うマップには基本的に自由にBGを配置できますが、次の 3 つの特別な設定があります。


1.ぶつかったらゲームオーバーになる壁の役割を持たせる BG は SBMAP の A タブで × を割り当ててください。壁は 0~3 層の 2 のレイヤーだけ有効です。


2.0~3層の2のレイヤーで &H0043 (絵柄 "C") の BG を設定するとその位置にケーキが配置されます。BG は 0 が再設定されます。ケーキの数はマップを読み込む際に自動的にカウントされ、エンディングの表示内容へ反映されます。


 ちなみに ver1.1 では、ケーキの獲得数が0個、1個~29%、30%~59%、60%~89%、90%以上、100%+ハンディが0以下でエンディングのメッセージが変わるようになっています。ver1では割合ではなく固定の値で分岐します。


 3.マッハこうもりとケーキは 0~3 層の BG のレイヤーの 2 と 3 のレイヤーの間に表示されます。前景として扱えるのは 3 のレイヤーだけです。


 


もしも興味と時間と情熱があれば、マッハこうもりのマップを編集して遊んでみてください。


 


2015/03/20追記


SBMAP の仕様がかわり、ファイル名に MACH_BAT1 を指定しても  「ファイルが見つかりません。名前 DAT:MAP_MACH_BAT1」と表示されます。


そのため、編集する際にはファイル名を DAT:MACH_BAT1 から DAT:MAP_MACH_BAT1 へ変更する必要があります。


プログラムの TXT:MACH_BAT1 の中で指定している同じファイル名を変更すれば MAP_MACH_BAT1 を元の名前に戻さずに利用できます。