ニャオニャオ21世紀

雑記と、MSXぽいアプリ開発と、ゲーム関係、ビジネスほか雑記を綴っています

ゴーストバスターズ ワールド!どんなARゲームになるのか期待!ちょっとワクワクする!

 

ゴーストバスターズがゲーム化されるそうで。

今度はARだ!

ポケモンGOタイプのゲームらしいです。

 

gigazine.net

 

ゲーム画面らしいものは公開されておらず、イメージ映像のみです。

 

ゴーストバスターズを80年代に見た時は、

なんて面白い映画なんだ!と感動したものですが、

ゴーストバスターズ2と、この前の女性のゴーストバスターズは

私としてはイマイチでした(涙)

 

80年代というのは、なぜあんなにもワクワクする映画があったのでしょうね?

なにか温かみも感じるような作品が多かったように思います。

グーニーズとか、グレムリンとか、バックトゥザ・フューチャーとか。

私の大好きな名作ゲームのMOTHER2は、あの頃の映画的な設定を存分に

盛り込んでありました。

 

ゴーストバスターズのゲームというと、MSX、ファミコンにもでていました。

[MSX] GHOSTBUSTERS

(このサイト様が詳しいです。)

 

当時がっかりしたのを覚えていますw それもいい思い出^^

しかし、ファミコンのNEWゴーストバスターズ2はとてもいい出来で、

最近になって手に入れました。

youtu.be

 

これぞ求めていたゴーストバスターズだ!って感じでした^^

HAL研究所なんですね。いい仕事をします^^

コミカルなアクションで、思わずニヤニヤしてプレイしてましたw

 

NEWゴーストバスターズ2
NEWゴーストバスターズ2
posted with amazlet at 18.02.24
HAL研究所
売り上げランキング: 22,560
 
ARゲームですが、映画のゴーストバスターズは好きなので、
期待はしていますが、どうなることでしょう。
 
いろんなゴーストが街中をうろうろしているなんて想像したら、
わくわくしてきます。
設定は楽しそうですが、ゲームのシステムはどうなることか。
ポケモンGOまんまだったら嫌だな〜。
もう飽きちゃったので。
 
あまり大きく期待はせずに待つこととします^^
 
では〜。
 

 

 

 

 

 

 

WebMSXでBASICのゲームを作ろう!第五弾。 多色刷りでカラフルに!(URLクリックで実行できます)

 

ブロックをカラフルにしたいと思います。

前回は、1キャラクター(8x8ドット)当たりに、

2色にしか出来ませんでした。

それも8文字1セットでしか色変えが出来ませんでした。

 

今日は、1文字ごとに1ライン8ドット2色に挑戦します。

プログラム的にわかりやすくするために単純な書き方をしています。

ご了承ください。

URLクリックで実行できます。

 

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

 

f:id:nyaonyaokun:20180224082610p:plain

 

デザイン的にはアレですけど、カラフルになりました!

これを応用していけば、見栄えだけは商用のゲームと同じような

ものがつくれます!

(絵の書き換えとかスピードではだめだめですがw)

 

 

それではソースコードです。

 

10 SCREEN2:COLOR15,1,5:SCREEN1,2,0:DEFINTA-Z:KEYOFF:WIDTH32
15 DEFUSR=&H7E:A=USR(0)
20 H2 = 1:X=128:Y=160:XX=4:YY=4
30 FOR J=0 TO 7:S$="":FOR I=1 TO32:READD$:S$=

S$+CHR$(VAL("&H"+D$)):NEXT:SPRITE$(J)=S$:NEXT
40 A1=ASC("A"):D$=" ":RESTORE 1000
50 FOR I=0 TO 7
60 READ D$,C$
70 VPOKE A1*8+I,VAL("&b"+D$)
72 VPOKE &H800+A1*8+I,VAL("&b"+D$)
74 VPOKE &H1000+A1*8+I,VAL("&b"+D$)
90 VPOKE &H2000+A1*8+I,VAL("&h"+C$)
92 VPOKE &H2800+A1*8+I,VAL("&h"+C$)
94 VPOKE &H3000+A1*8+I,VAL("&h"+C$)
96 NEXT
100 LOCATE 15,15:PRINT "AAA"
110 LOCATE 8,12:PRINT "AAA"
120 LOCATE 5,10:PRINT "AAA"
130 LOCATE 10,18:PRINT "AAA"
140 BY=22:FOR BX=0 TO 31
150 VPOKE &H1800 + 32*BY + BX,A1

160 NEXT
170 S=STICK(0):TG=STRIG(0)
180 XX=0
190 IF S=3 THEN XX=4
200 IF S=7 THEN XX=-4
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=-8:JC=6
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+2
380 Y=Y+JY
390 Y2=Y\8:IF JF=0 THEN JY=0
400 AD = &H1800+(X\8)+Y2*32
410 IF VPEEK(AD+64)=A1 THEN Y=Y2*8:JF=0:GOTO 440
420 IF VPEEK(AD+1+64)=A1 THEN Y=Y2*8:JF=0:GOTO 440
430 IF JF=0 THEN JF=1:JC=0:JY=0
440 PUTSPRITE 0,(X,Y),7,H
450 PUTSPRITE 1,(X,Y),11,H+2
460 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 10000001,12
1010 DATA 10000001,14
1020 DATA 10000001,16
1030 DATA 11111111,15
1040 DATA 00011000,18
1050 DATA 00011000,1a
1060 DATA 00011000,1c
1070 DATA 11111111,14

 

今回は行番号を書き換えていません。(面倒臭いので。)

10 SCREEN2:COLOR15,1,5:SCREEN1:DEFINTA-Z:KEYOFF:WIDTH32
15 DEFUSR=&H7E:A=USR(0)

と、

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

 

と、あとDATA文1000 DATA 10000001,12
1010 DATA 10000001,14
1020 DATA 10000001,16
1030 DATA 11111111,15
1040 DATA 00011000,18
1050 DATA 00011000,1a
1060 DATA 00011000,1c
1070 DATA 11111111,14

 

前回は、1000行以降の

ブロックのDATAを16進数にしていましたが、

今回はわかりやすくするために、

 

ブロックの絵を、2進数

色データを、16進数

 

にしております。

 

それほど多くの追加ではないですね!

順番に見ていきましょう。

 

10 SCREEN2:COLOR15,1,5:SCREEN1

 

多色刷りモード(カラフル)は、本来、SCREEN1では出来ません。

そこでSCREEN2の力を借ります。

だから、SCREEN1.5などと呼ばれています。

(正式にはSCREEN1.5モードというものはないです。)

SCREEN2は文字が表示できないので、SCREEN1とSCREEN2のいいとこどりを

します。

 

15 DEFUSR=&H7E:A=USR(0)

BASICでは、DEFUSR命令とUSR関数が、

機械語サブルーチンを呼び出す方法らしいです。

それで&H7Eはなにかと調べてみると、

VDPのみをSCREEN2に初期化するとあります。(BIOS)

まだこのあたりのことはよくわからないです;

おいおいVDPのことも調べていきたいです^^

(VDP = ビデオディスプレイプロセッサ)

 

いよいよ文字を絵に書き換えです。

50 FOR I=0 TO 7
60 READ D$,C$
70 VPOKE A1*8+I,VAL("&b"+D$)
72 VPOKE &H800+A1*8+I,VAL("&b"+D$)
74 VPOKE &H1000+A1*8+I,VAL("&b"+D$)


90 VPOKE &H2000+A1*8+I,VAL("&h"+C$)
92 VPOKE &H2800+A1*8+I,VAL("&h"+C$)
94 VPOKE &H3000+A1*8+I,VAL("&h"+C$)
96 NEXT

 

前回は

70 VPOKE A1*8+I,VAL("&b"+D$)

90 VPOKE &H2000+A1*8+I,VAL("&h"+C$)

だけだったと思います。

(90行は色を設定するところでしたが、少し変わっていますね。)

(90行は、前回の8文字単位ではなくなるため、素直なアドレスになりますw)

 

文字の形を設定する文と、

文字の色を設定する文とに別れていました。

 

それがなぜかVPOKE文が、3倍になっています。

1文字変えるだけなのになぜ?と思われると思います。

 

それはSCREEN2に似ている、多色刷りのVRAM構成は、

画面を上段、中段、下段と書き換えなければいけないのです。

-------------------------------------

上段

-------------------------------------

中段

-------------------------------------

下段

-------------------------------------

(画面構成)

 

 

なぜこんな仕組みになっているんでしょうね?

文字の形の入っているパターンジェネレータテーブルは、

(VRAMの構成)

&H0000-------------------------------------

↓   画面上段の文字        

&H0800-------------------------------------

↓   画面中段の文字  

&H1000-------------------------------------

↓   画面下段の文字

&H1800-------------------------------------

 

となっているので、

70 VPOKE&H0000+*8+I,VAL("&b"+D$)
72 VPOKE &H800+A1*8+I,VAL("&b"+D$)
74 VPOKE &H1000+A1*8+I,VAL("&b"+D$)

となるわけです。

 

色のほうも、画面を、上段、中段、下段と分けて

入っています。

文字の色の入っているカラーテーブルは、

(VRAMの構成)

&H2000-------------------------------------

↓   画面上段の文字の色         

&H2800-------------------------------------

↓   画面中段の文字の色  

&H3000-------------------------------------

↓   画面下の文字の色 

&H3800-------------------------------------

となっています。

90 VPOKE &H2000+A1*8+I,VAL("&h"+C$)
92 VPOKE &H2800+A1*8+I,VAL("&h"+C$)
94 VPOKE &H3000+A1*8+I,VAL("&h"+C$)

 

 

文字の形と色のデータは、

1010 DATA 10000001,14
1020 DATA 10000001,16
1030 DATA 11111111,15
1040 DATA 00011000,18
1050 DATA 00011000,1a
1060 DATA 00011000,1c
1070 DATA 11111111,14

 

DATA 8桁の2進数(形),2桁の16進数(色)

となっていて、

色データは、カラーパレットの色の値がそのまま入ります。

2進数部分の1が、色データの左側で、

2進数部分の0が、色データの右側です。

 

1010 DATA 10000001,14 (1は黒、4は暗い青)

なら、

1010 DATA 黒、暗い青、暗い青、暗い青、暗い青、暗い青、暗い青、黒

となります。

 

なお、CTRL + F9でプログラムを止めた時は、SCREEN1 と打ちreturnキーを押して

ください。

 

VRAMで文字を書き換えるのは時間がかかりますね〜

書き換えるデータが多くなると、待ち時間が多くなりそうです。

よく雑誌に載っているBASICプログラムは、最初にかなり待たされたのは

このせいだったんですね!

だから、この部分をマシン語で書きたいです。

後々の話ですが。

 

絵のデータを用意するのが大変そうです。

16進数とかに直すのが。

いいツールはないんですかね〜。

JAVAで書かれたPCGエディターツールを見つけたのですが、

私の環境では動かなかったですよね。

う〜ん。

作るしかないのかなぁ。

 

今日のサンプルコードで、

しばらくはいろんな絵を描いて遊べそうです。

みなさんも、遊んでみてください。

できれば、それを公開して欲しいなぁ。なんて^^

 

では〜。

 

 

 

 

 

WebMSXでBASICのゲームを作ろう!第四弾。地面の当たり判定を入れる(URLクリックで実行できます)

 

WebMSXでBASICのゲームを作ろう!第四弾。

地面の当たり判定をいれます。

今まではY>160以上はY=160などと簡易なものでした。

それを自分のキャラの下にブロックがあるかどうか判定して、

あればその上に表示するというのをやります。

今日は地面だけです。横移動とジャンプで頭がぶつかるというのは

また今度にします。 

 

こちらのURLをクリックして頂ければ実行できます。

 

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

 

f:id:nyaonyaokun:20180223090942p:plain

ちょっとゲームらしくなってきました!

それではソースコードを。

 

10 SCREEN1,2,0:DEFINTA-Z:KEYOFF:
WIDTH32: COLOR15,1,1
20 H2 = 1:X=128:Y=160:XX=4:YY=4
30 FOR J=0 TO 7:S$="":FOR I=1 TO32:

READD$:S$=S$+CHR$(VAL("&H"+D$
)):NEXT:SPRITE$(J)=S$:NEXT
40 A1=ASC("A"):D$=" ":RESTORE 1000
50 FOR I=0 TO 7
60 READ D$
70 VPOKE A1*8+I,VAL("&h"+D$)
80 NEXT
90 VPOKE &H2000+A1¥8,&H41
100 LOCATE 15,15:PRINT "AAA"
110 LOCATE 8,12:PRINT "AAA"
120 LOCATE 5,10:PRINT "AAA"
130 LOCATE 10,18:PRINT "AAA"
140 BY=22:FOR BX=0 TO 31
150 VPOKE &H1800 + 32*BY + BX, A1

160 NEXT
170 S=STICK(0):TG=STRIG(0)
180 XX=0
190 IF S=3 THEN XX=4
200 IF S=7 THEN XX=-4
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 310 IF JF=1 THEN 340
320 IF TG=0 THEN 390
330 JF=1:JY=-8:JC=6
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+
2
380 Y=Y+JY
390 Y2=Y¥8:IF JF=0 THEN JY=0
400 AD = &H1800+(X¥8)+Y2*32
410 IF VPEEK(AD+64)=A1 THEN Y=Y2
*8:JF=0:GOTO 440
420 IF VPEEK(AD+1+64)=A1 THEN Y=
Y2*8:JF=0:GOTO 440
430 IF JF=0 THEN JF=1:JC=0:JY=0
440 PUTSPRITE 0,(X,Y),7,H
450 PUTSPRITE 1,(X,Y),11,H+2
460 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 7E,7E,00,00,E7,E7,00,00

 

 

前回と違うのは、

100 LOCATE 15,15:PRINT "AAA"
110 LOCATE 8,12:PRINT "AAA"
120 LOCATE 5,10:PRINT "AAA"
130 LOCATE 10,18:PRINT "AAA"
140 BY=22:FOR BX=0 TO 31
150 VPOKE &H1800 + 32*BY + BX, A1

160 NEXT

 

の追加と、

180 XX=0
190 IF S=3 THEN XX=4
200 IF S=7 THEN XX=-4
210 X=X+XX

の変更と、

 

390 Y2=Y¥8:IF JF=0 THEN JY=0
400 AD = &H1800+(X¥8)+Y2*32
410 IF VPEEK(AD+64)=A1 THEN Y=Y2
*8:JF=0:GOTO 440
420 IF VPEEK(AD+1+64)=A1 THEN Y=
Y2*8:JF=0:GOTO 440
430 IF JF=0 THEN JF=1:JC=0:JY=0

の追加です。

 

行番号は変わっています。(BASICは行番号が面倒臭いですね;)

 

100~160行はステージを書いています。

新しいところは、140行以下ですね。

 

140 BY=22:FOR BX=0 TO 31
150 VPOKE &H1800 + 32*BY + BX, A1

160 NEXT

実行画面の一番下の横一列のブロックを表示しています。

VPOKEというのはVRAMに書き込む命令文でした。

VRAMには、表示画面のどこそこに、どんな文字が表示されているか

入っている場所があります。

&H1800以降に画面情報が入っています。

150行のA1は文字A(ブロックの絵に変更済み)のアスキーコードが入って

います。

 

画面というのは、X、Y座標であらわせるのはご存知だと思うのですが、

x,y=(10,15)

とかいうのですね。

それをひとつの数字で表すこともできます。

それが

VPOKE &H1800 + 32*BY + BXの、

+ 32*BY + BX

の部分です。

 

32*Y+X

ですね。

どういう仕組みかといいますと、

MSXの横に表示できる文字数は32文字です。

LOCATEのX座標では0~31で表されます。

x,y = (0,0)  ~   x,y=(31,0)

一つの数字で表すには、Y座標が0ならば、そのままX座標の数字を書いてやります。

問題は

Y座標が1,2,3,4,5~となった時ですね。

先に回答を書くと、

x,y = (0,1)は、32となります。

右端までいったら、そのまま数字を足していきます。

(y=0)    0,1,2,3  ~ 28,29,30,31ときたら下の列は、

(y=1) 32,33,34,35,~60,62,63ときます。さらにその下

(y=2)    64,65,66,67 ~ 93,94,95となり、その下

(y=3)    96,97,98,99~

と表します。

式 :32*Y+X

座標をこんな風にあらわしたことがなかったので、これを知ったときは

なるほどな〜考えてあるなぁと思いました。

私がiOSのカメラアプリを作った時に知りました。

メモリに入っている画像の色データを取得するものだったので同じものです。

MSXのBASICだけでなく、最新のアプリ開発にも使える考えです。すごい!

 

画面にどんな文字が表示されているか知るのも似ています。

それがわからないと、地面判定できないので。

 

 

390行からは、地面の判定になります。

 

390 Y2=Y¥8:IF JF=0 THEN JY=0
400 AD = &H1800+(X¥8)+Y2*32

 

X¥8とかY¥8とかありますが、

X,Yはスプライトの座標なので、(0,0) ~ (255,191)で表します。

それを文字の座標になおします。

文字は8x8ドットなので、8で割った商を取得すればOKです。

スプライト座標x,y=(160,85)なら、

文字の座標に直すとx,y=(20,10)になります。

 

400行のADには、あとで使うVRAMのアドレス部分だけを変数ADに

入れておきます。

のちのち計算の量が減ればいいなぁと思ってのことです。

 

スプライトは左上が座標になっています。

それと今回使っているのが、16x16ドットのスプライトです。

そうなると左下の地面(文字)と右下の地面(文字)を取得しないといけません。

410 IF VPEEK(AD+64)=A1 THEN Y=Y2
*8:JF=0:GOTO 440

420 IF VPEEK(AD+1+64)=A1 THEN Y=
Y2*8:JF=0:GOTO 440

410行が左下、420行が右下です。

 

マイキャラの足元の文字が"A"であるか調べています。

VPEEKはそのアドレスに何が入っているか取得する命令です。

 

画面上の文字を知るためには

&H1800+(文字単位のY座標)*32+(文字単位のX座標)

のアドレスを見ればいいです。

 

本来の書き方(アドレスの)をしますと、

IF VPEEK(&H1800+(X¥8)+(Y¥8+2)*32)=A1 THEN Y=Y2*8:JF=0:GOTO 440

となります。

VPEEK(&H1800+(X¥8)+(Y¥8+2)*32)=A1

(Y¥8+2)は2文字文下が足元になりますので、Y座標 +2してやるわけです。

 

(IF) THEN以降ですが、

地面がブロックだった場合、その地面の上の座標にスプライトを表示して

やればいいので

Y=Y2*8となります。

(文字単位の座標に掛ける8をしてやることで、地面との隙間なく表示できます)

(文字が8ドット、スプライトが16ドットなのでできる技ですね。)

 

430 IF JF=0 THEN JF=1:JC=0:JY=0

は下に地面がない時です。

ジャンプ時ではなく、

ブロックに乗っていて、横に歩いて端から落ちるところですね。

自由落下です。

 

自由落下も、ジャンプ処理のプログラムを使います。

もちろんジャンプフラグはオン。

それだけでは上に飛んでしまうので、ジャンプ時の頂点を意味する、

ジャンプカウンタ JC=0

ジャンプ時移動量 JY=0

に設定します。

この初期値を設定してやれば、あとは落ちていくだけです。

 

今日はこれぐらいにしておきます。

あとは横にブロックがある時に止まるとか、上にブロックがあるときですね。

ちょっとやってみたんですけど、動きがまったりしてしまうんですよねぇ。

遅いんです。

8ドット移動にすると速いのですが、ジャンプの軌道が気に入らないので、そこを

どうするかで悩んでいます。^^

 

では~。

 

WebMSXでBASICのゲームを作ろう!第三弾。VRAMを弄ってブロックの形へ(URLクリックで実行できます)

WebMSXでBASICのゲームを作ろう!第三弾。

VRAMを弄ってブロックの絵にしたいと思います。

とりあえず簡単な2色です。

カラフルな多色刷りはまた今度ということで。

VRAMには様々な絵に関するデータが入っています。

文字の形や、文字の色、スプライトデータとか、画面上の文字だとか。

その各アドレスに8bit(2進数で8文字 00000000とか)のデータが

入っていて、それらに直接アクセスし、データを書き換えることで

文字の形などを変えてやるというものです。

このURLクリックで、今回のプログラムがWebMSXで

実行できます。

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

 

f:id:nyaonyaokun:20180222065757p:plain

 

ソースコードを。


10 SCREEN1,2,0:DEFINTA-Z:KEYOFF:
WIDTH32: COLOR15,5,1
20 H2 = 1:X=128:Y=160
30 FOR J=0 TO 7:S$="":FOR I=1 TO
32:READD$:S$=S$+CHR$(VAL("&H"+D$
)):NEXT:SPRITE$(J)=S$:NEXT
40 A1=ASC("A"):D$=" ":RESTORE 100
0
50 FOR I=0 TO 7
60 READ D$
70 VPOKE A1*8+I,VAL("&B"+D$)
80 NEXT
90 VPOKE &H2000+A1¥8,&H1D
100 LOCATE 0,22
110 G$="AAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAA":PRINT G$
120 S=STICK(0):TG=STRIG(0)
130 IF S=3 THEN X=X+4
140 IF S=7 THEN X=X-4
150 IF S=1 THEN Y=Y-4
160 IF S=5 THEN Y=Y+4
170 H2=-H2:IF JF=1 THEN H2=-1
180 IF S=3 AND H2=1 THEN H=0
190 IF S=3 AND H2=-1 THEN H=4
200 IF S=7 AND H2=1 THEN H=1
210 IF S=7 AND H2=-1 THEN H=5
220 IF X<0 THEN X=0
230 IF X>240 THEN X=240
240 IF JF=1 THEN 270
250 IF TG=0 THEN 330
260 JF=1:JY=-8:JC=6
270 IF JC=0 THEN 300
280 IF TG=0 THEN JC=0:GOTO 300
290 JC=JC-1
300 IF JC=0 AND JY<8 THEN JY=JY+
2
310 Y=Y+JY
320 IF Y>160 THEN Y=160:JF=0
330 PUTSPRITE 0,(X,Y),7,H
340 PUTSPRITE 1,(X,Y),11,H+2
350 GOTO 120
500 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
510 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
520 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
530 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
540 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
550 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
560 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
570 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,
1000 DATA 10000001
1010 DATA 10000001
1020 DATA 11111111
1030 DATA 11111111
1040 DATA 00011000
1050 DATA 00011000
1060 DATA 11111111
1070 DATA 11111111

 

今回の追加は

40 A1=ASC("A"):D$=" ":RESTORE 100
0
50 FOR I=0 TO 7
60 READ D$
70 VPOKE A1*8+I,VAL("&B"+D$)
80 NEXT
90 VPOKE &H2000+A1¥8,&H1D
100 LOCATE 0,22
110 G$="AAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAA":PRINT G$

 

と、

1000 DATA 10000001
1010 DATA 10000001
1020 DATA 11111111
1030 DATA 11111111
1040 DATA 00011000
1050 DATA 00011000
1060 DATA 11111111
1070 DATA 11111111

です。

一番シンプルでわかりやすくなっていますので、

データは2進数になっております。

 

40行

40 A1=ASC("A"):D$=" ":RESTORE 1000

文字Aのアスキーコードを取得しています。

文字にはすべて番号がついております。

今回はAの文字の形をブロックに変えます。

Aの文字がVRAMのどのアドレスにはいっているかを知るために

アスキーコードが知りたかったのです。

 

RESTORE 1000

はDATA文を1000行目から読んでねというものです。

 

50~80行目は、

50 FOR I=0 TO 7
60 READ D$
70 VPOKE A1*8+I,VAL("&B"+D$)
80 NEXT

 

READ文でDATA文の横一列のデータを読みます。

今回は、DATA 10000001の

8文字です。

 

VPOKEは、VRAMの指定したアドレスのデータを書き換えます。

VPOKE アドレス,データ

A1*8+Iは、

ある文字のアスキーコード*8で、その文字が入っているアドレスがわかります。

その先頭アドレスから、8つ分で一文字ですね。

文字は8x8ドットで定義されていますので、1バイトに横一列分のデータ(8ドット分)が

入っています。

(VRAMの一番最初の方のアドレスには、文字の形のデータが入っています。)

VALは文字を数字に直す命令。

&Bは2進数を表します。先頭につけないと、2進数か10進数か、16進数かわからない

ですよね。ちなみに16進数は&Hです。10進数はつけなくてもかまいません。

 

90行は

90 VPOKE &H2000+A1¥8,&H1D

文字の色を変えます。

文字の色は、&H2000のアドレス以降に入っています。

SCREEN1では、8文字ごとに色が変えることができます。

色を変えると8文字いっぺんに変わってしまいます。

+A1¥8では、文字Aのカラーコードのアドレスを指定しています。

¥は、16¥2なら、値が8となります。

     17¥2でも値は8です。余は捨てられます。

+A1¥8なのは、8文字で1つの色なので。入っているアドレスも8で割った商です。

 

後半の&H1Dは文字の色です。16進数です。

color 1 黒とcolor D 紫(color 13)です。

1000 DATA 10000001
1010 DATA 10000001
1020 DATA 11111111
1030 DATA 11111111
1040 DATA 00011000
1050 DATA 00011000
1060 DATA 11111111
1070 DATA 11111111

1が黒で、0が紫ですね。

 

ブロックの表示は一番簡単な方法で、

100 LOCATE 0,22
110 G$="AAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAA":PRINT G$

LOCATE 0,22は文字表示の位置を指定するものです。

もうちょっといい風にしたいですが。

 

まだブロックとの当たり判定はいれていません。

ちょっと当たり判定をやってみたのですが、かなり遅くなってしまうのですよね〜

今は、

IF Y>160 THEN Y=160

という軽くてシンプルな方法です。

 

ブロックのデータの読み込みを16進数に変えるのは、

70 VPOKE A*8+I,VAL("&H"+D$)

&Bの2進数だったところを、&Hの16進数に変えるだけです。

 

1000 DATA 7E,7E,00,00,E7,E7,00,00
データは1行になります。

2進数から16進数への変換は、今はツールがあるので、探してみてください。

ちなみに私は、

TinySprite 0.4.7 - MSX Sprite Editor

で8x8ドットだけドットを打って、コピペしています。

16x16ドット用なので使い勝手が悪いですがw

 

ちょっと絵を描けばこのくらいの感じになります。

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

 

f:id:nyaonyaokun:20180222090911p:plain

 

ブロックとの当たり判定を入れたら、あとはマップと、敵を入れたら

ゲームっぽくなりますね。

今はまだいいですが、やっぱりスピードが足りないです。

一部でマシン語を使いたくなります。

がんばるか〜w

 

WebMSXでBASICのゲームを作ろう!第二弾。ジャンプ処理(URLクリックで実行できます)

 

WebMSXでBASICのゲームを作ろう!第二弾。

今日はジャンプをやりたいと思います。

このジャンプ処理はMSX MAGAZINE 永久保存版2に

記載されていたものです。

詳しくは本をご購入ください^^

MSX MAGAZINE 永久保存版 2
MSX MAGAZINE 永久保存版 2
posted with amazlet at 18.02.20

アスキー
売り上げランキング: 563,356

スペースキーを押す長さによって、ジャンプの高さが

変わります。

こちらのURLをクリックすると、実行結果を試せます。

 

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

 

WebMSXで作品公開する方法は、

WebMSXで作ったDiskイメージファイルをどこかにアップロードして、

そのURLを、

http://webmsx.org/?DISKA_URL=

のあとに繋げてリンクを貼ればOKです。

 

 

それではソースコードを。 

10 SCREEN1,2,0:DEFINTA-Z:KEYOFF:
WIDTH32: COLOR15,1,5
20 H2 = 1:X=128:Y=160
30 FOR J=0 TO 7:S$="":FOR I=1 TO
32:READD$:S$=S$+CHR$(VAL("&H"+D$
)):NEXT:SPRITE$(J)=S$:NEXT
40 S=STICK(0):TG=STRIG(0)
50 IF S=3 THEN X=X+4
60 IF S=7 THEN X=X-4
70 IF S=1 THEN Y=Y-4
80 IF S=5 THEN Y=Y+4
90 H2=-H2:IF JF=1 THEN H2=-1
100 IF S=3 AND H2=1 THEN H=0
110 IF S=3 AND H2=-1 THEN H=4
120 IF S=7 AND H2=1 THEN H=1
130 IF S=7 AND H2=-1 THEN H=5
140 IF X<0 THEN X=0
150 IF X>240 THEN X=240
160 IF JF=1 THEN 190
170 IF TG=0 THEN 250
180 JF=1:JY=-8:JC=6
190 IF JC=0 THEN 220
200 IF TG=0 THEN JC=0:GOTO 220
210 JC=JC-1
220 IF JC=0 AND JY<8 THEN JY=JY+
2
230 Y=Y+JY
240 IF Y>160 THEN Y=160:JF=0
250 PUTSPRITE 0,(X,Y),7,H
260 PUTSPRITE 1,(X,Y),11,H+2
270 GOTO 40

500 DATA 2E,2D,67,7E,78,7C,38,06,16,17,0F,14,1D,07,0F,0F, F0,F8,80,00,00,00,00,00,E0,70,70,20,50,80,80,E0
510 DATA 0F,1F,01,00,00,00,00,00,07,0E,0E,04,0A,01,01,07,74,B4,E6,7E,1E,3E,1C,60,68,E8,F0,28,B8,E0,F0,F0
520 DATA 10,10,18,00,01,01,01,00,00,00,00,03,00,00,00,00,00,00,10,50,D8,F0,E0,00,00,00,00,00,00,00,00,00
530 DATA 00,00,08,0A,1B,0F,07,00,00,00,00,00,00,00,00,00,08,08,18,00,80,80,80,00,00,00,00,C0,00,00,00,00
540 DATA 00,1E,5D,4B,7E,78,7C,38,06,0D,1D,0D,16,2B,38,1E,00,E0,F8,80,00,00,00,00,00,E0,F0,30,20,D4,3C,38
550 DATA 00,07,1F,01,00,00,00,00,00,07,0F,0C,04,2B,3C,1C,00,78,BA,D2,7E,1E,3E,1C,60,B0,B8,B0,68,D4,1C,78
560 DATA 00,20,20,30,00,01,01,01,00,00,00,00,00,00,00,00,00,00,00,10,50,D8,F0,E0,00,00,00,C0,C0,00,00,00
570 DATA 00,00,00,08,0A,1B,0F,07,00,00,00,03,03,00,00,00,00,04,04,0C,00,80,80,80,00,00,00,00,00,00,00,00

 

前回のプログラムに追加しています。

www.nyaonyao21.com

 

 

前回と違うのは、PUT SPRITEを下の方に移動しております。

それと時間稼ぎのFOR NEXT文を取り除きました。

 

40,90,140~240行を追加しています。

 

40 S=STICK(0):TG=STRIG(0)

TG=STRIG(0)は、

スペースキーを押したかどうかを知るための宣言です。

 

90 H2=-H2:IF JF=1 THEN H2=-1

JF=1はジャンプフラグです。

ジャンプしている時は、足を開いたスプライトを表示します。

 

140 IF X<0 THEN X=0
150 IF X>240 THEN X=240

はマイキャラのX座標の移動範囲を。X座標が、0~240まで。

端から端までです。

 

160 IF JF=1 THEN 190

JF=1はジャンプしているとき。そのときは190行へとびます。

 

170 IF TG=0 THEN 250

TG=0は、スペースキーを押していないときです。

250行へとびます。

250行はPUT SPRITEで、180~240行のジャンプ処理をまるまる飛び越えて

います。なにもしないということです。

 

180 JF=1:JY=-8:JC=6

JF=1は、ジャンプフラグです。

JY=-8は、最初にスペースキーを押したときは、Y座標を-8移動させるということ。

毎回、Y座標を、-8ドットづつしていきます。(スペースキーを押している間)

JCの説明を。

スペースキーを押している間は、-8ドットづつ上へ上がりますが、

それの上限を設けなければいけません。そうしないと永遠に上に飛んで行ってしまう

ので。そこでカウンターを入れます。

最初は6です。そこから後の行で-1づつしていきます。

160行でジャンプフラグが立っている時は、この行は飛ばされています。

 

190 IF JC=0 THEN 220

JC=0のとき、220行へ飛びます。


200 IF TG=0 THEN JC=0:GOTO 220

スペースキーが離されたら、JC=0とします。

そして1行飛ばして、220行へ。

 

210 JC=JC-1

ジャンプカウンターを-1づつしていきます。

 

220 IF JC=0 AND JY<8 THEN JY=JY+2

初期値がJC=6で、ジャンプの上限か、スペースキーを離した時に

JC=0となっていました。

JY<8となっていますが、ジャンプなので、上へ上がったら、下へも降りてこないと

いけません。その移動量の上限が+8です。

JYに2づつ足していきます。

JYは、この処理を何回か通ることで、

-8,-8,-8,-8,-8,-8,-6,-4,-2,0,2,4,6,8,8,8,8,8,8

となっていきます。

擬似的に重力加速度を意識したような動きになっています。

 

230 Y=Y+JY

Y座標に移動量を足していきます。


240 IF Y>160 THEN Y=160:JF=0

Y座標の地面がY=160となっています。

ここは、いずれゲームを作っていくときには変えていかないといけません。

 

優秀なジャンプ処理ですね。

シンプルですけど高さ調整もできるし。

今、MSX BASICをやると資料が豊富にあるので、楽に作ることができるのが

いいですね〜。

このプログラムはジャンプカウンターJCを いれるところがキモですね。

もし自分でプログラムを考えるとすると、

まず、JY=-8と初期設定し、毎回、JY=JY+2するというのはすぐわかると

思います。

そこにジャンプカウンター JC=6として、JC=0となるまでは、

JY=-8がしばらく続かせると考えていくのでしょうか。

-8,-6,-4,-2,0,2,4,6,8

-8,-8,-8,-8,-8,-8,-6,-4,-2,0,2,4,6,8,8,8,8,8,8

にしていく処理を考えます。

 

そんなところでしょうか。

次回は地面にブロックを敷き詰めたいと思います。

とりあえず、カラフルな多色刷りはやめておいて、2色のブロックにすると

思います。

それでもVRAMを弄らないといけないですからね。

そのうちカラフルな多色刷りもやりたいと思います。

 

では~。

WebMSXでBASICのゲームを作ろう!第一弾。キャラを動かすプログラムを書きました(URLクリックで実行できます)

 


WebMSXでBASICのゲームを作ろう!第一弾。

MSXマシン語は一度置いておいて、まずはBASICでゲームを作ることにします。

BASICの一部に、マシン語を使うゲームもありましたよね。

まずは、そこまで出来るようになりたいです。

そのあとはフルマシン語で作りたいですね〜。

 

WebMSXでスプライトをカーソルで動かす

BASICプログラムを作ってみました。(ポポロンくんをモデルにしました)

このURLで実行できます。

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

 
webmsx.org

 

f:id:nyaonyaokun:20180220084553p:plain

上下左右に動きます。

左右にはウォーキングのアニメーションが入ります。

ソースコードを書きます。

WebMSXの基本的な使い方はこちらへどうぞ

www.nyaonyao21.com

 

ではソースコードを、

シンプルな方のソースコードも書いておきます。

10 SCREEN1,2,0:DEFINTA-Z:KEYOFF:
WIDTH32: COLOR15,1,5
20 H2 = 1:X=128:Y=80
30 FOR J=0 TO 7:S$="":FOR I=1 TO32:READD$:S$=S$+CHR$(VAL("&H"+D$
)):NEXT:SPRITE$(J)=S$:NEXT

40 S=STICK(0)

50 IF S=3 THEN X=X+4

60 IF S=7 THEN X=X-4

70 IF S=1 THEN Y=Y-4

80 IF S=5 THEN Y=Y+4

90 PUTSPRITE 0,(X,Y),7,H

100 PUTSPRITE 1,(X,Y),11,H+2

110 FOR N=0 TO 80:NEXT
120 H2 = -H2
130 IF S=3 AND H2=1 THEN H=0
140 IF S=3 AND H2=-1 THEN H=4
150 IF S=7 AND H2=1 THEN H=1
160 IF S=7 AND H2=-1 THEN H=5
170 GOTO 40
500 DATA 2E,2D,67,7E,78,7C,38,06,16,17,0F,14,1D,07,0F,0F,

                 F0,F8,80,00,00,00,00,00,E0,70,70,20,50,80,80,E0
510 DATA 0F,1F,01,00,00,00,00,00,07,0E,0E,04,0A,01,01,07,

                 74,B4,E6,7E,1E,3E,1C,60,68,E8,F0,28,B8,E0,F0,F0
520 DATA 10,10,18,00,01,01,01,00,00,00,00,03,00,00,00,00,

                 00,00,10,50,D8,F0,E0,00,00,00,00,00,00,00,00,00
530 DATA 00,00,08,0A,1B,0F,07,00,00,00,00,00,00,00,00,00,

                 08,08,18,00,80,80,80,00,00,00,00,C0,00,00,00,00
540 DATA 00,1E,5D,4B,7E,78,7C,38,06,0D,1D,0D,16,2B,38,1E,

                 00,E0,F8,80,00,00,00,00,00,E0,F0,30,20,D4,3C,38
550 DATA 00,07,1F,01,00,00,00,00,00,07,0F,0C,04,2B,3C,1C,

                 00,78,BA,D2,7E,1E,3E,1C,60,B0,B8,B0,68,D4,1C,78
560 DATA 00,20,20,30,00,01,01,01,00,00,00,00,00,00,00,00,

                 00,00,00,10,50,D8,F0,E0,00,00,00,C0,C0,00,00,00
570 DATA 00,00,00,08,0A,1B,0F,07,00,00,00,03,03,00,00,00,

                 00,04,04,0C,00,80,80,80,00,00,00,00,00,00,00,00

  

解説:

30行はスプライトを読み込んで定義しています。(8枚)

 

40行 S=STICK(0)はカーソルキーの入力に必要な宣言

上を押すとSに1が入り、

右を押すとSに3が入り、

下を押すとSに5が入り

左を押すとSに7が入ります。

              1

              ↑         

7 ←      →3

              ↓         

              5

40 S=STICK(0)

50 IF S=3 THEN X=X+4

60 IF S=7 THEN X=X-4

70 IF S=1 THEN Y=Y-4

80 IF S=5 THEN Y=Y+4

  

90、100行は2枚のスプライトを重ねて表示しています。

PUT SPRITE<スプライト番号>,(x,y),<カラーコード>,<スプライトパターン番号>

 

90 PUTSPRITE 0,(X,Y),7,H

青い鎧の絵

100 PUTSPRITE 1,(X,Y),11,H+2

肌色の絵

 

120行は

120 H2 = -H2

歩くアニメーションをするときに、1と-1を交互に定義し使います。

H2 = -H2は、

H2が1のときは-1になり、

H2が-1のときは1となります。

 

110行は時間稼ぎです。アニメーションが早すぎるので。

110 FOR N=0 TO 80:NEXT

 

130,140,150,160行は歩きのアニメーションをするために

スプライトパターン番号を条件で変えます。

 

スプライトパターンを定義して、

表示するときにスプライトパターン番号を変えてやればアニメーションします。

(スプライトパターン:SPRITE$(番号)に定義します) 

 

SPRITE$(0) に 右向きに止まっている絵

SPRITE$(4)   に 右向きに足を一歩出している絵

を定義して、

PUT SPRITEのスプライトパターン番号を0と4を交互に入れ替えてやれば

歩くアニメーションができます。

H=0 右向きの鎧の絵

H=1 左向きの鎧の絵

H=2 右向きの肌色の絵

H=3 左向きの肌色の絵

H=4 右向きの鎧の(足を出してる)

H=5 左向きの鎧の絵(足を出してる)

H=6 右向きの肌色の絵(足を出してる)

H=7 左向きの肌色の絵(足を出してる)

 

130 IF S=3 AND H2=1 THEN H=0
140 IF S=3 AND H2=-1 THEN H=4
 S=3は右入力のときで、

①H2=1のとき、

スプライトパターン番号を0(右向きの鎧の絵)に。(H=0)

②H2=-1のとき、

スプライトパターン番号4(右向きの鎧の絵 足を出してる)に。(H=4)

 

150 IF S=7 AND H2=1 THEN H=1
160 IF S=7 AND H2=-1 THEN H=5

S=7は左入力のときで、

①H2=1のとき、

プライトパターン番号を1(左向きの鎧の絵)するために。(H=1)

②H2=-1のとき、

プライトパターン番号を5(左向きの鎧の絵 足を出してる)するために。(H=5 )

 

500行以降はDATA文です。

1行につきスプライト1枚の16進数のデータです。

500行 右向きの鎧の絵

510行 左向きの鎧の絵

520行 右向きの肌色の絵

530行 左向きの肌色の絵

540行 右向きの鎧の(足を出してる)

550行 左向きの鎧の絵(足を出してる)

560行 右向きの肌色の絵(足を出してる)

570行 左向きの肌色の絵(足を出してる)

 

スプライトの絵を描くのに便利なサイトを貼っておきますね。

TinySprite 0.4.7 - MSX Sprite Editor

 

プログラムをRUNしてから、ストップさせるのは、

Macですと、

control + F9で止まります。

 

 

 

最近、MSX FANを読んだので、面白くて、

ちょっとややこしいけど短いのを書きます。

10 SCREEN1,2,0:DEFINTA-Z:KEYOFF:
WIDTH32: COLOR15,1,5
20 H2 = 1:X=128:Y=80
30 FOR J=0 TO 7:S$="":FOR I=1 TO
32:READD$:S$=S$+CHR$(VAL("&H"+D$
)):NEXT:SPRITE$(J)=S$:NEXT
40 S=STICK(0):X=X+(S=7)*4-(S=3)*
4:Y=Y+(S=1)*4-(S=5)*4
50 FOR K=0 TO 1:PUTSPRITEK,(X,Y)
,7+4*K,H+2*K:NEXT
60 H2 = -H2
70 IF S=3  THEN H=0:IF H2=-1 THEN H=4
80 IF S=7  THEN H=1:IF H2=-1 THEN H=5

90 GOTO 40
500 DATA 2E,2D,67,7E,78,7C,38,06,16,17,0F,14,1D,07,0F,0F,

                 F0,F8,80,00,00,00,00,00,E0,70,70,20,50,80,80,E0
510 DATA 0F,1F,01,00,00,00,00,00,07,0E,0E,04,0A,01,01,07,

                 74,B4,E6,7E,1E,3E,1C,60,68,E8,F0,28,B8,E0,F0,F0
520 DATA 10,10,18,00,01,01,01,00,00,00,00,03,00,00,00,00,

                 00,00,10,50,D8,F0,E0,00,00,00,00,00,00,00,00,00
530 DATA 00,00,08,0A,1B,0F,07,00,00,00,00,00,00,00,00,00,

                 08,08,18,00,80,80,80,00,00,00,00,C0,00,00,00,00
540 DATA 00,1E,5D,4B,7E,78,7C,38,06,0D,1D,0D,16,2B,38,1E,

                 00,E0,F8,80,00,00,00,00,00,E0,F0,30,20,D4,3C,38
550 DATA 00,07,1F,01,00,00,00,00,00,07,0F,0C,04,2B,3C,1C,

                 00,78,BA,D2,7E,1E,3E,1C,60,B0,B8,B0,68,D4,1C,78
560 DATA 00,20,20,30,00,01,01,01,00,00,00,00,00,00,00,00,

                 00,00,00,10,50,D8,F0,E0,00,00,00,C0,C0,00,00,00
570 DATA 00,00,00,08,0A,1B,0F,07,00,00,00,03,03,00,00,00,

                 00,04,04,0C,00,80,80,80,00,00,00,00,00,00,00,00

 

解説:

40行 S=STICK(0)はカーソルキーの入力に必要な宣言

上を押すとSに1が入り、

右を押すとSに3が入り、

下を押すとSに5が入り

左を押すとSに7が入ります。

              1

              ↑         

7 ←      →3

              ↓         

              5

 

X=X+(S=7)*4-(S=3)*4

X座標を動かすのですが、普通は右ならX=X+1となりますが、

この一行で左右の動きをします。

( )だけで条件式になります。(これは知らなかった)

(S=7)は、S=7ならば、真(-1)となります。

(S=3)は、S=3ならば、真 (-1)。

違っていると0が入ります。

 

仮に右カーソルを押すと、

Sに3が入り、

X=X+(0)*4 -(-1)*4

となり、

X=X-4と同じです。(4ドット移動です)

 

Y=Y+(S=1)*4-(S=5)*4

は上下の移動です。

 (ただ処理が遅いとのこと。普通にIF文とかで書いた方がいいかも)

 

50行

50 FOR K=0 TO 1:PUTSPRITE K,(X,Y),7+4*K,H+2*K:NEXT

 

PUT SPRITE<スプライト番号>,(x,y),<カラーコード>,<スプライトパターン番号>

 PUTSPRITE K,(X,Y),7+4*K,H+2*K

この場合

スプライトパターン番号(このプログラムの時はH+2*Kのところです)

           が0の時、右向きの鎧の絵

スプライトパターン番号が1の時、左向きの鎧の絵

スプライトパターン番号が2の時、右向きの肌色の絵

スプライトパターン番号が3の時、左向きの肌色の絵

が定義されています。

 

右向きのときはH=0で、

PUT SPRITE 0のとき(K=0)はスプライトパターンが0

PUT SPRITE 1のとき(K=1)はスプライトパターンが2

(H+2*Kなので 0+2*1で2)

になります。

 

 面白いですね〜。

次はジャンプとかやってみたいです。

 

では〜。

 

 

WebMSXの基本的な使い方を調べてみました

 

WebMSXの使い方を少し調べてみました。

http://webmsx.org/

 

まず文字入力。

文字入力の仕方

右下の歯車をクリック。

f:id:nyaonyaokun:20180219163807p:plain

 

その中のHelp&Settingsをクリックすると、

 

f:id:nyaonyaokun:20180219163859p:plain

 

マウスカーソルを合わせると、どのキーがどの文字に対応しているか、

知ることができます。

 

MacでBASICをやろうとしているのですが、うまく文字入力が対応していない場合が

多いです。

そんな時は、

alt+ B で文字を入力できます。

f:id:nyaonyaokun:20180219164316p:plain

このテキストボックスの中に、普通に文字を入力したり、

コピペしたりして、OKをクリック。

そうすると、MSX画面の方にもその文字が入力されます!

(これを使えば、プログラム雑誌をスキャンして、OCRで文字にして、

プログラムを走らせることができます。)

 

MSX BASICのプログラムの保存の仕方

BASICの保存

左下のディスクのアイコンをクリックします。

f:id:nyaonyaokun:20180219165117p:plain

その中の、Blank 720KB Diskをクリックすると、

MSXに空のフロッピーディスクを挿入したことになります。(そういうイメージ)

その状態で、Save Disk Fileをクリックすると、

Macのフォルダにファイルが保存できます。

 

MSX BASICのプログラムを打ったら、

SAVE"sample.bas"

とでも打ち込んで、プログラムを保存しましょう。

(追記)

そして、SAVE FILE DISKをクリックしてください。

これをしないとmacのファイルには保存されないみたい。

もっといい方法があるのだろうか。よくわかりません。ごめんなさい;

 

なお読み出す時は、

Load From Filesをクリックして、ファイルを選択してから、

LOAD"sample.bas"と打ち込んでください。

 

なおこの時に、ファイル名を

AUTOEXEC.BASとすると

runと打ち込まなくても自動でプログラムが動きます。

save"AUTOEXEC.BAS"

 

(大文字しかダメのよう)

ファイルを自分のサーバーにアップロードして、URLをクリックするだけで、

ゲームを走らせる時には必要なことです。

 

とりあえず、これぐらい知っていれば、WebMSXでプログラムを

打ち込むことができそうです。

 

おまけ

webで公開されているMSXのスプライトエディタのご紹介。

TinySprite 0.4.7 - MSX Sprite Editor

 

ドットを打ち込んで、歯車のアイコンをクリックし、Codeをクリックすると

スプライトが16進数で表示されます。

1色づつ16進数で表示されるので非常に使い勝手がいいですね!

 

とりあえず、カーソルキーでスプライトを動かすことからしたいと思います。

 

 

 

 

 

 

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

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