Thursday, April 28, 2011

プチコンで晴れときどき爆弾

むかしむかしMSX・FANという雑誌に載っていた「晴れときどき爆弾」という1画面ゲームをプチコンに移植してみました。とある週末の2〜3時間を使って作ったのですが、作りやすさしか考えてなかったのでリストは長め(プチコンの7画面ほど)になっています。

プレイヤーはうさぎっぽい生き物で、ひたすら降り続ける爆弾を左右に避けるゲームです。よければ避けるほどスコアがあがります。リプレイは上キー。

リストは動画の後半にあります。
爆弾の縦スクロールはスプライトでムリヤリ実現しています。



ほんとはひらがなフォントも作って見た目を全く同じにしたかったのですが、リストの長さとゲーム内容のバランスを考えてとりあえず保留しました。

Monday, April 18, 2011

プチコンでテトリス風ゲーム

テトリス風ゲームをプチコンで作ってみました。



1ミノ毎にLEVELが上がります。
LEVEL 1〜30は落下の待ち時間が減ります。
LEVEL 31〜50はGがあがります(1フレームで1段以上(Gの数だけ)落下する)
LEVEL 50で最高速の20Gになります。

画面左上の数字がFPS値です。
(かん違いでなければ)おおよそ60FPSを維持しているみたいで、プチコン/DSの演算の速さのおかげです。

BGMPLAYではいまいちあうものが見つかりませんでした。自前でBGMを用意してみましたが、プログラムの構造に問題があってBGMがわずかにとぎれることがあり、BGM演奏は呼び出さなくしました。音はいくつかの効果音のみとなっています。
ブロックの落下を止めるとBGMがきれいに流れるのですが。。。

動画のおまけで流れるBGMはゲーム中の演奏はあきらめたものです。
MMLはTSSCPまとめWikiの「Tetris -C-TYPE-」をみて打ち込みました。作った方ありがとうございます。
TSSの仕様で「Tetris -C-TYPE-」の演奏に必要そうな所だけを用意しました。難しい機能(音色とかループとかマクロとか)は実装してないです。
プチコンのBEEPは4オクターブ+1しか表現できないので、泣く泣く高音パートのオクターブを1つ下げ低音パートを1つあげています。一番下をO3Cとすると、O3C〜O7Cが使える範囲となります。

プログラムは900行ほどになってしまいました。
ゲーム本体は700行いかないです。
残り200行ほどはつけようとしてうまくいかなかったBGMルーチンとそのデータです。

作ってて思ったのは、

  • MERGEがほしい〜 ... MERGE "プログラム名"で後ろに追加とか
  • 割り込み命令がほしい ... ON INTERVAL GOSUBとか
  • BEEPをのピッチをもっと広く ...エラー時の音がBEEPで再現できないのはいかがなものか
  • BEEP中の音量とかピッチを変えられると楽しいかも。音声再生方式の問題があるかもしれないですが、そこをなんとか?
です。

Saturday, April 2, 2011

プチコンでタイマー割り込みっぽいもの

プチコンではBEEPやSPRITEなどでそれぞれタイマーを持っていますが、汎用的なタイマー割り込みがありません。

で、無いものは作ってみます。

幸い、システム変数にMAINCNTLというフレーム数を示すものがあるので、60分の1秒の精度を持つタイマーとして使います。(用語集に1フレーム=1/60秒とあります)

星が点滅し、謎のBGM(雑音)が奏でられるサンプルです。
プログラムでは、次のことをしています。

  1. 10フレームに1回星を表示
  2. 20フレームに1回星を消去
  3. 10フレームに1回ランダムな音色でBEEP

プチコンは表示さえ抑えれば処理速度はめっさ速いので、こんなしくみで処理を詰め込んでもそれなりに動作するようです。

---TIMER INTERRUPT TEST
CLEAR:CLS
I1=10
I2=20
I3=10
T1=MAINCNTL
T2=MAINCNTL
T3=MAINCNTL
'
@MAIN
IF MAINCNTL-T1>I1 THEN GOSUB @INT1:T1=MAINCNTL
IF MAINCNTL-T2>I2 THEN GOSUB @INT2:T2=MAINCNTL
IF MAINCNTL-T3>I3 THEN GOSUB @INT3:T3=MAINCNTL
GOTO @MAIN
'
@INT1
LOCATE 10,10:?"★"
RETURN
@INT2
LOCATE 10,10:?" "
RETURN
@INT3
BEEP RND(64)
RETURN
---
I1〜3 ... 割り込みタイミング
T1〜3 ... タイマー保存用
配列変数に入れてループで回し、とび先はON〜GOSUBで管理してもよいかもしれません。

※code-prettify、プチコンBASICだといまいち。