プチコン講座


初心者の方へ

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

また、ここではゲームプログラムを作成するにあたっての、
基礎的な知識を、極力難しいことを考えずに伝えたいと考えております。

アクションゲームを作るまで(第2回)

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

某ネットの掲示板にて、別のプログラム言語によるゲームプログラムの作り方を解説しているスレを最近見かけました。
掲示板の読者の状況からみて、普通の人は難しすぎてついてこれていなさそうでした。
プチコンならもっと分かりやすくプログラミングについて解説できるのではないかと思ったので、アクションゲームの基本であるプレイヤーの操作を実装するところまで、某掲示板の記事っぽく解説してみたいと思います。

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

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

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

敵の表示

  1. CLEAR:ACLS
  2. ’プレイヤー
  3. SPSET 0,64,0,0,0,0
  4. SPANIM 0,4,8
  5. X=128   ’ザヒョウ X
  6. Y=64    ’ザヒョウ Y
  7. A=0     ’カソク
  8. JP=1    ’0:チャクチ
  9.         ’1:ジョウショウ
  10.         ’2:ラッカ
  11. ’テキ
  12. EX=-100   ’ザヒョウ X
  13. EY=144    ’ザヒョウ Y
  14. ES=1      ’スピード
  15. SPSET 1,132,0,0,0,0
  16. SPANIM 1,2,8
  17. SPOFS 1,-16,-16
  18. ’ハイケイ
  19. GCLS 6
  20. GFILL 0,160,255,191,8
  21. ’------------┐
  22. @MAIN
  23. ’------------┘
  24.  ’ボタンソウサ
  25.  B=BUTTON()
  26.  ’ヨコイドウ(←→ボタン)
  27.  IF B AND 4 THEN X=X-1
  28.  IF B AND 8 THEN X=X+1
  29.  ’ジャンプ(Aボタン)
  30.  IF((B AND 16)!=0)AND(JP==0)THEN JP=1:A=-3:BEEP 8
  31.  IF ((B AND 16)==0)AND(JP==1) THEN JP=2:A=A/2
  32.  ’ラッカ
  33.  A=A+0.1
  34.  IF A>0 THEN JP=2
  35.  Y=Y+A
  36.  ’チャクチ
  37.  IF(Y>144)AND((B AND 16)==0)THEN JP=0
  38.  IF Y>144 THEN Y=144:A=0
  39.  ’ガメン カラ デナイヨウニ
  40.  IF X<0 THEN X=0
  41.  IF X>239 THEN X=239
  42.  ’テキ ノ ショリ
  43.  IF EX!=-100 THEN @EMV
  44.   ’テキ ツクル
  45.   ES=1+RND(6)
  46.   EX=255+RND(255)
  47.  ’テキ イドウ
  48.  @EMV
  49.   EX=EX-ES
  50.   ’テキ キエル
  51.  IF EX<-16 THEN EX=-100
  52.  ’テキ ヒョウジ
  53.  SPOFS 1,EX,EY
  54.  ’プレイヤー ヒョウジ
  55.  SPOFS 0,X,Y
  56.  VSYNC 1
  57. GOTO @MAIN

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

敵の当たり判定

  1. CLEAR:ACLS
  2. ’プレイヤー
  3. SPSET 0,64,0,0,0,0
  4. SPANIM 0,4,8
  5. X=128   ’ザヒョウ X
  6. Y=64    ’ザヒョウ Y
  7. A=0     ’カソク
  8. JP=1    ’0:チャクチ
  9.         ’1:ジョウショウ
  10.         ’2:ラッカ
  11. ’テキ
  12. EX=-100   ’ザヒョウ X
  13. EY=144    ’ザヒョウ Y
  14. ES=1      ’スピード
  15. SPSET 1,132,0,0,0,0
  16. SPANIM 1,2,8
  17. SPOFS 1,-16,-16
  18. ’ハイケイ
  19. GCLS 6
  20. GFILL 0,160,255,191,8
  21. ’------------┐
  22. @MAIN
  23. ’------------┘
  24.  ’ボタンソウサ
  25.  B=BUTTON()
  26.  ’ヨコイドウ(←→ボタン)
  27.  IF B AND 4 THEN X=X-1
  28.  IF B AND 8 THEN X=X+1
  29.  ’ジャンプ(Aボタン)
  30.  IF((B AND 16)!=0)AND(JP==0)THEN JP=1:A=-3:BEEP 8
  31.  IF ((B AND 16)==0)AND(JP==1) THEN JP=2:A=A/2
  32.  ’ラッカ
  33.  A=A+0.1
  34.  IF A>0 THEN JP=2
  35.  Y=Y+A
  36.  ’チャクチ
  37.  IF(Y>144)AND((B AND 16)==0)THEN JP=0
  38.  IF Y>144 THEN Y=144:A=0
  39.  ’ガメン カラ デナイヨウニ
  40.  IF X<0 THEN X=0
  41.  IF X>239 THEN X=239
  42.  ’テキ ノ ショリ
  43.  IF EX!=-100 THEN @EMV
  44.   ’テキ ツクル
  45.   ES=1+RND(6)
  46.   EX=255+RND(255)
  47.  ’テキ イドウ
  48.  @EMV
  49.   EX=EX-ES
  50.   ’テキ キエル
  51.  IF EX<-16 THEN EX=-100
  52.  ’テキ ヒョウジ
  53.  SPOFS 1,EX,EY
  54.  ’テキ ト ジブン アタリハンテイ
  55.  IF X+8<EX-2  THEN @NOHIT
  56.  IF X+8>EX+18 THEN @NOHIT
  57.  IF Y+8<EY-4  THEN @NOHIT
  58.  IF Y+8>EY+12 THEN @NOHIT
  59.   GOTO @GOVER
  60.  @NOHIT
  61.  ’プレイヤー ヒョウジ
  62.  SPOFS 0,X,Y
  63.  VSYNC 1
  64. GOTO @MAIN
  65. ’ゲームオーバー
  66. @GOVER
  67.  BEEP 15
  68. END

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

点数を表示させる

  1. CLEAR:ACLS
  2. ’プレイヤー
  3. SPSET 0,64,0,0,0,0
  4. SPANIM 0,4,8
  5. X=128   ’ザヒョウ X
  6. Y=64    ’ザヒョウ Y
  7. A=0     ’カソク
  8. JP=1    ’0:チャクチ
  9.         ’1:ジョウショウ
  10.         ’2:ラッカ
  11. ’テキ
  12. EX=-100   ’ザヒョウ X
  13. EY=144    ’ザヒョウ Y
  14. ES=1      ’スピード
  15. SPSET 1,132,0,0,0,0
  16. SPANIM 1,2,8
  17. SPOFS 1,-16,-16
  18. ’ステータス
  19. CNT=0     ’タイム カウンタ
  20. ’ハイケイ
  21. GCLS 6
  22. GFILL 0,160,255,191,8
  23. ’------------┐
  24. @MAIN
  25. ’------------┘
  26.  ’ボタンソウサ
  27.  B=BUTTON()
  28.  ’ヨコイドウ(←→ボタン)
  29.  IF B AND 4 THEN X=X-1
  30.  IF B AND 8 THEN X=X+1
  31.  ’ジャンプ(Aボタン)
  32.  IF((B AND 16)!=0)AND(JP==0)THEN JP=1:A=-3:BEEP 8
  33.  IF ((B AND 16)==0)AND(JP==1) THEN JP=2:A=A/2
  34.  ’ラッカ
  35.  A=A+0.1
  36.  IF A>0 THEN JP=2
  37.  Y=Y+A
  38.  ’チャクチ
  39.  IF(Y>144)AND((B AND 16)==0)THEN JP=0
  40.  IF Y>144 THEN Y=144:A=0
  41.  ’ガメン カラ デナイヨウニ
  42.  IF X<0 THEN X=0
  43.  IF X>239 THEN X=239
  44.  ’テキ ノ ショリ
  45.  IF EX!=-100 THEN @EMV
  46.   ’テキ ツクル
  47.   ES=1+RND(6)
  48.   EX=255+RND(255)
  49.  ’テキ イドウ
  50.  @EMV
  51.   EX=EX-ES
  52.   ’テキ キエル
  53.  IF EX<-16 THEN EX=-100
  54.  ’テキ ヒョウジ
  55.  SPOFS 1,EX,EY
  56.  ’テキ ト ジブン アタリハンテイ
  57.  IF X+8<EX-2  THEN @NOHIT
  58.  IF X+8>EX+18 THEN @NOHIT
  59.  IF Y+8<EY-4  THEN @NOHIT
  60.  IF Y+8>EY+12 THEN @NOHIT
  61.   GOTO @GOVER
  62.  @NOHIT
  63.  ’プレイヤー ヒョウジ
  64.  SPOFS 0,X,Y
  65.  ’スコア
  66.  CNT=CNT+1
  67.  CLS
  68.  PRINT FLOOR(CNT/60)
  69.  VSYNC 1
  70. GOTO @MAIN
  71. ’ゲームオーバー
  72. @GOVER
  73.  BEEP 15
  74. END

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

敵をたくさん表示させる

  1. CLEAR:ACLS
  2. ’プレイヤー
  3. SPSET 0,64,0,0,0,0
  4. SPANIM 0,4,8
  5. X=128   ’ザヒョウ X
  6. Y=64    ’ザヒョウ Y
  7. A=0     ’カソク
  8. JP=1    ’0:チャクチ
  9.         ’1:ジョウショウ
  10.         ’2:ラッカ
  11. ’テキ
  12. DIM EX[8]
  13. DIM EY[8]
  14. DIM ES[8]
  15. FOR I=0 TO 7
  16.  EX[I]=-100   ’ザヒョウ X
  17.  EY[I]=144    ’ザヒョウ Y
  18.  ES[I]=1      ’スピード
  19.  SPSET 1+I,132,0,0,0,0
  20.  SPANIM 1+I,2,8
  21.  SPOFS 1+I,-16,-16
  22. NEXT
  23. ’ステータス
  24. CNT=0     ’タイム カウンタ
  25. EMX=0     ’テキ ノ サイダイスウ
  26. ’ハイケイ
  27. GCLS 6
  28. GFILL 0,160,255,191,8
  29. ’オンガク ナラス
  30. BGMPLAY 1
  31. ’------------┐
  32. @MAIN
  33. ’------------┘
  34.  ’ボタンソウサ
  35.  B=BUTTON()
  36.  ’ヨコイドウ(←→ボタン)
  37.  IF B AND 4 THEN X=X-1
  38.  IF B AND 8 THEN X=X+1
  39.  ’ジャンプ(Aボタン)
  40.  IF((B AND 16)!=0)AND(JP==0)THEN JP=1:A=-3:BEEP 8
  41.  IF ((B AND 16)==0)AND(JP==1) THEN JP=2:A=A/2
  42.  ’ラッカ
  43.  A=A+0.1
  44.  IF A>0 THEN JP=2
  45.  Y=Y+A
  46.  ’チャクチ
  47.  IF(Y>144)AND((B AND 16)==0)THEN JP=0
  48.  IF Y>144 THEN Y=144:A=0
  49.  ’ガメン カラ デナイヨウニ
  50.  IF X<0 THEN X=0
  51.  IF X>239 THEN X=239
  52.  ’テキ ノ ショリ
  53.  EMX=FLOOR(CNT/500)    ’テキ ノ カズ
  54.  IF EMX>7 THEN EMX=7  ’サイダイ セイギョ
  55.  FOR I=0 TO EMX
  56.   IF EX[I]!=-100 THEN @EMV
  57.    ’テキ ツクル
  58.    ES[I]=1+RND(6)
  59.    EX[I]=255+RND(255)
  60.   ’テキ イドウ
  61.   @EMV
  62.    EX[I]=EX[I]-ES[I]
  63.    ’テキ キエル
  64.   IF EX[I]<-16 THEN EX[I]=-100
  65.   ’テキ ヒョウジ
  66.   SPOFS 1+I,EX[I],EY[I]
  67.   ’テキ ト ジブン アタリハンテイ
  68.   IF X+8<EX[I]-2  THEN @NOHIT
  69.   IF X+8>EX[I]+18 THEN @NOHIT
  70.   IF Y+8<EY[I]-4  THEN @NOHIT
  71.   IF Y+8>EY[I]+12 THEN @NOHIT
  72.    GOTO @GOVER
  73.   @NOHIT
  74.  NEXT
  75.  ’プレイヤー ヒョウジ
  76.  SPOFS 0,X,Y
  77.  ’スコア
  78.  CNT=CNT+1
  79.  CLS
  80.  PRINT FLOOR(CNT/60)
  81.  VSYNC 1
  82. GOTO @MAIN
  83. ’ゲームオーバー
  84. @GOVER
  85.  BGMSTOP
  86.  SPCHR 0,89
  87.  SPANIM 0,1,1
  88.  BEEP 15
  89.  WAIT 60
  90.  BGMPLAY 6 
  91.  LOCATE 9,9
  92.  PRINT ”GAME OVER”
  93. END

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

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

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

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

QRコード      プログラムリスト



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




inserted by FC2 system