2013年02月09日

DPC-100プログラム・ガンシューティングゲーム

 この記事も含めて、まとめはこちらLink


 iPhoneのポケコンアプリ、DPC-100のプログラム、早速コンパス機能を使ったものと、ガンシューティングを作ってみた。

20130209-01.jpg20130209-02.jpg

 プログラムを実行した所。
 背景の所々からモンスターが出現して近づいてくるが、中央に照準に合わせて画面をタップで撃って倒していく。
 その移動は何と、自分が左右に回る。コンパス機能によって、向いた方角に応じて背景がスクロールする。

 画面には一度に6匹くらいしか表示されないが、実際は最大15匹が一度に来るので、常に全ての方向を見ないといけない。
 背景はループになっていて回り続ける事が可能。プログラムでは、150度くらいで1周するように調整した。

20130209-03.jpg

 近付いてくるモンスターは、状態に応じて7段階で表示される。現在使えるキャラでできるだけ動きを表現してみたが、それらしく見えるだろうか。
 まあ、これだったらモンスターと言うべきかお化けと言うべきか迷ったがw
 そのモンスターは動くごとに音が鳴るが、位置によって音階が上がる。だから、どれだけ近付いてきたかを音でも知る事もできる。

 モンスターを撃つと、その状態に応じて1〜7点入る。できるだけ近付いてから倒した方が高得点だが、外してもペナルティなどは無いので、好きなだけガンガン撃った方がいい。

20130209-04.jpg

 モンスターが最後まで迫ってくるとゲームオーバー。

プログラムリストと解説

ガンシューティングゲーム
110 LOCATION(1)
120 SCHVOLUME(0,15)
130 INT MC(8)
140 MC(0)=140
150 MC(1)=141
160 MC(2)=46
170 MC(3)=161
180 MC(4)=111
190 MC(5)=79
200 MC(6)=64
210 MC(7)=232
220 SC=0
230 FDL=30
240 STRING FDS
250 FOR I=0 TO FDL
260 CH=RANDOM()*7+133
270 SPRINTF(FDS,"%s%c",FDS,CH)
280 NEXT
290 CH='+'
300 WHILE 1
310 FOR LP=0 TO 100
320 CP=COMPASS(0)/5
330 IF TOUCH(-1,0)>0 GOSUB SHOT
340 GOSUB SSUB
350 NEXT
360 GS=RANDOM()*(FDL/2)
370 GS*=2
380 GC=GETCHAR(FDS,GS)
390 IF GC>31 THEN FDS=SETCHAR(GS,GC+1,FDS) ELSE FDS=SETCHAR(GS,32,FDS)
400 GC=32
410 FOR I=0 TO FDL STEP 2
420 IF GC<GETCHAR(FDS,I) THEN GC=GETCHAR(FDS,I)
430 NEXT
440 IF GC-32>6 THEN BREAK
450 GC=(GC-32)*12+27
460 SCHSTATE(0,1)
470 SCHNOTE(0,GC)
480 WAIT(0.1,0)
490 SCHSTATE(0,0)
500 FREE GS
510 FREE GC
520 WEND
530 @OVER
540 CH=232
550 GOSUB SSUB
560 FOR I=0 TO 3
570 SYSBEEP(7)
580 WAIT(1.0,0)
590 NEXT
600 EXIT(0)
610 @SHOT
620 CH='*'
630 GOSUB SSUB
640 SYSBEEP(0)
650 WAIT(0.3,0)
660 GS=(CP+5)%FDL
670 GC=GETCHAR(FDS,GS)
680 IF GC>=32 GOSUB HIT
690 FREE GS
700 FREE GC
710 CH='+'
720 RETURN
730 @HIT
740 SC+=GC-31
750 CH=RANDOM()*7+133
760 FDS=SETCHAR(GS,CH,FDS)
770 SYSBEEP(1)
780 RETURN
790 @SSUB
800 STRING BAR
810 I=0
820 WHILE I<11
830 GC=(CP+I)%FDL
840 GC=GETCHAR(FDS,GC)
850 IF GC<0 THEN GC+=256 ELSE GC=MC(GC-32)
860 SPRINTF(BAR,"%s%c",BAR,GC)
870 I+=1
880 WEND
890 FREE GC
900 BAR=SETCHAR(5,CH,BAR)
910 PRINTF("%s %d",BAR,SC)
920 FREE BAR
930 RETURN
 変数は、
MC():モンスターのキャラクター
SC:スコア
FDL:フィールドの文字数
FDS:フィールドの状態
GS:キャラクター取得位置
GC:取得キャラクター
CP:現在の方角
LP:ループ用
I:ループ用
CH:キャラクター表示用

 ラベルは、
SHOT:ショット時の処理
HIT:命中時の処理
SSUB:表示用
OVER:ゲームオーバー
(サブルーチンではない)

 背景と各モンスターの状態を文字列FDSに入れているが、最初は背景のみで、モンスター出現でコード32を入れ、近付くごとに33、34と増やしている。
 表示時は、そのコードから32引いた数値を使って、配列変数MC()で対応してキャラクターを表示。これを利用すれば、数値によって好きなキャラクターを表示可能。

 本当はこれ、コード0を入れたら一番簡単だが、そうするとなぜか-4など全く別の数値が入ったり処理がおかしい。そのため、安定するだろう32番以降を使っている。
 それに、背景に使っているブロックのキャラは、以前GETCHARで取得すると負の数値になると書いたが、今回は逆に利用して、負の数ならスルー、正の数ならモンスターという処理をしてみた。

 コンパスを使った操作について、「COMPASS(0)」で取得できる数値は0〜360と実際の方角に対応しているが、ゲームとして使う場合、右に移動して359の次は急に0とおかしな事になってしまうので、背景をループする事によって解決。これなら必ずどこかに配置される。

 このゲーム、敵が見えない所が面白いと思ったけど、見えないまま急にゲームオーバーになったら納得いかない。それが分かる方法として「音」を使ってみた。一番近付いた時に不快な音にするなど、色々と試して決めたという。
 画面表示が限られる分、これは色々と使えると思う。



タグ:DPC-100 iPhone

posted by 司隆 at 17:39 | Comment(0) | Computer
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

×

この広告は180日以上新しい記事の投稿がないブログに表示されております。