ニャオニャオ21世紀

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

WebMSXでMSX BASICの自作ゲーム作成!第七弾。 ブロックの絵を複数描きました!(URLクリックで実行できます)

 

WebMSXでBASICの自作ゲーム作成!第七弾。

今回は、ゲームっぽくなるように絵を描いてみました。

やっていることは簡単です。

前回までは1文字だけの絵を変えていましたが、

今回は複数にしただけです。

 

URLクリックで出来ます。

http://webmsx.org/?DISKA_URL=http://goods.heteml.jp/msx/movemove (12).dsk

 

f:id:nyaonyaokun:20180228080759p:plain

 

いい感じになってきました!

最初の画面がでるところまで、少し待たされますが、これは

文字の絵を描きかえているので仕方がありません^^

 

では解説を。

 

5 COLOR 15,5,1
10 SCREEN2:SCREEN1,2,0:DEFINTA-Z:KEYOFF:WIDTH32
15 DEFUSR=&H7E:A=USR(0)
20 H2 = 1:X=112:Y=160:XX=4:YY=4:DIM A1(10):SS=6
30 FOR J=0 TO 7:S$="":FOR I=1 TO32:READD$:S$=S$+CHR$(VAL("&H"+D$
)):NEXT:SPRITE$(J)=S$:NEXT
40 FOR K=0 TO SS:A1(K)=65+K:NEXT

41 D$=" ":RESTORE 1000
44 FOR K=0 TO SS
49 D$=" "
50 FOR I=0 TO 7
60 READ D$,C$
70 VPOKE A1(K)*8+I,VAL("&b"+D$)
72 VPOKE &H800+A1(K)*8+I,VAL("&b"+D$)
74 VPOKE &H1000+A1(K)*8+I,VAL("&b"+D$)
90 VPOKE &H2000+A1(K)*8+I,VAL("&h"+C$)
92 VPOKE &H2800+A1(K)*8+I,VAL("&h"+C$)
94 VPOKE &H3000+A1(K)*8+I,VAL("&h"+C$)
96 NEXT
99 NEXT
100 LOCATE 15,8:PRINT "AAAAAAAAA"
108 LOCATE 8,12:PRINT "AAA"
109 LOCATE 16,17:PRINT " BE BE"
110 LOCATE 8,12:PRINT "AAA"
120 LOCATE 5,10:PRINT "AAA"
130 LOCATE 10,18:PRINT "AAA BE CD  CD"
135 LOCATE 10,19:PRINT "AAA CD CD  CD"
136 LOCATE 10,20:PRINT " CD  CD  CD"
137 LOCATE 10,21:PRINT " CD CD  CD"
140 BY=22:FOR BX=0 TO 31
150 VPOKE &H1800 + 32*BY + BX,A1(5)
155 VPOKE &H1800 + 32*(BY+1)+BX,A1(6)
160 NEXT
170 S=STICK(0):TG=STRIG(0)
180 XX=0
190 IF S=3 THEN XX=8
200 IF S=7 THEN XX=-8
210 X=X+XX
220 'IF S=1 THEN Y=Y-YY
230 'IF S=5 THEN Y=Y+YY
240 H2=-H2:IF JF=1 THEN H2=-1
250 IF S=3 AND H2=1 THEN H=0
260 IF S=3 AND H2=-1 THEN H=4
270 IF S=7 AND H2=1 THEN H=1
280 IF S=7 AND H2=-1 THEN H=5
290 IF X<0 THEN X=0
300 IF X>240 THEN X=240
310 IF JF=1 THEN 340
320 IF TG=0 THEN 390
330 JF=1:JY=-16:JC=3
340 IF JC=0 THEN 370
350 IF TG=0 THEN JC=0:GOTO 370
360 JC=JC-1
370 IF JC=0 AND JY<8 THEN JY=JY+4
380 Y=Y+JY
390 X2=(X-XX)\8:Y2=Y\8:Y3=(Y-JY)¥8:IF JF=0 THEN JY=0
400 AD = &H1800+(X¥8)+(Y¥8)*32
410 AE=&H1800+((X+15)¥8)+(Y¥8)*32
420 IF XX>0 AND VPEEK(AE)>=A1(0)THEN X=X2*8
430 IF XX>0 AND VPEEK(AE+32)>=A1(0) THEN X=X2*8
440 IF XX<0 AND VPEEK(AD)>=A1(0)THEN X=X2*8
450 IF XX<0 AND VPEEK(AD+32)>=A1(0) THEN X=X2*8
460 AD = &H1800+(X¥8)+(Y¥8)*32
470 AE=&H1800+((X+15)¥8)+(Y¥8)*32
480 IF JY<0 AND VPEEK(AD)>=A1(0)
THEN Y=Y3*8:JF=0:JY=0
490 IF JY<0 AND VPEEK(AE)>=A1(0) THEN Y=Y3*8:JF=0:JY=0
500 IF JY>=0 AND VPEEK(AD+64)>=A1(0) THEN Y=Y2*8:JF=0:GOTO 530
510 IF JY>=0 AND VPEEK(AE+64)>=A1(0) THEN Y=Y2*8:JF=0:GOTO 530
520 IF JF=0 THEN JF=1:JC=0:JY=0
530 PUTSPRITE 0,(X,Y),7,H
540 PUTSPRITE 1,(X,Y),11,H+2
550 GOTO 170
800 DATA 2E,2D,67,7E,78,7C,38,06
,16,17,0F,14,1D,07,0F,0F,F0,F8,8
0,00,00,00,00,00,E0,70,70,20,50,
80,80,E0
810 DATA 0F,1F,01,00,00,00,00,00
,07,0E,0E,04,0A,01,01,07,74,B4,E
6,7E,1E,3E,1C,60,68,E8,F0,28,B8,
E0,F0,F0
820 DATA 10,10,18,00,01,01,01,00
,00,00,00,03,00,00,00,00,00,00,1
0,50,D8,F0,E0,00,00,00,00,00,00,
00,00,00
830 DATA 00,00,08,0A,1B,0F,07,00
,00,00,00,00,00,00,00,00,08,08,1
8,00,80,80,80,00,00,00,00,C0,00,
00,00,00
840 DATA 00,1E,5D,4B,7E,78,7C,38
,06,0D,1D,0D,16,2B,38,1E,00,E0,F
8,80,00,00,00,00,00,E0,F0,30,20,
D4,3C,38
850 DATA 00,07,1F,01,00,00,00,00
,00,07,0F,0C,04,2B,3C,1C,00,78,B
A,D2,7E,1E,3E,1C,60,B0,B8,B0,68,
D4,1C,78
860 DATA 00,20,20,30,00,01,01,01
,00,00,00,00,00,00,00,00,00,00,0
0,10,50,D8,F0,E0,00,00,00,C0,C0,
00,00,00
870 DATA 00,00,00,08,0A,1B,0F,07
,00,00,00,03,03,00,00,00,00,04,0
4,0C,00,80,80,80,00,00,00,00,00,
00,00,00
1000 DATA 00000100,1f
1010 DATA 00000100,15
1020 DATA 00000100,15
1030 DATA 11111111,15
1040 DATA 00100000,15
1050 DATA 00100000,15
1060 DATA 00100000,14
1070 DATA 11111111,15
1080 DATA 00000000,ef
1090 DATA 11111111,ee
1100 DATA 01100110,1f
1110 DATA 11111111,ee
1120 DATA 01100110,1f
1130 DATA 11111111,ef
1140 DATA 10011000,5f
1150 DATA 10000000,5e
1160 DATA 11001000,5f
1170 DATA 11001000,5f
1180 DATA 11001000,5f
1190 DATA 11001000,5f
1200 DATA 11001000,5f
1210 DATA 11001000,5f
1220 DATA 11001000,5f
1230 DATA 11001000,5f
1240 DATA 00010011,5e
1250 DATA 00010011,5e
1260 DATA 00010011,5e
1270 DATA 00010011,5e
1280 DATA 00010011,5e
1290 DATA 00010011,5e
1300 DATA 00010011,5e
1310 DATA 00010011,5e
1320 DATA 00000000,ef
1330 DATA 11111111,ee
1340 DATA 01100110,1f
1350 DATA 11111111,ee
1360 DATA 01100110,1f
1370 DATA 11111111,ef
1380 DATA 00011001,5f
1390 DATA 00000001,5e
1400 DATA 00000100,1f
1410 DATA 00000100,1f
1420 DATA 00000100,1e
1430 DATA 11111111,15
1440 DATA 00100000,23
1450 DATA 00001000,a3
1460 DATA 01000010,c3
1470 DATA 10000010,c3
1480 DATA 00000100,23
1490 DATA 00100000,c3
1500 DATA 10000100,c3
1510 DATA 10010011,c3
1520 DATA 00001000,23
1530 DATA 00100100,c3
1540 DATA 10000000,c3
1550 DATA 00001000,c3

 

今回の追加は、

20 H2 = 1:X=112:Y=160:XX=4:YY=4:DIM A1(10):SS=6

 

40 FOR K=0 TO SS:A1(K)=65+K:NEXT

41 D$=" ":RESTORE 1000
44 FOR K=0 TO SS
49 D$=" "
50 FOR I=0 TO 7
60 READ D$,C$
70 VPOKE A1(K)*8+I,VAL("&b"+D$)
72 VPOKE &H800+A1(K)*8+I,VAL("&b"+D$)
74 VPOKE &H1000+A1(K)*8+I,VAL("&b"+D$)
90 VPOKE &H2000+A1(K)*8+I,VAL("&h"+C$)
92 VPOKE &H2800+A1(K)*8+I,VAL("&h"+C$)
94 VPOKE &H3000+A1(K)*8+I,VAL("&h"+C$)
96 NEXT
99 NEXT

ここと、

あと一部変更したところ、

420 IF XX>0 AND VPEEK(AE)>=A1(0)THEN X=X2*8
430 IF XX>0 AND VPEEK(AE+32)>=A1(0) THEN X=X2*8
440 IF XX<0 AND VPEEK(AD)>=A1(0)THEN X=X2*8
450 IF XX<0 AND VPEEK(AD+32)>=A1(0) THEN X=X2*8
 
480 IF JY<0 AND VPEEK(AD)>=A1(0) THEN Y=Y3*8:JF=0:JY=0
490 IF JY<0 AND VPEEK(AE)>=A1(0) THEN Y=Y3*8:JF=0:JY=0
500 IF JY>=0 AND VPEEK(AD+64)>=A1(0) THEN Y=Y2*8:JF=0:GOTO 530
510 IF JY>=0 AND VPEEK(AE+64)>=A1(0) THEN Y=Y2*8:JF=0:GOTO 530

 

あとは、ブロックの画像データですね。

 

1000 DATA 00000100,1f
1010 DATA 00000100,15
1020 DATA 00000100,15
1030 DATA 11111111,15
1040 DATA 00100000,15
1050 DATA 00100000,15
1060 DATA 00100000,14
1070 DATA 11111111,15
1080 DATA 00000000,ef
1090 DATA 11111111,ee
1100 DATA 01100110,1f
1110 DATA 11111111,ee
1120 DATA 01100110,1f
1130 DATA 11111111,ef
1140 DATA 10011000,5f
1150 DATA 10000000,5e
1160 DATA 11001000,5f
1170 DATA 11001000,5f
1180 DATA 11001000,5f
1190 DATA 11001000,5f
1200 DATA 11001000,5f
1210 DATA 11001000,5f
1220 DATA 11001000,5f
1230 DATA 11001000,5f
1240 DATA 00010011,5e
1250 DATA 00010011,5e
1260 DATA 00010011,5e
1270 DATA 00010011,5e
1280 DATA 00010011,5e
1290 DATA 00010011,5e
1300 DATA 00010011,5e
1310 DATA 00010011,5e
1320 DATA 00000000,ef
1330 DATA 11111111,ee
1340 DATA 01100110,1f
1350 DATA 11111111,ee
1360 DATA 01100110,1f
1370 DATA 11111111,ef
1380 DATA 00011001,5f
1390 DATA 00000001,5e
1400 DATA 00000100,1f
1410 DATA 00000100,1f
1420 DATA 00000100,1e
1430 DATA 11111111,15
1440 DATA 00100000,23
1450 DATA 00001000,a3
1460 DATA 01000010,c3
1470 DATA 10000010,c3
1480 DATA 00000100,23
1490 DATA 00100000,c3
1500 DATA 10000100,c3
1510 DATA 10010011,c3
1520 DATA 00001000,23
1530 DATA 00100100,c3
1540 DATA 10000000,c3
1550 DATA 00001000,c3

 

順番に見ていきます。

20 H2 = 1:X=112:Y=160:XX=4:YY=4:DIM A1(10):SS=6

20行は初期値設定です。

追加したのは

DIM A1(10)

SS=6

です。

DIMというのは配列でして、

A1(0) ~ A1(9)まで変数を用意します。

なぜこんなものを使うかというと、

( )の中の数字を変えてやれば、順番に中の値を取り出せたり

できるからです。

まぁ、プログラムではよく使われます。

 

SSは、なぜ 6なのかといいますと、

今回は、6文字を、形を変えてブロックや、草はらにするからです。

 

40 FOR K=0 TO SS:A1(K)=65+K:NEXT

まずここの65という数字は

文字Aのアスキーコードです。(あらかじめ調べておきました)

PRINT ASC("A")

ででると思います。

アスキーコードの65 , 66 , 67 , 68 , 69 , 70

の形を変えます。

A ... 65

B ... 66

C ... 67

D ... 68

E ... 69

F ... 70

がアスキーコードになります。

なぜ連番で使っているかは、当たり判定のときに明らかにします。

 

41行目からは、ただ順番にVRAMの値を書き換えているだけです。

これは以前にやりました。

 

420 IF XX>0 AND VPEEK(AE)>=A1(0)THEN X=X2*8
430 IF XX>0 AND VPEEK(AE+32)>=A1(0) THEN X=X2*8
440 IF XX<0 AND VPEEK(AD)>=A1(0)THEN X=X2*8
450 IF XX<0 AND VPEEK(AD+32)>=A1(0) THEN X=X2*8
 
480 IF JY<0 AND VPEEK(AD)>=A1(0) THEN Y=Y3*8:JF=0:JY=0
490 IF JY<0 AND VPEEK(AE)>=A1(0) THEN Y=Y3*8:JF=0:JY=0
500 IF JY>=0 AND VPEEK(AD+64)>=A1(0) THEN Y=Y2*8:JF=0:GOTO 530
510 IF JY>=0 AND VPEEK(AE+64)>=A1(0) THEN Y=Y2*8:JF=0:GOTO 530

 

赤文字が変更点です。

前回は

VPEEK(AD)=A1

ってなっていましたが、

今回は

>=A1(0)

となっています。

これは、アスキー表をみてもらうとわかるのですが、

文字の"A" つまりアスキーコードで 65以上の文字

をブロックとして判定しています。

 

アスキーコード 65 , 66 , 67 , 68 , 69 , 70に当たり判定を入れています。

 

なにもないところは”スペース”で、アスキーコードは32となっています。

ですので、65以上をブロックとします。(32が入らないように)

 

これからブロックだけでなく、通り抜けのできる背景を描くこともあると思います。

そのときに、アスキーコード65未満の文字を文字を書きかえればいいのです。

(65でなくても、A1(0)を70でも80にでも変更できますよね)

 

今日はこれだけです。

絵を描くのは楽しいですね^^

1000行以降のデータを書きかえれば、誰でも絵を変えることが

できます。

ブロックの絵を変えて遊んでみても面白いかもしれません^^

 

これからどうしようかな?

敵を入れるのがいいでしょうかねぇ。

 

追伸:

iphoneとandroidでアプリを作っております。

MSXっぽいアプリで、横スクロールランアクションゲームです。

8ドットカクカクスクロールです!

 

8bit run run go

8bit run run go

  • nao21
  • ゲーム
  • 無料

 

 

play.google.com

 

www.nyaonyao21.com

 

 こちらもよろしく、です!

 

 次のページ

www.nyaonyao21.com

 

 

 


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

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