プチコン講座


初心者の方へ

プチコン3号とは、ニンテンドー3DSで動作するソフトウエアで、BASICというプログラム言語を使って自分でプログラミングをしてゲームやアプリを作ることができます。
プチコンやプログラムに関して、全く知らない初心者の方は
公式サイトのプチコン初心者講座が一番丁寧でわかりやすいです
プチコン3号 SMILEBASIC講座

また、ここではゲームプログラムを作成するにあたっての、
基礎的な知識を、極力難しいことを考えずに伝えたいと考えております。
プチコン4の方はこちらの同じ内容のプチコン4講座へ

アクションゲームを作るまでプチコン(第2回)(3号版)

ここでは、プチコンで簡単なアクションゲームを作る方法を、細かく丁寧に極力わかりやすく解説していきたいと思います。

青文字が前回から追加された、内容になっています。

今回は2回目なので、第1回目のプログラムを元に解説していきます。
どんなゲームかというと、右から出現してくる敵をジャンプで交わすだけの単純なゲームです。

ですが、ゲームプログラムに重要な、当たり判定配列によるループ処理が使用されているため、プログラムを作る上での基礎とも言えます。

敵の表示

  1. ’--------------
  2. ’アクションゲームのサンプル
  3. ’   Version:0
  4. ’   ゲームないようとか
  5. ’   2014/12/15
  6. ’--------------
  7. ACLS
  8. ’プレイヤー
  9. SPSET 0,616
  10. SPANIM 0,3,8,617,8,616,0
  11. X=128   ’Xざひょう
  12. Y=64    ’Yざひょう
  13. A=0     ’ジャンプかそく
  14. JP=1    ’0:ちゃくち
  15.         ’1:じょうしょう
  16.         ’2:らっか
  17. ’てき
  18. EX=-100   ’X ざひょう
  19. EY=176    ’Y ざひょう
  20. ES=1      ’スピード
  21. SPSET 1,1006
  22. SPANIM 1,3,8、1007,8,1006,0
  23. SPOFS 1,-16,-16
  24. ’はいけい と じめん
  25. GCLS RGB(0,128,255)
  26. GFILL 0,192,399,239,RGB(160,128,96)
  27. ’------------------------------
  28. WHILE TRUE
  29. ’------------------------------
  30.  ’ボタンそうさ
  31.  B=BUTTON()
  32.  ’よこいどう
  33.  IF B AND 4 THEN X=X-1
  34.  IF B AND 8 THEN X=X+1
  35.  ’ジャンプ
  36.  IF(B AND 16)&&(JP==0)THEN JP=1:A=-3:BEEP 8
  37.  IF((B AND 16)==0)&&(JP==1)THEN JP=2:A=A/2
  38.  ’らっか
  39.  A=A+0.1
  40.  IF A>0 THEN JP=2
  41.  Y=Y+A
  42.  ’ちゃくち
  43.  IF(Y>176)&&(B AND 16)==0 THEN JP=0
  44.  IF Y>176 THEN Y=176:A=0
  45.  ’がめんからでないように
  46.  IF X<0 THEN X=0
  47.  IF X>383 THEN X=383
  48.  ’プレイヤーひょうじ
  49.  SPOFS 0,X,Y
  50.  ’てきのしょり
  51.  ’てきをつくる
  52.  IF EX==-100 THEN
  53.   ES=1+RND(6)
  54.   EX=399+RND(255)
  55.  ENDIF
  56.  ’てきのいどう
  57.  EX=EX-ES
  58.  ’がめんからでたら、じゅんび
  59.  IF EX<-16 THEN EX=-100
  60.  ’てきのひょうじ
  61.  SPOFS 1,EX,EY
  62.  VSYNC 1
  63. WEND

これで、1体の敵が画面の右から登場し、左方向に横移動し左端に来たら消える。 そして、また画面の右から出てくる。これを繰り返す。
20行目で、-100を入れているが、このプログラムでは敵が出現していないということを表す。
72行目で、-16になったら、-100を設定している。要するに横移動だけでは、-100にはならない。
64行目で、敵を出現させるときに、ランダムで画面端から更に離れた場所に出現させていて、
65行目で、敵の速さをランダムに設定しているところがポイント。
「1+ランダムな数字」としているのは、ランダム関数では0という値になることがあるため、そうなったら移動0で静止してしまうのを防ぐため。
ちなみに、@EMVというラベルは"EnemyMove:敵の移動"という意味を込めて
これで、敵が出現するようになってきた。 ようやく、ゲームらしくなってきた?

敵の当たり判定

  1. ’--------------
  2. ’アクションゲームのサンプル
  3. ’   Version:0
  4. ’   ゲームないようとか
  5. ’   2014/12/15
  6. ’--------------
  7. ACLS
  8. ’プレイヤー
  9. SPSET 0,616
  10. SPANIM 0,3,8,617,8,616,0
  11. X=128   ’Xざひょう
  12. Y=64    ’Yざひょう
  13. A=0     ’ジャンプかそく
  14. JP=1    ’0:ちゃくち
  15.         ’1:じょうしょう
  16.         ’2:らっか
  17. ’てき
  18. EX=-100   ’X ざひょう
  19. EY=176    ’Y ざひょう
  20. ES=1      ’スピード
  21. SPSET 1,1006
  22. SPANIM 1,3,8、1007,8,1006,0
  23. SPOFS 1,-16,-16
  24. ’ステータス
  25. GOV=0        ’ゲームオーバーなら1
  26. ’はいけい と じめん
  27. GCLS RGB(0,128,255)
  28. GFILL 0,192,399,239,RGB(160,128,96)
  29. ’------------------------------
  30. WHILE TRUE
  31. ’------------------------------
  32.  ’ボタンそうさ
  33.  B=BUTTON()
  34.  ’よこいどう
  35.  IF B AND 4 THEN X=X-1
  36.  IF B AND 8 THEN X=X+1
  37.  ’ジャンプ
  38.  IF(B AND 16)&&(JP==0)THEN JP=1:A=-3:BEEP 8
  39.  IF((B AND 16)==0)&&(JP==1)THEN JP=2:A=A/2
  40.  ’らっか
  41.  A=A+0.1
  42.  IF A>0 THEN JP=2
  43.  Y=Y+A
  44.  ’ちゃくち
  45.  IF(Y>176)&&(B AND 16)==0 THEN JP=0
  46.  IF Y>176 THEN Y=176:A=0
  47.  ’がめんからでないように
  48.  IF X<0 THEN X=0
  49.  IF X>383 THEN X=383
  50.  ’プレイヤーひょうじ
  51.  SPOFS 0,X,Y
  52.  ’てきのしょり
  53.  ’てきをつくる
  54.  IF EX==-100 THEN
  55.   ES=1+RND(6)
  56.   EX=399+RND(255)
  57.  ENDIF
  58.  ’てきのいどう
  59.  EX=EX-ES
  60.  ’がめんからでたら、じゅんび
  61.  IF EX<-16 THEN EX=-100
  62.  ’てきのひょうじ
  63.  SPOFS 1,EX,EY
  64.  ’あたりはんてい
  65.  IF X+8<EX-2  THEN @NOHIT
  66.  IF X+8>EX+18 THEN @NOHIT
  67.  IF Y+8<EY-4  THEN @NOHIT
  68.  IF Y+8>EY+12 THEN @NOHIT
  69.   GOV=1
  70.  @NOHIT
  71.  IF GOV==1 THEN @GOVER
  72.  VSYNC 1
  73. WEND
  74. ’---------
  75. ’ゲームオーバー
  76. ’---------
  77. @GOVER
  78.  BEEP 15
  79. END

敵が出現しても、自分にぶつかったかどうかを判定(通称:当たり判定)しなければゲームとして成り立たない。 当たり判定の仕方はいろいろあるけど、ここでは自分の中心の点が、敵の範囲(四角)の中に入っているかで判定する。 敵の当たりの範囲を敵の絵より大きくしたりすることで、4つの条件だけで、ぶつかっているか判定ができる。 ぶつかっていたら、4つの条件に一致しなかったら。ゲームオーバーになるようにする。

点数を表示させる

  1. ’--------------
  2. ’アクションゲームのサンプル
  3. ’   Version:0
  4. ’   ゲームないようとか
  5. ’   2014/12/15
  6. ’--------------
  7. ACLS
  8. ’プレイヤー
  9. SPSET 0,616
  10. SPANIM 0,3,8,617,8,616,0
  11. X=128   ’Xざひょう
  12. Y=64    ’Yざひょう
  13. A=0     ’ジャンプかそく
  14. JP=1    ’0:ちゃくち
  15.         ’1:じょうしょう
  16.         ’2:らっか
  17. ’てき
  18. EX=-100   ’X ざひょう
  19. EY=176    ’Y ざひょう
  20. ES=1      ’スピード
  21. SPSET 1,1006
  22. SPANIM 1,3,8、1007,8,1006,0
  23. SPOFS 1,-16,-16
  24. ’ステータス
  25. GOV=0     ’ゲームオーバーなら1
  26. CNT=0     ’タイム カウンタ
  27. ’はいけい と じめん
  28. GCLS RGB(0,128,255)
  29. GFILL 0,192,399,239,RGB(160,128,96)
  30. ’------------------------------
  31. WHILE TRUE
  32. ’------------------------------
  33.  ’ボタンそうさ
  34.  B=BUTTON()
  35.  ’よこいどう
  36.  IF B AND 4 THEN X=X-1
  37.  IF B AND 8 THEN X=X+1
  38.  ’ジャンプ
  39.  IF(B AND 16)&&(JP==0)THEN JP=1:A=-3:BEEP 8
  40.  IF((B AND 16)==0)&&(JP==1)THEN JP=2:A=A/2
  41.  ’らっか
  42.  A=A+0.1
  43.  IF A>0 THEN JP=2
  44.  Y=Y+A
  45.  ’ちゃくち
  46.  IF(Y>176)&&(B AND 16)==0 THEN JP=0
  47.  IF Y>176 THEN Y=176:A=0
  48.  ’がめんからでないように
  49.  IF X<0 THEN X=0
  50.  IF X>383 THEN X=383
  51.  ’プレイヤーひょうじ
  52.  SPOFS 0,X,Y
  53.  ’てきのしょり
  54.  ’てきをつくる
  55.  IF EX==-100 THEN
  56.   ES=1+RND(6)
  57.   EX=399+RND(255)
  58.  ENDIF
  59.  ’てきのいどう
  60.  EX=EX-ES
  61.   ’がめんからでたら、じゅんび
  62.  IF EX<-16 THEN EX=-100
  63.  ’てきのひょうじ
  64.  SPOFS 1,EX,EY
  65.  ’あたりはんてい
  66.  IF X+8<EX-2  THEN @NOHIT
  67.  IF X+8>EX+18 THEN @NOHIT
  68.  IF Y+8<EY-4  THEN @NOHIT
  69.  IF Y+8>EY+12 THEN @NOHIT
  70.   GOV=1
  71.  @NOHIT
  72.  ’スコアひょうじ
  73.  CNT=CNT+1
  74.  LOCATE 0,0
  75.  PRINT FLOOR(CNT/60)
  76.  IF GOV==1 THEN @GOVER
  77.  VSYNC 1
  78. WEND
  79. ’---------
  80. ’ゲームオーバー
  81. ’---------
  82. @GOVER
  83.  BEEP 15
  84. END

ゲームでは点数が大事。
ここでは、メインループの回数をカウントしている。
で、画面に表示するのは秒数になる。プチコンではVSYNC 1を指定することで60分の1秒に1回メインループが実行されるため。
これで、一応遊べるけど、簡単すぎて面白く無いね。

敵をたくさん表示させる

  1. ’--------------
  2. ’アクションゲームのサンプル
  3. ’   Version:0
  4. ’   ゲームないようとか
  5. ’   2014/12/15
  6. ’--------------
  7. ACLS
  8. ’プレイヤー
  9. SPSET 0,616
  10. SPANIM 0,3,8,617,8,616,0
  11. X=128   ’Xざひょう
  12. Y=64    ’Yざひょう
  13. A=0     ’ジャンプかそく
  14. JP=1    ’0:ちゃくち
  15.         ’1:じょうしょう
  16.         ’2:らっか
  17. ’てき
  18. DIM EX[8]
  19. DIM EY[8]
  20. DIM ES[8]
  21. FOR I=0 TO 7
  22.  EX[I]=-100   ’X ざひょう
  23.  EY[I]=144    ’Y ざひょう
  24.  ES[I]=1      ’スピード
  25.  SPSET 1+I,1006
  26.  SPANIM 1+I,3,8、1007,8,1006,0
  27.  SPOFS 1+I,-16,-16
  28. NEXT
  29. ’ステータス
  30. GOV=0     ’ゲームオーバーなら1
  31. CNT=0     ’タイム カウンタ
  32. EMX=0     ’てきのさいだいすう
  33. ’はいけい と じめん
  34. GCLS RGB(0,128,255)
  35. GFILL 0,192,399,239,RGB(160,128,96)
  36. ’おんがくをならす
  37. BGMPLAY 1
  38. ’------------------------------
  39. WHILE TRUE
  40. ’------------------------------
  41.  ’ボタンそうさ
  42.  B=BUTTON()
  43.  ’よこいどう
  44.  IF B AND 4 THEN X=X-1
  45.  IF B AND 8 THEN X=X+1
  46.  ’ジャンプ
  47.  IF(B AND 16)&&(JP==0)THEN JP=1:A=-3:BEEP 8
  48.  IF((B AND 16)==0)&&(JP==1)THEN JP=2:A=A/2
  49.  ’らっか
  50.  A=A+0.1
  51.  IF A>0 THEN JP=2
  52.  Y=Y+A
  53.  ’ちゃくち
  54.  IF(Y>176)&&(B AND 16)==0 THEN JP=0
  55.  IF Y>176 THEN Y=176:A=0
  56.  ’がめんからでないように
  57.  IF X<0 THEN X=0
  58.  IF X>383 THEN X=383
  59.  ’プレイヤーひょうじ
  60.  SPOFS 0,X,Y
  61.  ’てきのしょり
  62.  EMX=FLOOR(CNT/500)
  63.  IF EMX>7 THEN EMX=7
  64.  FOR I=0 TO EMX
  65.   ’てきをつくる
  66.   IF EX[I]==-100 THEN
  67.    ES[I]=1+RND(6)
  68.    EX[I]=399+RND(255)
  69.   ENDIF
  70.   ’てきのいどう
  71.   EX[I]=EX[I]-ES[I]
  72.   ’がめんからでたら、じゅんび
  73.   IF EX[I]<-16 THEN EX[I]=-100
  74.   ’てきのひょうじ
  75.   SPOFS 1+I,EX[I],EY[I]
  76.   ’あたりはんてい
  77.   IF X+8<EX[I]-2  THEN @NOHIT
  78.   IF X+8>EX[I]+18 THEN @NOHIT
  79.   IF Y+8<EY[I]-4  THEN @NOHIT
  80.   IF Y+8>EY[I]+12 THEN @NOHIT
  81.    GOV=1
  82.   @NOHIT
  83.  NEXT
  84.  ’スコアひょうじ
  85.  CNT=CNT+1
  86.  LOCATE 0,0
  87.  PRINT FLOOR(CNT/60)
  88.  IF GOV==1 THEN @GOVER
  89.  VSYNC 1
  90. WEND
  91. ’---------
  92. ’ゲームオーバー
  93. ’---------
  94. @GOVER
  95.  BGMSTOP
  96.  SPCHR 0,632
  97.  BEEP 15
  98.  WAIT 60
  99.  BGMPLAY 6
  100.  LOCATE 9,9
  101.  PRINT ”GAME OVER”
  102. END

敵が一体だけでは、つまらないので、たくさん表示させるようにする。
ポイントは敵の変数を配列変数にしてループ(繰り返し命令)で処理させる。
73行目あたりでは、カウントしている経過時間を元に、敵の出現数を制御する。 こうすることで、はじめは敵が少なく簡単だけど、だんだん難しくなるようにできる。 ついでに、BGMを鳴らす処理と、ゲームオーバー時の演出を少し豪華にしてみる。

いかがでしょうか、こんな感じで一応遊べるゲームを作ってみました。
ゲーム好きな方には、クソゲーとか、単純すぎてつまらないと思うかもしれません。
ですが、このプログラムをいろいろ改造することよって、敵のパータンを複雑にしたり。
敵の動きを面白くしたりと、改良方法は無限大です。
自由にいろいろなことを出来ることがプログラミングの魅力であり、面白さでもあります。

今回は、少しずつプログラムを追加して動かしながら、だんだんとゲームらしくなっていく様子を伝えてみたかったので、このような単純なゲームになっています。

インターネットの世界にはプチコンやゲームのプログラムを公開している人がたくさんいます。
そういったプログラムを参考にすることで、高度なプログラムを少しずつ身に着けていくことができるでしょう。


追伸:ソースコード記述の誤りを指摘していただいた方、ありがとうございます。 (2021/07/30)



数学=計算ではない!原理や構造の理解を大切にすると、数学はもっとおもしろくなる!数学は永遠性を秘めている。数学だけが人間の唯一の証ではないかという感動が湧いてくる—。




inserted by FC2 system