ニャオニャオ21世紀

レトロゲーム(MSX、PCエンジン、ファミコン、メガドライブセガサターン)と、MSXぽいアプリ開発と、最新ゲーム(PS4、SWITCH)、身体(身体意識など)、ライフハック、電子工作ほか雑記を綴っています

超初心者のためのMSX BASICゲーム作り 壁打ちテニスを作ります。




スポンサーリンク



スポンサーリンク


スプライトだけを使って簡単なゲームを作りたいと

思います。

うーん、なににしようかなぁと考えた時、

テニスしかない!

と思いました^^

 

すべての基本は壁打ちテニスです(*´∀`*)

 

完成したものをどうぞ!

https://msxpen.com/codes/-LdRBf9KpqrZNBXREpgX

 

わかりやすいように一番シンプルにしています^^

f:id:nyaonyaokun:20190427094218p:plain

ルール:

下のバーで、ボールを打ち返すだけです。

ボールは壁に当たると跳ね返ります。

バーの下にボールが抜けていってしまうとゲームオーバー。

 

こんにちはマイコンにのっているテニスですよ!

www.nyaonyao21.com

 

じつは自分では、はじめて作ってみました^^;

ナイコンのとき(マイコンをもっていない人をそう呼びました^^)に、

穴が開くくらい読んでいたので、覚えていました(*´∀`*)

(プログラム自体は簡単なのですが)

 

では最初から作っていきます。

 

 

こちらもご利用下さい^^

www.nyaonyao21.com

 

 最初にこちらを読んでおくとよく分かります。

www.nyaonyao21.com

 

www.nyaonyao21.com

 

(16進数でのスプライトの定義と、

今回のtinyspriteさんのVRAMへの書き込みでのスプライトの定義の説明も

そのうち書きたいと思います。)

 

 

まず、

画面設定です。

10 SCREEN1,2:COLOR1,15,1:WIDTH32:DEFINTA-Z:KEYOFF

 

まぁこれは後々覚えていってください。

そのままコピペでOK!

簡単に説明しておくと、

SCREEN1,2は、スクリーンモード。

     SCREEN1は文字+スプライトのモード。

     , 2はスプライトの大きさ(16X16)

 

COLORは、画面の色。

f:id:nyaonyaokun:20180925100102p:plain

10進数の場合は、

A=10

B=11

C=12

D=13

E=14

F=15

です。お間違えのないよう^^

 

COLOR 文字の色,画面前,画面後だったかな。

 

WIDTH32は横方向で32文字表示できるようにします。

DEFINTA-Zは整数のみを使う。(スピードが早くなります)

KEY OFFは、画面下のCOLORとかLISTとの表示をなくします。

 

 

スプライトを表示します。

こちらのサイト様で!

TinySprite 0.7.0 - MSX Sprite Editor

f:id:nyaonyaokun:20190427100107p:plain

絵を描いたら、Export Spritesをクリックします。

そして、BASICプログラムをコピペします。

f:id:nyaonyaokun:20190427100255p:plain

 

10 ' --- Slot 0
20 ' color 1
30 DATA 00,00,00,00,00,FF,00,FF,FF,FF,00,FF,00,00,00,00
40 DATA 00,00,00,00,00,FF,00,FF,FF,FF,00,FF,00,00,00,00
50 '
60 ' --- Slot 1
70 ' color 1
80 DATA 00,00,00,00,00,01,02,05,05,02,01,00,00,00,00,00
90 DATA 00,00,00,00,00,80,40,A0,A0,40,80,00,00,00,00,00
100 DATA *
110 SCREEN 2,2,0: GOSUB 10000
120 PUT SPRITE 0,(0,0),1,0
130 PUT SPRITE 1,(0,16),1,1
140 GOTO 140
10000 REM -- LOAD SPRITES
10010 S=BASE(9)
10020 READ R$: IF R$="*" THEN RETURN ELSE VPOKE S,VAL("&H"+R$):S=S+1:GOTO 10020

 

TinySpriteさんでは、このように出力されます。

それをこのように加工!

10 SCREEN1,2:COLOR1,15,1:WIDTH32:DEFINTA-Z:KEYOFF
20 ' color 1
30 DATA 00,00,00,00,00,FF,00,FF,FF,FF,00,FF,00,00,00,00
40 DATA 00,00,00,00,00,FF,00,FF,FF,FF,00,FF,00,00,00,00
50 '
60 ' --- Slot 1
70 ' color 1
80 DATA 00,00,00,00,00,01,02,05,05,02,01,00,00,00,00,00
90 DATA 00,00,00,00,00,80,40,A0,A0,40,80,00,00,00,00,00
100 DATA *
110 GOSUB 10000

10000 REM -- LOAD SPRITES
10010 S=BASE(9)
10020 READ R$: IF R$="*" THEN RETURN ELSE VPOKE S,VAL("&H"+R$):S=S+1:GOTO 10020

赤文字が変更点。

そして120~140行をカットです^^

 

ps

スプライト表示の別の方法

上のスプライト表示がよくわからないという方は、

こちらの方法でもできます。

(ただスプライトのお絵かきツールは便利なので、上のやり方を推奨します^^)

 

別の方法でスプライト表示方法ソースコード

MSXの特徴であるスプライト プログラム(表示)!初めての方にも。MSX BASICの基本を思い出しましょう、"その2" - ニャオニャオ21世紀

以下は、リンク先で説明した方法でのスプライト表示です。

ただ少し違うのは、

スプライトを2枚、定義しています。

最初のTinyspriteさんのツールを使った方法か、これから

下で説明する方法でスプライトを表示してください。

(下の方法の方がスタンダードです^^

しかしtinyspriteさんのツールを使うと開発がかなり楽です)

 

110行で2回ループをさせています(J=0、1)ので、スプライトは2枚定義できます。

170行でSPRITE$(J)で0番と1番に定義します。

 

リスト

10 SCREEN1,2:COLOR15,15,1:WIDTH32:DEFINTA-Z:KEYOFF

100 RESTORE 5000
110 FOR J=0 TO 1
120 FOR I=0 TO 15
130 READ DT$
140 L$=L$+CHR$(VAL("&B"+LEFT$(DT$,8)))
150 R$=R$+CHR$(VAL("&B"+RIGHT$(DT$,8)))
160 NEXT
170 SPRITE$(J) =L$+R$
180 L$="":R$=""
190 NEXT
950 '
1000 PUT SPRITE 0,(80,100),1,0
1010 PUT SPRITE 1,(96,100),1,1
4995 'SPRITE BAR DATA
5000 DATA0000000000000000
5010 DATA0000000000000000
5020 DATA0000000000000000
5030 DATA0000000000000000
5040 DATA0000000000000000
5050 DATA1111111111111111
5060 DATA0000000000000000
5070 DATA1111111111111111
5080 DATA1111111111111111
5090 DATA1111111111111111
5100 DATA0000000000000000
5110 DATA1111111111111111
5120 DATA0000000000000000
5130 DATA0000000000000000
5140 DATA0000000000000000
5150 DATA0000000000000000
5155 'SPRITE BALL DATA
5160 DATA0000000000000000
5170 DATA0000000000000000
5180 DATA0000000000000000
5190 DATA0000000000000000
5200 DATA0000000000000000
5210 DATA0000000110000000
5220 DATA0000001001000000
5230 DATA0000010110100000
5240 DATA0000010110100000
5250 DATA0000001001000000
5260 DATA0000000110000000
5270 DATA0000000000000000
5280 DATA0000000000000000
5290 DATA0000000000000000
5300 DATA0000000000000000
5310 DATA0000000000000000

 

このプログラムの赤文字の950行 ~ 1010行を削除します。

(別のところで、PUT SPRITEを書きますが、とりあえず消しておいて下さい^^)

 

 

再びtinyspriteさんのツールから吐き出されるソースコードを

使ったやり方を。

10 SCREEN1,2:COLOR1,15,1:WIDTH32:DEFINTA-Z:KEYOFF
15 X=112:Y=148:EX=0:EY=0:HX=2:HY=2
20 ' color 1
30 DATA 00,00,00,00,00,FF,00,FF,FF,FF,00,FF,00,00,00,00
40 DATA 00,00,00,00,00,FF,00,FF,FF,FF,00,FF,00,00,00,00
50 '
60 ' --- Slot 1
70 ' color 1
80 DATA 00,00,00,00,00,01,02,05,05,02,01,00,00,00,00,00
90 DATA 00,00,00,00,00,80,40,A0,A0,40,80,00,00,00,00,00
100 DATA *
110 GOSUB 10000
990 'PLAYER
1000 S=STICK(0) OR STICK(1)
1010 IF S=3 THEN X=X+2
1020 IF S=7 THEN X=X-2
1030 'BALL
1040 IF EX<0 THEN HX=-HX:BEEP
1050 IF EX>240 THEN HX=-HX:BEEP
1060 IF EY<0 THEN HY=-HY:BEEP
1070 EX=EX+HX
1080 EY=EY+HY
1090 'ATARI
1100 IF ABS(X-EX)<16 AND ABS(Y-EY)<8 THEN HY=-HY:BEEP
1110 'GAME OVER
1120 IF EY>196 THEN HX=0:HY=0:LOCATE 11,10:PRINT"GAME OVER"
1130 'SPRITE
1140 PUT SPRITE 0,(X ,Y),1,0
1150 PUT SPRITE 1,(EX,EY),1,1
1160 GOTO 1000
10000 REM -- LOAD SPRITES
10010 S=BASE(9)
10020 READ R$: IF R$="*" THEN RETURN ELSE VPOKE S,VAL("&H"+R$):S=S+1:GOTO 10020

 

 PLAYER、この場合はバーを動かします。

1000 S=STICK(0) OR STICK(1)
1010 IF S=3 THEN X=X+2
1020 IF S=7 THEN X=X-2

 

1000行でカーソルキーに何が押されたかチェックします。

(STICK(0)がキーボードで、STICK(1)がジョイスティック)

( = というのは左辺へ代入の意味です^^)

 

その値がSに入るので、

1010行と1020行で判別します。

 

上を押すと     S=1、

右上を押すと S=2、

右を押すと     S=3、

右下を押すと  S=4、

下を押すと     S=5、

左下を押すと  S=6、

左を押すと     S=7、

左上を押すと S=8、 が入ります。

 

図にすると

              1             

    8        ↑        2       

7 ←             → 3

    6        ↓        4  

              5

 

今回は左右のみなので、S=3とS=7のときだけです。

1010 IF S=3 THEN X=X+2

(IF ~ THEN ... といのは、もし~ならば...せよという命令です。

この場合の = は、Sと3が同じならばという意味)

 

右に動かすということは、スプライトのX座標を増やしてやるということです。

現在位置がX=100なら、102にしてやれば

右に2ドット動きます。

X=X+2ということは、

X+2してやったものをXにいれるということです。

例:

X=100だったときは、X+2で102になって、それをもとのXに入れます。

(Xを書き換えます)

X=102になりますよね(*´∀`*)

 

再びこの1010行にきたときは、X=102なので、さらにX+2で、X=104になります。

このようにスプライトを動かしていきます。

 

X=X+1なら1ドット単位で右に動かせます。

まぁこれは覚えておくだけでもOKです。

 

右へ動かすときは X=X+1

左へ動かすときは X=X-1

のように。

 

 

ボールを動かします。

さきほどと同じようにしてやればOKです。

プレイヤーのバーの座標でX,Yを使ってしまったので、

別の値を使います。

ENEMY Xの略のEX

ENEMY Yの略のEY

を使いますね。

 

そして

EX=EX+1

としてやれば、Xの右方向に動いていきます。

 

これでいいかと思いきや、これだけではだめなのです^^;

シューティングゲームで弾が1方向に飛んでいくのなら、これでOKです。

 

しかし、これは壁打ちテニス。

 

壁に当たったら、ボールの進行方向が変わらないといけません。

右の壁に当たったら、跳ね返って左へいきますよね。

 

これが初心者の方には少しややこしいかも。

ボールの向きを変えるということは、

X=X+1が、X=X-1になるということです。

 

うーん、これをプログラムにするには〜(´・ω・`)

移動量に-1をかけてやるのです!!!!!!

 

X=X+1に-1をかけると、X=X+1*(-1)で、X=X-1になり、

X=X-1に-1をかけると、X=X-1*(-1)で、X=X+1となります。

 

普通こんなこと分かりませんよね(・∀・)

プログラムなんてのは、覚えればいいのです。

そういうのをいくつか覚えていけば、

いつか応用ができるようになります^^

 

EX=EX+HX

としておきます。

(HXに1でも-1でも入れてやれば使いやすいですよねぇ)

そして方向転換のときは、

HX=-HXとしてやります。

(HX=(-1) × HXという意味です)

 

うーん、BASICテクニック!!

 

補足:

ボールは斜めに飛ばしたいので、

EX=EX+1

EY=EY+1

としてやります。

右に1ドット、下に1ドット動くので、斜めに動くことになります。

 

1030 'BALL
1040 IF EX<0 THEN HX=-HX:BEEP
1050 IF EX>240 THEN HX=-HX:BEEP
1060 IF EY<0 THEN HY=-HY:BEEP
1070 EX=EX+HX
1080 EY=EY+HY

1040行〜1060行は、壁ですね。

左端と右端と上端に来たときに、方向転換です^^

 

この画面の端というのは、結構使います。

プレイヤーを画面の外に出さないように、動かなくさせるとか、

右端までいったら左端からでてくるとか、

右端までいったら画面がスクロールするとか

(これはハイドライド(・∀・))

 

BEEPはプという音が鳴ります。

 

 

スプライト同士の当たり判定

1090 'ATARI
1100 IF ABS(X-EX)<16 AND ABS(Y-EY)<8 THEN HY=-HY:BEEP

 

スプライト同士の当たり判定ですが、

座標計算でやります。

スプライト同士の当たりをチェックしてやる命令もあるのですが、

使い勝手がよくなくて....

(どのスプライトとどのスプライトが当たったかが分からないのです。

どれかが重なったよ〜としか教えてくれません。

今回はまぁ使えるのですが、今後に使えないので、今回は座標計算を使います)

 

IF  ~ AND ~ THEN...

というのは、ANDが両方共、条件を満たしたときに THEN以降を実行の意味です。

IF A=0 AND B=0 THEN ....

なら、A=0、B=0の両方の条件が当てはまったら、...を実行です。

仮にA=0、B=1だったらTHEN以降はやらず、そのまま下の行へ移動します。 

 

 

ABS( ) は絶対値をとります。

 

ABS(X-EX)<16

ですが、

プレイヤーのバーがX=100のときに、仮にボールがEX=92(左側にある)としましょう。

X-EX=100-92=8です。

重なっています。

 

今度は

プレイヤーのバーがX=100のときに、仮にボールがEX=108(右側にある)としましょう。

X-EX=100-108=-8です。

ABS(-8) = 8 (絶対値をとる命令だから)

これまた重なっています。

 

ABS(X-EX)<16

なぜ16なのかといいますと、スプライトが16ドットの大きさだからです。

 

(ちなみにスプライトの左上が座標となります。

シューティングなどで自機の当たり判定を小さくするときは、お気をつけください

スプライトの座標をX1=X+8、X2=EX+8(真ん中を設定)としてやって、

ABS(X1-X2)<8としてやると小さくなります^^)

 

ここまで出来たらあと少しです(*´∀`*)

 

ゲームオーバー 

1110 'GAME OVER
1120 IF EY>196 THEN HX=0:HY=0:LOCATE 11,10:PRINT"GAME OVER"

 

バーよりも、下のほうにボールが行ってしまったらゲームオーバーです。

今回は1回のミスでゲームオーバー!

わかりやすいので、ね^^

 

LOCATE X,Y

カーソルの位置を決めます。

(文字を表示する位置を決める命令です。

LOCATE命令の座標は、

X座標 0~32まで。Y座標 0~24まで。

 

スプライトの座標は、

X座標 0~255まで。Y座標 0 ~191まで。

なぜ違うのかといいますと、

LOCATEは文字単位なのです。

1文字は8ドット!

256 割る 8 は、32

192 割る 8は、24

なのです(*´ω`*)) 

 

3回のミスでゲームオーバーにしたいなら、

変数EDなどを用意してやり、20行あたりで、ED=2

1120行のTHENのあとにED=ED-1とし、

どこかの場所(1130行とかで)で、

IF ED<0  THEN PRINT"GAME OVER"

などとしてやってください。

 

スプライト表示

1130 'SPRITE
1140 PUT SPRITE 0,(X ,Y),1,0
1150 PUT SPRITE 1,(EX,EY),1,1

これでOKです。

 

なぜ、PUT SPRITEでX,Yや、EX,EYが使われているか

といいますと

スプライトを動かすためです。

 

通常の、

PUT SPRITE 0,(100,150),1,0

としてやればスプライトの0を(x,y)=(100,150)の位置に表示します。

後半の1,0は、1が色で、0がパターン番号です。

これでは動かすことができません^^; 

 

そのため、

この100,150をx,yとします。

x,yの値をその都度書き換えてやれば、

スプライトを好きな位置に表示させることができるのです!!!

素晴らしい(^O^)

 

プログラムのループ

ゲームプログラムはループさせてやらないといけません。

一番下までいったら、上にGOTOで飛ばしてやります。

 

どこへ飛ばすかですが、

カーソルキーの入力をチェックするところが妥当だと思います。

1000 S=STICK(0) OR STICK(1)

ここですね。

 

忘れていました。

15行に初期値を設定します。

15 X=112:Y=148:EX=0:EY=0:HX=2:HY=2

バーを最初に表示する位置ですとか、ボールの最初の位置。

あとはボールの移動量ですね。

 

これで完成です!

 

10 SCREEN1,2:COLOR1,15,1:WIDTH32:DEFINTA-Z:KEYOFF
15 X=112:Y=148:EX=0:EY=0:HX=2:HY=2
20 ' color 1
30 DATA 00,00,00,00,00,FF,00,FF,FF,FF,00,FF,00,00,00,00
40 DATA 00,00,00,00,00,FF,00,FF,FF,FF,00,FF,00,00,00,00
50 '
60 ' --- Slot 1
70 ' color 1
80 DATA 00,00,00,00,00,01,02,05,05,02,01,00,00,00,00,00
90 DATA 00,00,00,00,00,80,40,A0,A0,40,80,00,00,00,00,00
100 DATA *
110 GOSUB 10000
990 'PLAYER
1000 S=STICK(0) OR STICK(1)
1010 IF S=3 THEN X=X+2
1020 IF S=7 THEN X=X-2
1030 'BALL
1040 IF EX<0 THEN HX=-HX:BEEP
1050 IF EX>240 THEN HX=-HX:BEEP
1060 IF EY<0 THEN HY=-HY:BEEP
1070 EX=EX+HX
1080 EY=EY+HY
1090 'ATARI
1100 IF ABS(X-EX)<16 AND ABS(Y-EY)<8 THEN HY=-HY:BEEP
1110 'GAME OVER
1120 IF EY>196 THEN HX=0:HY=0:LOCATE 11,10:PRINT"GAME OVER"
1130 'SPRITE
1140 PUT SPRITE 0,(X ,Y),1,0
1150 PUT SPRITE 1,(EX,EY),1,1
1160 GOTO 1000
10000 REM -- LOAD SPRITES
10010 S=BASE(9)
10020 READ R$: IF R$="*" THEN RETURN ELSE VPOKE S,VAL("&H"+R$):S=S+1:GOTO 10020

 

https://msxpen.com/codes/-LdRBf9KpqrZNBXREpgX

 (クリックすると、WebMSXで試すことができます。

msxpenはweb上にMSXが再現されています^^)

 

 スプライトの別の表示方法で作ったソースコードも書いておきます。

やりやすい方法でやってください(*´∀`*)

 

10 SCREEN1,2:COLOR15,15,1:WIDTH32:DEFINTA-Z:KEYOFF
15 X=112:Y=148:EX=0:EY=0:HX=2:HY=2
100 RESTORE 5000
110 FOR J=0 TO 1
120 FOR I=0 TO 15
130 READ DT$
140 L$=L$+CHR$(VAL("&B"+LEFT$(DT$,8)))
150 R$=R$+CHR$(VAL("&B"+RIGHT$(DT$,8)))
160 NEXT
170 SPRITE$(J) =L$+R$
180 L$="":R$=""
190 NEXT
990 'PLAYER
1000 S=STICK(0) OR STICK(1)
1010 IF S=3 THEN X=X+2
1020 IF S=7 THEN X=X-2
1030 'BALL
1040 IF EX<0 THEN HX=-HX:BEEP
1050 IF EX>240 THEN HX=-HX:BEEP
1060 IF EY<0 THEN HY=-HY:BEEP
1070 EX=EX+HX
1080 EY=EY+HY
1090 'ATARI
1100 IF ABS(X-EX)<16 AND ABS(Y-EY)<8 THEN HY=-HY:BEEP
1110 'GAME OVER
1120 IF EY>196 THEN HX=0:HY=0:LOCATE 11,10:PRINT"GAME OVER"
1130 'SPRITE
1140 PUT SPRITE 0,(X ,Y),1,0
1150 PUT SPRITE 1,(EX,EY),1,1
1160 GOTO 1000
4995 'SPRITE BAR DATA
5000 DATA0000000000000000
5010 DATA0000000000000000
5020 DATA0000000000000000
5030 DATA0000000000000000
5040 DATA0000000000000000
5050 DATA1111111111111111
5060 DATA0000000000000000
5070 DATA1111111111111111
5080 DATA1111111111111111
5090 DATA1111111111111111
5100 DATA0000000000000000
5110 DATA1111111111111111
5120 DATA0000000000000000
5130 DATA0000000000000000
5140 DATA0000000000000000
5150 DATA0000000000000000
5155 'SPRITE BALL DATA
5160 DATA0000000000000000
5170 DATA0000000000000000
5180 DATA0000000000000000
5190 DATA0000000000000000
5200 DATA0000000000000000
5210 DATA0000000110000000
5220 DATA0000001001000000
5230 DATA0000010110100000
5240 DATA0000010110100000
5250 DATA0000001001000000
5260 DATA0000000110000000
5270 DATA0000000000000000
5280 DATA0000000000000000
5290 DATA0000000000000000
5300 DATA0000000000000000
5310 DATA0000000000000000

 

違うのは青文字のところです。

ゲーム自体は全く同じです。

(2進数でスプライトを定義すると長くなってしまいますね。

でもDATAを見れば、どんな形かわかるのは利点だとおもいます。

修正もできますし^^)

 

こちらで実行とソースコードをどうぞ。

https://msxpen.com/codes/-LdaScUy5LUDNZ0p-knY

 

 

ちょっと寂しいので

少し改造してみました(*´∀`*)

こちら!

ペンギンおさかなテニス 

f:id:nyaonyaokun:20190427184206p:plain

 

ペンギンの当たる位置によって、ボール代わりの魚の跳ね返る角度が変わります。

(色も変わるように^^)

 

 

https://msxpen.com/codes/-LdYGdKPxxuk6_hQXfEo

 (修正版)

 

スコアがあるのと、何度もリトライできるようにしておきました。

 

 

ソースコードも貼っておきますね。

(前回のは大きく間違っていました。

申し訳ありませんでしたm(_ _)m

魚の跳ね返りかたがメチャクチャでした。お恥ずかしい^^;

まだ少しおかしいところがあるような...)

 

ちなみに僕のハイスコアは34点です^^

 

10 SCREEN1,2:COLOR1,15,1:WIDTH32:DEFINTA-Z:KEYOFF
100 ' color 1
110 ' --- Slot 2
120 ' color 4
130 DATA 03,07,0F,1F,1F,1F,1F,3F,3F,3F,7F,FD,FE,7F,30,60
140 DATA F0,F8,FC,DC,DC,FF,FE,FC,84,04,84,C5,0B,F6,04,00
150 '
160 ' --- Slot 3
170 ' color 4
180 DATA 03,07,0F,1F,1F,1F,1F,1F,37,37,2E,2C,72,7E,FF,0F
190 DATA F0,F8,FC,DC,DC,FF,FE,FC,06,06,07,05,04,08,F0,78
200 '
210 ' --- Slot 6
220 ' color 4
230 DATA 0F,1F,3F,3B,3B,FF,7F,3F,21,20,21,A3,D0,6F,20,00
240 DATA C0,E0,F0,F8,F8,F8,F8,FC,FC,FC,FE,BF,7F,FE,0C,06
250 '
260 ' --- Slot 7
270 ' color 4
280 DATA 0F,1F,3F,3B,3B,FF,7F,3F,60,60,E0,A0,20,10,0F,1E
290 DATA C0,E0,F0,F8,F8,F8,F8,F8,EC,EC,74,34,4E,7E,FF,F0
300 '
310 ' --- Slot 1
320 ' color 1
330 DATA 1F,7E,FE,EE,FD,7B,27,1E,07,01,07,00,00,00,00,00
340 DATA 00,FC,F6,F8,FC,7E,BF,FF,7F,E7,C3,07,76,3A,1C,0C
350 DATA *
360 GOSUB 10000
960 LOCATE 5,10:PRINT"Penguin OSAKANA TENNIS"
970 GOSUB 1310
980 X=112:Y=148:EX=0:EY=0:HX=6:HY=6:H=0:SC=0:CR=11:RF=0:NO=0
990 'PLAYER
1000 S=STICK(0) OR STICK(1)
1010 IF S=3 THEN X=X+4:H=(H+1)MOD 4
1020 IF S=7 THEN X=X-4:H=(H+1)MOD 4+4
1030 'BALL
1040 IF EX<0 THEN HX=-HX:BEEP
1050 IF EX>240 THEN HX=-HX:BEEP
1060 IF EY<0 THEN HY=-HY:BEEP
1070 EX=EX+HX
1080 EY=EY+HY
1090 'ATARI
1100 X1=X+8:X2=EX+8
1105 IF NO=1 THEN 1200
1110 IF ABS(Y-EY)>15 THEN 1200
1120 IF RF=1 AND ABS(X1-X2)<16 THEN 1400
1130 IF ABS(X1-X2)<4 THEN HY=-HY:BEEP:SC=SC+1:CR=5:NO=1 ELSE 1160
1140 IF HX>0 THEN HX=2 ELSE HX=-2
1150 GOTO 1190
1160 IF ABS(X1-X2)<10 THEN HY=-HY:BEEP:SC=SC+1:CR=11:NO=1 ELSE 1170
1165 IF HX>0 THEN HX=6 ELSE HX=-6
1168 GOTO 1190
1170 IF ABS(X1-X2)<16 THEN HY=-HY:BEEP:SC=SC+1:CR=8:NO=1:ELSE 1200
1180 IF HX>0 THEN HX=12 ELSE HX=-12
1190 IF RF<>1 THEN RF=RND(-TIME)*6
1200 IF RF=1 THEN CR=CR+1
1210 IF CR>15 THEN CR=1
1220 IF EY<132 THEN NO=0
1230 'GAME OVER
1240 IF EY>196 THEN HX=0:HY=0:GOSUB 1300:GOTO 980
1250 'SPRITE
1260 PUT SPRITE 0,(X ,Y),1,H/2
1270 PUT SPRITE 1,(EX,EY),CR,4
1280 LOCATE 0,0:PRINT USING"SCORE####";SC
1290 GOTO 1000
1300 LOCATE 11,10:PRINT"GAME OVER"
1310 LOCATE 9,12:PRINT"PUSH SPACE KEY"
1320 IF STRIG(0)=0 THEN GOTO 1320
1330 CLS
1340 RETURN
1390 'RANDOM FISH
1400 HY=-HY:NO=1:SC=SC+1:BEEP:RF=0
1410 RD=RND(-TIME)*4+10
1420 IF HX>0 THEN HX=RD ELSE HX=-RD
1430 GOTO 1200
10000 REM -- LOAD SPRITES
10010 S=BASE(9)
10020 READ R$: IF R$="*" THEN RETURN ELSE VPOKE S,VAL("&H"+R$):S=S+1:GOTO 10020

 

 

 

こちらから他のBASICの基本について書いたページに

飛べます。

どうぞご利用下さい^^

 

www.nyaonyao21.com

 

まとめ

プログラムを作るには、全体の流れが必要です。

これが中々わからないんですよね〜。

 

 だいたいこんな流れで(1から順に)いいと思います。

 

作り方としては、

まずスプライトを表示させます。

そしてそれをカーソルキーで動かせるようにする。

 

敵のスプライトも表示。

敵を適当に動かす。

 

プレイヤーと敵との当たり判定。

 

ゲームオーバー処理。

こんな感じで作っています。

 

どんなゲームもこんな感じだと思います^^

 

いっぱいゲームを作っていきましょう〜。

 

ps

MSX PEN.comのサイトにプログラムを書いて、

MSXPEN.comの右上のSHAREボタンを押すとURLが表示されるので、

それをメモしておけば、いつでも公開できますよ!

(レンタルサーバーの契約をしてなくても公開できるのは大きいですよね!)

 

https://msxpen.com/

 


「ニャオニャオ21世紀は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。」

当サイトは第三者配信の広告サービス「Google Adsense グーグルアドセンス」を利用しています。 広告配信事業者は、ユーザーの興味に応じた広告を表示するためにCookie(クッキー)を使用することがあります。 Cookie(クッキー)を無効にする設定およびGoogleアドセンスに関する詳細は「広告 – ポリシーと規約 – Google」をご覧ください