イオ太のブログ

ゲームのこと(レトロ多め)とか、コンピュータのこととか

IchigoJam 用バッティングゲームの改造

* この記事は IchigoJam Advent Calendar 2023 に参加しています。

 


電子工作マガジン2023年秋号に私が投稿した IchigoJam 用プログラム「クリーンヒット」が掲載されました。3年ぶりの採用だったのでとても嬉しかったです。このゲームはとてもシンプルな内容なのですが、もっと入れたい仕様がいろいろあるので改造していきたいと思います。

 

ゲーム内容

まず現状の内容の確認です。これは、来た球をタイミングよく打ち返すだけの単純なバッティングゲームです。

 


www.youtube.com

 <特徴>
 ・文字や記号の組み合わせでピッチャー、バッターを表示。
 ・操作はスペースキーを押してバットを振るだけ。
 ・球はストレートのみ。速さは2種類(普通、速い)。
 ・投球モーションの速さは2種類(普通、速い)。

 

このプログラムは掲載されることを目的として作ったので、できるだけ余計な物を排除してプログラムサイズを小さくすることを心がけました。というのも、最近の電子工作マガジンはとにかく短いプログラムの方が採用されやすい傾向があるからです。

 

改造内容

ということで、いろいろやりたかったことがあるのですが、今回は以下の仕様を入れることにしました。

 

 <仕様>
 ・アニメパターンのデータ化
 ・変化球の追加(球種のデータ化)

 

アニメパターンのデータ化

選手の表示は、元のプログラムではサイズを小さくするために以下のようにしていました。変数Pは表示パターンの番号です。

 

<元のプログラム>

100 IF P=1 B=",ト'":C=" )^"
110 IF P=2 A="<O ":B=" )、":C="ノ\ "
120 IF P=3 A=" 、O":B="L/\":C=" l "
 ・
 ・
 ・
500 LC0,8:?STR$(A):LC0,9:?STR$(B):LC0,10:?STR$(C)

 

今回の改造では、選手のアニメパターンを数値データにしてメモリに置いておき、変数Pの値に応じてCOPYで必要なパターンを表示するようにします。

 

<改造後のプログラム>

800 COPY#980,#A00+P*9,3:COPY#990,#A03+P*9,3:COPY#9A0,#A06+P*9,3

 

このゲームは画面表示で VIDEO3 の拡大表示モードを使用しており、画面表示用のメモリで使ってない部分(#9C0-#BFF)があるのでそこにアニメパターンのデータを置くことにします。

 

変化球の追加(球種のデータ化)

カーブ、フォークなどいろいろな球種を投げられるようにします。なお今回は見た目だけの変更で、操作自体はタイミングを合わせて打つということに変わりはありません。将来的には、球に高低差をつけてコースによって打ち分けるなどの仕様も試してみたいと思っています。

 

球種は、軌道データと速度データの2つで決まることにします。

 

<軌道データ>

球が左から右へ移動する間の縦の座標をデータとして持ちます。以下の3種類の軌道を用意します。

 

 0. ストレート

  POKE#A40,#09,#09,#09,#09,#09,#09,#09,#09,#09,#09,#09,#09,#09


 1.  カーブ

  POKE#A50,#08,#07,#06,#05,#04,#04,#04,#05,#06,#07,#08,#09,#0A


 2. フォーク

  POKE#A60,#08,#07,#08,#07,#08,#07,#08,#07,#08,#07,#09,#0A,#09

 

<速度データ>

速度は今まで通り、WAITの値です。値が小さいほど速くなります。

 

<球種>

今回は以下の6つを用意します。軌道データと速度データによって決まります。

 

  0 ストレート(普通)
  1 カーブ(遅い)
  2 フォーク(普通)
  3 ストレート(速い)
  4 カーブ(普通)
  5 フォーク(速い)

 

なお、ゲームはいきなり全球種が出るようになっていると難しいので、だんだんと投げる球種が増えて行くようにします。最初は0番のストレート(普通)しか投げてきません。2球投げるごとに1番のカーブ(遅い)、2番のフォーク(普通)と投げる球種が増えて行きます。ただしランダムなので、すぐに出るかどうかは分かりません。

 

プログラム

データの書き込みでプログラムサイズが大きくなったので、プログラム0とプログラム1の2つに分けました。

 

 ・プログラム0 ・・・ 各種データ設定
 ・プログラム1 ・・・ ゲーム実行

 

以下が改造したプログラムとなります。プログラム0とプログラム1を保存して、プログラム0から実行します。

 

<プログラム0>

10 'C-Hit0
20 VIDEO3
30 POKE#A00,#20,#4F,#20,#20,#C4,#2C,#20,#6E,#20:POKE#A09,#20,#4F,#20,#2C,#C4,#27,#20,#29,#5E
40 POKE#A12,#3C,#4F,#20,#20,#29,#A4,#C9,#5C,#20:POKE#A1B,#20,#A4,#4F,#4C,#2F,#5C,#20,#6C,#20
50 POKE#A24,#20,#4F,#21,#20,#7C,#27,#20,#CA,#20:POKE#A2D,#20,#4F,#20,#B0,#B2,#20,#20,#D9,#20
60 POKE#A36,#20,#4F,#2F,#20,#B2,#20,#20,#D9,#20
70 POKE#A40,#09,#09,#09,#09,#09,#09,#09,#09,#09,#09,#09,#09,#09
80 POKE#A50,#08,#07,#06,#05,#04,#04,#04,#05,#06,#07,#08,#09,#0A
90 POKE#A60,#08,#07,#08,#07,#08,#07,#08,#07,#08,#07,#09,#0A,#09
100 POKE#B00,0,8,1,10,2,8,0,2,1,4,2,3
110 LRUN1

 

<プログラム1>

200 'C-Hit1
210 CLS:CLV:DRAW0,22,31,22
220 L=1
300 G=0:H=0:P=0:Q=0
310 Z=RND(L):J=#B00+Z*2:M=PEEK(J):W=PEEK(J+1)
320 IF RND(8)<6 V=20 ELSE V=5
400 GOSUB800:IF P=0 WAIT50
410 IF P<3 P=P+1:WAIT V:GOTO400 ELSE BEEP3,2
500 FOR X=3 TO 15:GOSUB900:Y=PEEK(#A40+M*16+X-3):LC X,Y:?"o";
510 IF(Q=1)&(X>12)&(X<15) H=1:X=15:BEEP9,5:S=S+1:IF L<5 L=S/2+1
520 IF H=0 WAIT W:LC X,Y:?" ";
530 NEXT:GOSUB800:IF H=0 GOTO700
600 FOR I=0 TO 6:LC13-I*2,9-I:?"o";:WAIT2:LC13-I*2,9-I:?" ";:NEXT
610 WAIT50:GOTO300
700 LC6,5:?"OUT":BEEP30,9
710 IF INKEY()=10 RUN ELSE CONT
800 COPY#980,#A00+P*9,3:COPY#990,#A03+P*9,3:COPY#9A0,#A06+P*9,3
900 IF(G=0)&(BTN(32)=1) G=1
910 IF(G=1)&(Q<2) Q=Q+1
920 COPY#98D,#A24+Q*9,3:COPY#99D,#A27+Q*9,3:COPY#9AD,#A2A+Q*9,3
950 LC0,0:?"HIT:";S:RETURN

 

とりあえず完成


www.youtube.com

急いで作ったので、変化球の軌道とか速度とか、難易度調整とか、もっといじらないとなあと思いますが、とりあえずこんな感じです。他にも入れたいものはいろいろあるので、また更新したいと思います。

 

「イチゴサーカス」更新(2023/04/04)

IchigoJam 用「イチゴサーカス」のプログラムを更新しました。オリジナルの「サーカス」に近づけるためにキャラのアニメと曲の追加をしました。プログラムは4つになり、合計4KB近くまでになってしまいました。ただ、見やすいように行を分けたり増やして書いているので、詰めればもっとメモリは空くと思います。

 

www.youtube.com

(2023/04/04)

  • キャラクターのアニメパターンを追加
  • スタート時、ボーナス時の曲を追加

 

プログラムは、IchigoJam BASIC 用(プログラム0〜3)と IchigoCake BASIC 用(プログラム0)の2種類あります。どちらも行番号と内容は同じになっています。


IchigoJam BASIC 用(Ver. 1.2.3以降)

<プログラム0>

NEW

10 'Circus-0
20 CLV
30 POKE#778,#18,#99,#7E,#18,#18,#24,#24,#66,#10,#21,#27,#7C,#7C,#24,#26,#42
50 POKE#788,#60,#23,#3E,#18,#98,#7E,#19,#00,#42,#64,#24,#3E,#3E,#E4,#84,#08
70 POKE#798,#00,#98,#7E,#19,#18,#7C,#C4,#06,#00,#19,#7E,#98,#18,#3E,#23,#60
90 POKE#7A8,#00,#99,#7E,#18,#18,#3C,#42,#C3,#00,#00,#18,#7E,#99,#3C,#24,#66
110 POKE#7B8,#00,#00,#00,#18,#7E,#99,#7E,#C3,#00,#00,#00,#00,#00,#C8,#2B,#FF
130 POKE#7E0,#00,#18,#18,#30,#3C,#10,#10,#18
140 POKE#7F0,#00,#18,#18,#0C,#3C,#08,#08,#18
150 POKE#8A0,#13,#91,#91,#14,#14,#00,#F9,#00,#00,#00,#00,#9F,#9E,#13,#13,#91
160 POKE#8B0,#00,#F9,#00,#14,#14,#91,#91,#13,#91,#13,#13,#9F,#9E,#00,#00,#00
170 POKE#8C8,19,19,19,19
180 LET[0],0,4,6,1
190 LET[4],-1,-1,-1,1,-1,1,1,1
200 LET[12],50,25,0,0,0,0,25,50
210 LET[24],100,50,20
220 LET[28],0,12,75,-200,31,12,-75,-200,0,17,100,-200,31,17,-100,-200
310 LET[44],252,251,252,251,254,253,254,253
320 LET[52],243,250,244,245,240,241,242,243
330 LET[60],239,239,239,239,239,246,247,248
350 LRUN1

SAVE0

 

<プログラム1>

NEW

400 'Circus-1
410 CLS:FOR I=0 TO 31:POKE#BE0+I,3:NEXT:LC0,0:?"SCORE ";S:LC13,0:?"JUMPS ";H
420 COPY#AA0,#8C8,4:COPY#ABC,#8C8,4:COPY#B40,#8C8,4:COPY#B5C,#8C8,4
430 LC9,8:?"Ichigo Circus":LC4,12:?"PUSH SPACE KEY OR BUTTON":GSB1700:GSB1800
440 COPY#900,#940,32:COPY#A00,#940,32:COPY#A40,#940,32:COPY#A80,#940,32
450 PLAY"T100O5F8R64F16R64F4R64F16G16F16G16A4"
460 WAIT180:H=3:K=0:L=0:N=13:S=0:LET[21],0,0,0
500 '
510 COPY#BC0,#940,32:T=30:U=-350:M=-1
520 A=RND(4)*4:X=[28+A]:Y=[29+A]:P=[30+A]:Q=[31+A]:IF X=0 Z=1 ELSE Z=2
530 E=X*100:F=Y*100:V=X:W=Y
600 '
610 FOR I=0 TO 2:IF[21+I]=0 [21+I]=8:FOR J=0 TO 7:POKE#920+I*64+J*4,#FF:NEXT:NEXT ELSE NEXT
620 LRUN2

1100 '
1110 IF H=0 A=200:LC11,8:?"GAME OVER" ELSE A=150
1120 IF[20]<S [20]=S
1130 PLAY"T120O3B8R32B8R64B16R64B8O4D8C#16R64C#8O3B16R64B8A#16B8"
1140 GSB1700:WAIT A:IF H=0 GOTO400
1150 GSB1800:COPY#A40,#940,32:GOTO500

1700 '
1710 LC5,10:?"TODAYS HIGH SCORE ";[20]
1720 RTN

1800 '
1810 IF BTN(32) [27]=1 ELSE IF BTN() [27]=2 ELSE CONT
1820 RTN

SAVE1

 

<プログラム2>

NEW

700 'Circus-2
710 'Main_Start
720 COPY#AA0,#8C8,4:COPY#ABC,#8C8,4:COPY#B40,#8C8,4:COPY#B5C,#8C8,4
730 IF(Z<3)|(Z>5) GOTO800
740 IF(X<4)|(X>27) GSB1200
750 IF X=0 P=T:Z=4 ELSE IF X=31 P=-T:Z=4
760 A=X-N:B=A-[L]:IF(Y>19)&(B>=0)&(B<=3) GSB1300
770 IF Y>=22 Y=22:F=2200:Q=0:Z=6:G=0
800 '
810 IF(K<>L)|(N<>M) COPY#BA0+M,0,8:COPY#BC0+M,0,8:COPY#BA0+N,#8A0+L*16,8:COPY#BC0+N,#8A8+L*16,8:K=L
820 IF Z>0 LCV,W:?" ";
830 O=O^1:IF O=1 FOR I=0 TO 1:A=PEEK(#920+I*128):COPY#920+I*128,#921+I*128,31:POKE#93F+I*128,A:NEXT:B=PEEK(#97F):COPY#97F,#97E,-31:POKE#960,B
840 A=0:IF SCR(X,Y)=255 A=1:P=-P:Q=-Q:B=Y/2:S=S+[24+B]:[21+B]=[21+B]-1:IF[21+B]=0 A=2
850 LRUN3

1200 '
1210 A=0
1220 IF(Y>=12)&(W<12) A=1:Y=12:F=1200:Q=-200:U=-400
1230 IF(Y>=17)&(W<17) A=1:Y=17:F=1700:Q=-200:U=-400
1240 IF A=1 Z=4:T=75:IF X<4 P=T ELSE P=-T
1250 RTN

1300 '
1310 BEEP:Z=3:X=N+[L+2]:Y=20:E=X*100:F=2000:Q=U:IF U>-450 U=U-50
1320 IF T<200 T=T+[12+A]
1330 P=T*[4+A]:K=L:L=L^1
1340 RTN

SAVE2

 

<プログラム3>

NEW

900 'Circus-3
920 G=(G+1)%4:IF(Y>17)&(Q>0) Z=5
930 IF Z=1 E=E+25:IF E=400 Z=3
940 IF Z=2 E=E-25:IF E=2800 Z=3
950 R=[40+Z*4+G]
960 IF(Z=6)&(G=3) Z=7:H=H-1
980 LC0,0:?"SCORE ";S;:LC13,0:?"JUMPS ";H;
1000 LCX,Y:?CHR$(R);:IF A=1 BEEP4,4:WAIT5 ELSE IF A=2 GSB1600:LRUN1,600
1010 IF Z=7 BEEP30,20:WAIT30:LRUN1,1100
1020 M=N:IF [27]=1 GSB1400 ELSE IF [27]=2 GSB1500
1030 IF(Z>=3)&(Z<=5) E=E+P:Q=Q+49:F=F+Q:IF F<0 F=0:Q=0
1040 IF E<0 E=0 ELSE IF E>3199 E=3100
1050 V=X:W=Y:X=E/100:Y=F/100
1060 'Main_End
1070 WAIT4:LRUN2

1400 '
1410 D=-BTN(28)+BTN(29):IF D=0 C=0 ELSE C=C+1:IF C>4 D=D*3 ELSE IF C>2 D=D*2
1420 N=N+D:IF N<0 N=0 ELSE IF N>24 N=24
1430 RTN

1500 '
1510 A=ANA(2):IF A<320 A=320 ELSE IF A>619 A=619
1520 N=(A-320)/12
1530 RTN

1600 '
1610 A=[24+B]*10:LC10,8:?"BONUS ";A:S=S+A
1620 PLAY"T120O5C16O4B16O5C16F8C16R64O4A8R64A16G#16A16O5C8O4A16R64F8A16G16F16G8R64G16R64G8A#16A16G16O5C8O4A16F4"
1630 WAIT300:COPY#A00,#940,32:COPY#920+B*64,#940,32
1640 RTN

2000 '2023/04/04

SAVE3

 


IchigoCake BASIC 用(Ver. 1.3.2以降)

<プログラム0>

NEW

10 'Circus-0
20 CLV
30 POKE#778,#18,#99,#7E,#18,#18,#24,#24,#66,#10,#21,#27,#7C,#7C,#24,#26,#42
50 POKE#788,#60,#23,#3E,#18,#98,#7E,#19,#00,#42,#64,#24,#3E,#3E,#E4,#84,#08
70 POKE#798,#00,#98,#7E,#19,#18,#7C,#C4,#06,#00,#19,#7E,#98,#18,#3E,#23,#60
90 POKE#7A8,#00,#99,#7E,#18,#18,#3C,#42,#C3,#00,#00,#18,#7E,#99,#3C,#24,#66
110 POKE#7B8,#00,#00,#00,#18,#7E,#99,#7E,#C3,#00,#00,#00,#00,#00,#C8,#2B,#FF
130 POKE #7E0,#00,#18,#18,#30,#3C,#10,#10,#18
140 POKE #7F0,#00,#18,#18,#0C,#3C,#08,#08,#18
150 POKE#8A0,#13,#91,#91,#14,#14,#00,#F9,#00,#00,#00,#00,#9F,#9E,#13,#13,#91
160 POKE#8B0,#00,#F9,#00,#14,#14,#91,#91,#13,#91,#13,#13,#9F,#9E,#00,#00,#00
170 POKE#8C8,19,19,19,19
180 LET[0],0,4,6,1
190 LET[4],-1,-1,-1,1,-1,1,1,1
200 LET[12],50,25,0,0,0,0,25,50
210 LET[24],100,50,20
220 LET[28],0,12,75,-200,31,12,-75,-200,0,17,100,-200,31,17,-100,-200
310 LET[44],252,251,252,251,254,253,254,253
320 LET[52],243,250,244,245,240,241,242,243
330 LET[60],239,239,239,239,239,246,247,248

400 '
410 CLS:FOR I=0 TO 31:POKE#BE0+I,3:NEXT:LC0,0:?"SCORE ";S:LC13,0:?"JUMPS ";H
420 COPY#AA0,#8C8,4:COPY#ABC,#8C8,4:COPY#B40,#8C8,4:COPY#B5C,#8C8,4
430 LC9,8:?"Ichigo Circus":LC4,12:?"PUSH SPACE KEY OR BUTTON":GSB1700:GSB1800
440 COPY#900,#940,32:COPY#A00,#940,32:COPY#A40,#940,32:COPY#A80,#940,32
450 PLAY"T100O5F8R64F16R64F4R64F16G16F16G16A4"
460 WAIT180:H=3:K=0:L=0:N=13:S=0:LET[21],0,0,0
500 '
510 COPY#BC0,#940,32:T=30:U=-350:M=-1
520 A=RND(4):X=[28+A*4]:Y=[29+A*4]:P=[30+A*4]:Q=[31+A*4]:IF X=0 Z=1 ELSE Z=2
530 E=X*100:F=Y*100:V=X:W=Y
600 '
610 FOR I=0 TO 2:IF[21+I]=0 [21+I]=8:FOR J=0 TO 7:POKE#920+I*64+J*4,#FF:NEXT:NEXT ELSE NEXT

700 'Main_Start
720 COPY#AA0,#8C8,4:COPY#ABC,#8C8,4:COPY#B40,#8C8,4:COPY#B5C,#8C8,4
730 IF(Z<3)|(Z>5) GOTO800
740 IF(X<4)|(X>27) GSB1200
750 IF X=0 P=T:Z=4 ELSE IF X=31 P=-T:Z=4
760 A=X-N:B=A-[L]:IF(Y>19)&(B>=0)&(B<=3) GSB1300
770 IF Y>=22 Y=22:F=2200:Q=0:Z=6:G=0
800 '
810 IF(K<>L)|(N<>M) COPY#BA0+M,0,8:COPY#BC0+M,0,8:COPY#BA0+N,#8A0+L*16,8:COPY#BC0+N,#8A8+L*16,8:K=L
820 IF Z>0 LCV,W:?" ";
830 O=O^1:IF O=1 FOR I=0 TO 1:A=PEEK(#920+I*128):COPY#920+I*128,#921+I*128,31:POKE#93F+I*128,A:NEXT:B=PEEK(#97F):COPY#97F,#97E,-31:POKE#960,B
840 A=0:IF SCR(X,Y)=255 A=1:P=-P:Q=-Q:B=Y/2:S=S+[24+B]:[21+B]=[21+B]-1:IF[21+B]=0 A=2
900 '
920 G=(G+1)%4:IF(Y>17)&(Q>0) Z=5
930 IF Z=1 E=E+25:IF E=400 Z=3
940 IF Z=2 E=E-25:IF E=2800 Z=3
950 R=[40+Z*4+G]
960 IF(Z=6)&(G=3) Z=7:H=H-1
980 LC0,0:?"SCORE ";S;:LC13,0:?"JUMPS ";H;
1000 LCX,Y:?CHR$(R);:IF A=1 BEEP4,4:WAIT5 ELSE IF A=2 GSB1600:GOTO600
1010 IF Z=7 BEEP30,20:WAIT30:GOTO1100
1020 M=N:IF [27]=1 GSB1400 ELSE IF [27]=2 GSB1500
1030 IF(Z>=3)&(Z<=5) E=E+P:Q=Q+49:F=F+Q:IF F<0 F=0:Q=0
1040 IF E<0 E=0 ELSE IF E>3199 E=3100
1050 V=X:W=Y:X=E/100:Y=F/100
1060 'Main_End
1070 WAIT4:GOTO700

1100 '
1110 IF H=0 A=200:LC11,8:?"GAME OVER" ELSE A=150
1120 IF[20]<S [20]=S
1130 PLAY"T120O3B8R32B8R64B16R64B8O4D8C#16R64C#8O3B16R64B8A#16B8"
1140 GSB1700:WAIT A:IF H=0 GOTO400
1150 GSB1800:COPY#A40,#940,32:GOTO500

1200 '
1210 A=0
1220 IF(Y>=12)&(W<12) A=1:Y=12:F=1200:Q=-200:U=-400
1230 IF(Y>=17)&(W<17) A=1:Y=17:F=1700:Q=-200:U=-400
1240 IF A=1 Z=4:T=75:IF X<4 P=T ELSE P=-T
1250 RTN

1300 '
1310 BEEP:Z=3:X=N+[L+2]:Y=20:E=X*100:F=2000:Q=U:IF U>-450 U=U-50
1320 IF T<200 T=T+[12+A]
1330 P=T*[4+A]:K=L:L=L^1
1340 RTN

1400 '
1410 D=-BTN(28)+BTN(29):IF D=0 C=0 ELSE C=C+1:IF C>4 D=D*3 ELSE IF C>2 D=D*2
1420 N=N+D:IF N<0 N=0 ELSE IF N>24 N=24
1430 RTN

1500 '
1510 A=ANA(2):IF A<320 A=320 ELSE IF A>619 A=619
1520 N=(A-320)/12
1530 RTN

1600 '
1610 A=[24+B]*10:LC10,8:?"BONUS ";A:S=S+A
1620 PLAY"T120O5C16O4B16O5C16F8C16R64O4A8R64A16G#16A16O5C8O4A16R64F8A16G16F16G8R64G16R64G8A#16A16G16O5C8O4A16F4"
1630 WAIT300:COPY#A00,#940,32:COPY#920+B*64,#940,32
1640 RTN

1700 '
1710 LC5,10:?"TODAYS HIGH SCORE ";[20]
1720 RTN

1800 '
1810 IF BTN(32) [27]=1 ELSE IF BTN() [27]=2 ELSE CONT
1820 RTN

2000 '2023/04/04

SAVE0

 

 

IchigoJam 用ゲームコントローラでの動作を確認

共立エレショップで販売している IchigoJam 用ゲームコントローラを去年12月に買いました。これは電子工作マガジン2021年冬号で紹介されていたもので、イチゴサーカスでの操作に対応しているパドルコントローラです。動作確認のためにこのキットを入手したのですが、電子工作の苦手な私はずっと手をつけずにいました。しかしこのたび、ようやく作って操作を確認しました。

 

このキットの作り方は、共立エレショップのブログで丁寧に紹介されていたので私でも迷わずに作ることができました。

eleshop.blog.jp

完成したコントローラで操作している様子がこちらです。

www.youtube.com

無事に動作が確認できました。そしてこの操作しているイチゴサーカスはすでにキャラのアニメーションを追加しているバージョンです。キャラがちっちゃくて、わかりづらいですけど・・・。やはりちゃんとしたコントローラで遊ぶと快適です。ただ、このキットはボタンとつまみの位置が自分的には左右逆の方が良かったなあと思いました。

 

 

「サーカス」のアニメーション

風船割りゲーム「サーカス」の魅力の1つは人がバタバタ動くことです。コマ数が少なくて決してきれいとは言えない動きですが、よく言えば味のあるおもしろい動きです。しかも私の人生において人型の物体が画面に出てきてアニメーションするのを 1 番最初に見たのがこのゲームなので思い入れがとても強いのです。なので IchigoJam 用「イチゴサーカス」にも人のアニメパターンを追加したいです。

 

 

Youtube に上がっている動画で確認したところ、これだけの絵がありました。目で見ただけなので正確かわかりませんが、まあ大体こんなものでしょう。左右、上下のフリップ機能があればもっと減りますけど。ちなみに、これは私が見ながらドットを打ったものなので絵も違う所があるかもしれません。

 

動きの種類には以下のものがありました。

1.  ジャンプ台を歩く

ゲームのスタート時、人が台の上を歩いてきてジャンプします。2 パターンですごくぎこちない動きです。

 

2. 空中でバタバタ

空中で飛んでいる時に、左からこのパターンの順でバタバタします。

 

3. 空中で回転

壁や台にぶつかった時や、風船に何回か当たっている時などに回転します。細かい条件はわかりません。シーソーで跳ね返した時にも人が横向きになる時があります。回転中は手足の形はこのままでバタバタ動いてはいません。

 

4. 着地

落下してきて着地直前になると、両手を上げて両足をそろえた状態になります。シーソーに乗ると、両手を腰にまっすぐ立った状態になります。

 

5. ミス

シーソーに乗れなかった時は地面の上で倒れます。全体的に粗い動きなのに、ここで 3 パターンも使っているのはちょっとこだわりを感じます。このシーンはすごく残酷な印象があったのですが、パターンが多くてゆっくり見せるからだということがわかりました。

 

以上の動きを「イチゴサーカス」に追加したいと思います。

 

なつかしのビデオゲーム「サーカス」を IchigoJam でつくる

*この記事は IchigoJam Advent Calendar 2022 に参加しています。

 

 

大昔、「サーカス(1977年・エキシディ)」というゲームがありました。シーソーで交互に人をジャンプさせて空中に浮かぶ風船を割って行くというものです。インベーダーやブロック崩しの時代を知っている方ならおなじみのゲームかと思います。このゲームを「こどもパソコン IchigoJam」でつくってみることにしました。

 

○ 概要

今回は、IchigoJam BASIC でなるべくかんたんに実現できる範囲で本家のサーカスに近づけようと思い、以下のような内容でつくることにしました。

 

 

  • ゲーム画面は IchigoJam の既存のキャラクター(以下「キャラ」と略す)を使って表示する。PCG(ユーザー定義文字)は使わない。

  • 人、シーソーなど動く物体の移動はキャラ単位でおこなう。

  • 人のサイズは、1キャラとする。アニメーションはしない。

  • 操作は、キーボード、パドルコントローラーの両対応とする。
    (パドルコントローラーは、「電子工作マガジン2021年冬号(電波新聞社)」で紹介されている IchigoJamゲームコントローラーを使用)

 

f:id:Iota_Miura:20221220160141j:image
ブレッドボードで作ったテスト用のコントローラー

  • 音は、基本BEEP音のみとするが、できれば曲も入れたい(特に、葬送行進曲)。

 

○ 完成

ということで、完成した様子がこちらです(でも本当は制作途中の動画なので、まだスコア表示がないですけど・・・)。

 

www.youtube.com

遊び方は、スペースキー(or ボタン)を押すと台に立っている人がジャンプしてゲームがスタートします。カーソルキーの左右(or コントローラーのつまみ)でシーソーが左右に移動するので、落下してくる人をシーソーで受け止めて跳ね返してください。

 

○ プログラム

プログラムは思っていたよりもかなり大きくなってしまいました。プログラム0〜2の3つで、計3KB近くあります。プログラム0から実行してください。最初にスペースキーか、ボタンを押すことで、キーボードかコントローラーのどちらかで操作できるようになります。スピードが速すぎると感じる時は、プログラム2の760行目のWAITを大きくしてください。

 

(2022/12/21)現在、まだまだテストプレイ不足のため、随時更新する可能性があります。特にコントローラーでの操作があまり試せていないのできちんと動作するか自信がありません。

 

(2022/12/21)IchigoCake BASIC 用のプログラムを追加しました。こちらはプログラム1つにまとめてあります。内容は IchigoJam 用と全く同じです。

 


IchigoJam BASIC 用(Ver.1.2.3 以降)

(2022/12/20版)

※(2023/3/20)プログラム2の670行目に余計なLC命令が入っていたのを削除

<プログラム0>

NEW

10 'CIRCUS-0
20 CLV
30 POKE#8C8,19,19,19,19
40 POKE#8A0,#13,#91,#91,#14,#14,#00,#F9,#00,#00,#00,#00,#9F,#9E,#13,#13,#91
50 POKE#8B0,#00,#F9,#00,#14,#14,#91,#91,#13,#91,#13,#13,#9F,#9E,#00,#00,#00
60 LET[0],0,4,6,1
70 LET[4],-1,-1,-1,1,-1,1,1,1
80 LET[12],50,25,0,0,0,0,25,50
90 LET[24],100,50,20
100 LET[28],3,12,75,-200,28,12,-75,-200,3,17,100,-200,28,17,-100,-200

200 '
210 CLS:FOR I=0 TO 31:POKE#BE0+I,3:NEXT:LC0,0:?"SCORE ";S:LC13,0:?"JUMPS ";H
220 COPY#AA0,#8C8,4:COPY#ABC,#8C8,4:COPY#B40,#8C8,4:COPY#B5C,#8C8,4
230 LC9,8:?"Ichigo Circus":LC4,12:?"PUSH SPACE KEY OR BUTTON":GSB1300
240 IF BTN(32) G=1 ELSE IF BTN() G=2 ELSE CONT
250 COPY#900,#880,32:COPY#A00,#880,32:COPY#A40,#880,32:COPY#A80,#880,32
260 H=3:K=0:L=0:N=13:S=0:LET[21],0,0,0

270 WAIT8:LRUN1

1200 '
1210 IF H=0 Z=3:A=200:LC11,8:?"GAME OVER" ELSE A=150
1220 IF[20]<S [20]=S
1230 PLAY"O3T120B8R32B8R64B16R64B8O4D8C#16R64C#8O3B16R64B8A#16B8"
1240 GSB1300:WAIT A:COPY#A40,#880,32
1250 IF Z=2 LRUN1 ELSE GOTO200

1300 '
1310 LC5,10:?"TODAYS HIGH SCORE ";[20]
1320 RTN

SAVE0

 

<プログラム1>

NEW

300 'CIRCUS-1
310 COPY#BC0,#880,32:Z=0:T=30:U=-350:M=-1
320 A=RND(4):X=[28+A*4]:Y=[29+A*4]:P=[30+A*4]:Q=[31+A*4]
330 E=X*100:F=Y*100:V=X:W=Y

400 '
410 FOR I=0 TO 2:IF[21+I]=0 [21+I]=8:FOR J=0 TO 7:POKE#920+I*64+J*4,#FF:NEXT:NEXT ELSE NEXT

500 'Main_Start
510 COPY#AA0,#8C8,4:COPY#ABC,#8C8,4:COPY#B40,#8C8,4:COPY#B5C,#8C8,4

520 IF(X<4)|(X>27) GSB800
530 IF X=0 P=T ELSE IF X=31 P=-T
540 A=X-N:B=A-[L]:IF(Y>19)&(B>=0)&(B<=3) GSB900
550 IF Y>=22 Y=22:Z=2:H=H-1:Q=0:BEEP30,20
560 IF(K<>L)|(N<>M) COPY#BA0+M,0,8:COPY#BC0+M,0,8:COPY#BA0+N,#8A0+L*16,8:COPY#BC0+N,#8A8+L*16,8:K=L

570 LRUN2

800 '
810 A=0
820 IF(Y>=12)&(W<12) A=1:Y=12:F=1200:Q=-200:U=-400
830 IF(Y>=17)&(W<17) A=1:Y=17:F=1700:Q=-200:U=-400
840 IF A=1 T=75:IF X<4 P=T ELSE P=-T
850 RTN

900 '
910 BEEP:X=N+[L+2]:Y=20:E=X*100:F=2000:Q=U:IF U>-450 U=U-50
920 IF T<200 T=T+[12+A]
930 P=T*[4+A]:K=L:L=L^1
940 RTN

SAVE1

 

<プログラム2>

NEW

600 'CIRCUS-2
610 IF Z>0 LCV,W:?" ";
620 O=O^1:IF O=1 FOR I=0 TO 1:A=PEEK(#920+I*128):COPY#920+I*128,#921+I*128,31:POKE#93F+I*128,A:NEXT:B=PEEK(#97F):COPY#97F,#97E,-31:POKE#960,B

630 A=0:IF SCR(X,Y)=255 A=1:P=-P:Q=-Q:B=Y/2:S=S+[24+B]:[21+B]=[21+B]-1:IF[21+B]=0 A=2
640 LC0,0:?"SCORE ";S;:LC13,0:?"JUMPS ";H;
650 IF P>0 R=251 ELSE R=253
660 LCX,Y:?CHR$(R);:IF A=1 BEEP4,4:WAIT5 ELSE IF A=2 GSB1400:LC0,-1:LRUN1,400

670 IF Z=2 WAIT30:LRUN0,1200

700 M=N:IF G=1 GSB1000 ELSE IF G=2 GSB1100
710 IF Z=0 IF(BTN(32))|(BTN()) Z=1

720 IF Z=1 E=E+P:Q=Q+49:F=F+Q:IF F<0 F=0:Q=0
730 IF E<0 E=0 ELSE IF E>3199 E=3100
740 V=X:W=Y:X=E/100:Y=F/100

750 'Main_End
760 WAIT4:LRUN1,500

1000 '
1010 D=-BTN(28)+BTN(29):IF D=0 C=0 ELSE C=C+1:IF C>4 D=D*3 ELSE IF C>2 D=D*2
1020 N=N+D:IF N<0 N=0 ELSE IF N>24 N=24
1030 RTN

1100 '
1110 A=ANA(2):IF A<320 A=320 ELSE IF A>619 A=619
1120 N=(A-320)/12
1130 RTN

1400 '
1410 A=[24+B]*10:LC10,8:?"BONUS ";A:S=S+A
1420 BEEP3,20:WAIT100:COPY#A00,#880,32:COPY#920+B*64,#880,32
1430 RTN

SAVE2

 


IchigoCake BASIC 用(Ver.1.3.2以降)

(2022/12/21版)

 

<プログラム>

10 'CIRCUS
20 CLV
30 POKE#8C8,19,19,19,19
40 POKE#8A0,#13,#91,#91,#14,#14,#00,#F9,#00,#00,#00,#00,#9F,#9E,#13,#13,#91
50 POKE#8B0,#00,#F9,#00,#14,#14,#91,#91,#13,#91,#13,#13,#9F,#9E,#00,#00,#00
60 LET[0],0,4,6,1
70 LET[4],-1,-1,-1,1,-1,1,1,1
80 LET[12],50,25,0,0,0,0,25,50
90 LET[24],100,50,20
100 LET[28],3,12,75,-200,28,12,-75,-200,3,17,100,-200,28,17,-100,-200

200 '
210 CLS:FOR I=0 TO 31:POKE#BE0+I,3:NEXT:LC0,0:?"SCORE ";S:LC13,0:?"JUMPS ";H
220 COPY#AA0,#8C8,4:COPY#ABC,#8C8,4:COPY#B40,#8C8,4:COPY#B5C,#8C8,4
230 LC9,8:?"Ichigo Circus":LC4,12:?"PUSH SPACE KEY OR BUTTON":GSB1300
240 IF BTN(32) G=1 ELSE IF BTN() G=2 ELSE CONT
250 COPY#900,#880,32:COPY#A00,#880,32:COPY#A40,#880,32:COPY#A80,#880,32
260 H=3:K=0:L=0:N=13:S=0:LET[21],0,0,0
270 WAIT8

300 '
310 COPY#BC0,#880,32:Z=0:T=30:U=-350:M=-1
320 A=RND(4):X=[28+A*4]:Y=[29+A*4]:P=[30+A*4]:Q=[31+A*4]
330 E=X*100:F=Y*100:V=X:W=Y

400 '
410 FOR I=0 TO 2:IF[21+I]=0 [21+I]=8:FOR J=0 TO 7:POKE#920+I*64+J*4,#FF:NEXT:NEXT ELSE NEXT

500 'Main_Start
510 COPY#AA0,#8C8,4:COPY#ABC,#8C8,4:COPY#B40,#8C8,4:COPY#B5C,#8C8,4

520 IF(X<4)|(X>27) GSB800
530 IF X=0 P=T ELSE IF X=31 P=-T
540 A=X-N:B=A-[L]:IF(Y>19)&(B>=0)&(B<=3) GSB900
550 IF Y>=22 Y=22:Z=2:H=H-1:Q=0:BEEP30,20
560 IF(K<>L)|(N<>M) COPY#BA0+M,0,8:COPY#BC0+M,0,8:COPY#BA0+N,#8A0+L*16,8:COPY#BC0+N,#8A8+L*16,8:K=L

610 IF Z>0 LCV,W:?" ";
620 O=O^1:IF O=1 FOR I=0 TO 1:A=PEEK(#920+I*128):COPY#920+I*128,#921+I*128,31:POKE#93F+I*128,A:NEXT:B=PEEK(#97F):COPY#97F,#97E,-31:POKE#960,B

630 A=0:IF SCR(X,Y)=255 A=1:P=-P:Q=-Q:B=Y/2:S=S+[24+B]:[21+B]=[21+B]-1:IF[21+B]=0 A=2
640 LC0,0:?"SCORE ";S;:LC13,0:?"JUMPS ";H;
650 IF P>0 R=251 ELSE R=253
660 LCX,Y:?CHR$(R);:IF A=1 BEEP4,4:WAIT5 ELSE IF A=2 GSB1400:GOTO400

670 IF Z=2 WAIT30:GOTO1200

700 M=N:IF G=1 GSB1000 ELSE IF G=2 GSB1100
710 IF Z=0 IF(BTN(32))|(BTN()) Z=1

720 IF Z=1 E=E+P:Q=Q+49:F=F+Q:IF F<0 F=0:Q=0
730 IF E<0 E=0 ELSE IF E>3199 E=3100
740 V=X:W=Y:X=E/100:Y=F/100

750 'Main_End
760 WAIT4:GOTO500

800 '
810 A=0
820 IF(Y>=12)&(W<12) A=1:Y=12:F=1200:Q=-200:U=-400
830 IF(Y>=17)&(W<17) A=1:Y=17:F=1700:Q=-200:U=-400
840 IF A=1 T=75:IF X<4 P=T ELSE P=-T
850 RTN

900 '
910 BEEP:X=N+[L+2]:Y=20:E=X*100:F=2000:Q=U:IF U>-450 U=U-50
920 IF T<200 T=T+[12+A]
930 P=T*[4+A]:K=L:L=L^1
940 RTN

1000 '
1010 D=-BTN(28)+BTN(29):IF D=0 C=0 ELSE C=C+1:IF C>4 D=D*3 ELSE IF C>2 D=D*2
1020 N=N+D:IF N<0 N=0 ELSE IF N>24 N=24
1030 RTN

1100 '
1110 A=ANA(2):IF A<320 A=320 ELSE IF A>619 A=619
1120 N=(A-320)/12
1130 RTN

1200 '
1210 IF H=0 Z=3:A=200:LC11,8:?"GAME OVER" ELSE A=150
1220 IF[20]<S [20]=S
1230 PLAY"O3T120B8R32B8R64B16R64B8O4D8C#16R64C#8O3B16R64B8A#16B8"
1240 GSB1300:WAIT A:COPY#A40,#880,32
1250 IF Z=2 GOTO300 ELSE GOTO200

1300 '
1310 LC5,10:?"TODAYS HIGH SCORE ";[20]
1320 RTN

1400 '
1410 A=[24+B]*10:LC10,8:?"BONUS ";A:S=S+A
1420 BEEP3,20:WAIT100:COPY#A00,#880,32:COPY#920+B*64,#880,32
1430 RTN