プチコン講座


初心者の方へ

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

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

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

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

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

画面の初期化

  1. CLEAR:ACLS

まずは、ここから始まる。
このプログラムを緑の画面で入力して、黒い画面で「RUN」と入力して「Enter」を押す。
これで、画面の表示がすべて消える。
プログラムを書くときはとりあえず書いておけ、というのは正解だが内容を知っておかないと意味がない。 CLEAR命令で現在のパラメータをすべて初期化して。
ACLSで、画面の表示をすべて消去。


キャラクタの表示

  1. CLEAR:ACLS
  2. SPSET 0,64,0,0,0,0

これで、画面にキャラクターが表示される。
キャラクターなどはスプライトと呼ばれ、番号を指定することでどんな絵を出すかを指定できる。
この場合、自分の識別番号が0で、表示される絵が64番ということになる。
また、このようにプログラムは上から順番に実行される。

背景の表示

  1. CLEAR:ACLS
  2. SPSET 0,64,0,0,0,0
  3. GCLS 6
  4. GFILL 0,160,255,191,8

これで、水色の空と茶色の地面を表す背景と図形が表示される。
GCLS命令で、背景をすべて塗りつぶすし、GFILL命令で指定した範囲を四角で塗りつぶす。

メインループを作成

  1. CLEAR:ACLS
  2. SPSET 0,64,0,0,0,0
  3. GCLS 6
  4. GFILL 0,160,255,191,8
  5. @MAIN
  6.  VSYNC 1
  7. GOTO @MAIN

これで、プログラムが終了しなくなる
(メインループという:ゲームプログラムの基本)
プチコンの場合はSelectボタンで終了できるので別に無限ループが危ないわけではない。
6行目のVSYNCという命令は一定時間待つことを意味する。
7行目のGOTOという命令は、指定したラベル(@がついた文字の行)にジャンプする意味を表す。

キャラクターを任意の位置に表示

  1. CLEAR:ACLS
  2. SPSET 0,64,0,0,0,0
  3. X=128
  4. Y=64
  5. GCLS 6
  6. GFILL 0,160,255,191,8
  7. @MAIN
  8.  SPOFS 0,X,Y
  9.  VSYNC 1
  10. GOTO @MAIN

これで、キャラクタを指定した座標に表示できる。
ちなみに、左上が(0,0)、右下が(255,191)となっている。
指定する値は、キャラクターの左上の座標である。

ボタンの入力を追加1(右移動)

  1. CLEAR:ACLS
  2. SPSET 0,64,0,0,0,0
  3. X=128
  4. Y=64
  5. GCLS 6
  6. GFILL 0,160,255,191,8
  7. @MAIN
  8.  B=BUTTON()
  9.  IF B AND 8 THEN X=X+1
  10.  SPOFS 0,X,Y
  11.  VSYNC 1
  12. GOTO @MAIN

ここから、ちょっと難しくなる。 ボタンの入力を取得する(7行目)
この場合→ボタンが押されていたら、Xを加算する。
ボタンと番号の対応状況はマニュアルを読んで理解するしかない。
これで、→ボタンが押されている時、キャラクタが右方向に動くようになる。

ボタンの入力を追加1(左移動)

  1. CLEAR:ACLS
  2. SPSET 0,64,0,0,0,0
  3. X=128
  4. Y=64
  5. GCLS 6
  6. GFILL 0,160,255,191,8
  7. @MAIN
  8.  B=BUTTON()
  9.  IF B AND 4 THEN X=X-1
  10.  IF B AND 8 THEN X=X+1
  11.  SPOFS 0,X,Y
  12.  VSYNC 1
  13. GOTO @MAIN

前回と同様の方法を、←ボタンでも出来るようにする。
これで、キャラクターの左右移動ができるようになる。

プレイヤーの移動範囲を制御

  1. CLEAR:ACLS
  2. SPSET 0,64,0,0,0,0
  3. X=128
  4. Y=64
  5. GCLS 6
  6. GFILL 0,160,255,191,8
  7. @MAIN
  8.  B=BUTTON()
  9.  IF B AND 4 THEN X=X-1
  10.  IF B AND 8 THEN X=X+1
  11.  IF X<0 THEN X=0
  12.  IF X>239 THEN X=239
  13.  SPOFS 0,X,Y
  14.  VSYNC 1
  15. GOTO @MAIN

キャラクターが画面外に移動してしまうと、ゲームが成り立たなくなってしまう。 なので、キャラクターが画面外に移動しようとしたら強制的に戻す処理を入れる。 キャラクタの左上の座標をしていする必要があり、キャラクターの大きさは16×16なので、右端は239を指定する。(239 = 255-16)
これで、キャラクターの移動範囲が画面内に限定されるようになる。

プレイヤーの落下処理を入れる

  1. CLEAR:ACLS
  2. SPSET 0,64,0,0,0,0
  3. X=128
  4. Y=64
  5. A=0
  6. GCLS 6
  7. GFILL 0,160,255,191,8
  8. @MAIN
  9.  B=BUTTON()
  10.  IF B AND 4 THEN X=X-1
  11.  IF B AND 8 THEN X=X+1
  12.  A=A+0.1
  13.  Y=Y+A
  14.  IF X<0 THEN X=0
  15.  IF X>239 THEN X=239
  16.  SPOFS 0,X,Y
  17.  VSYNC 1
  18. GOTO @MAIN

ここはちょっと、物理の知識が必要になる。(難しくはないはず)
Aという加速を表す変数を用意する。(加速:Acceleration)
毎回の処理で、少しずつ大きくなるようにする。(11行目)
そして、キャラクターの座標に加速を加算する。(12行目)
これで、キャラクターの自然な落下が表現できる。

プレイヤーの着地の処理を入れる

  1. CLEAR:ACLS
  2. SPSET 0,64,0,0,0,0
  3. X=128
  4. Y=64
  5. A=0
  6. GCLS 6
  7. GFILL 0,160,255,191,8
  8. @MAIN
  9.  B=BUTTON()
  10.  IF B AND 4 THEN X=X-1
  11.  IF B AND 8 THEN X=X+1
  12.  A=A+0.1
  13.  Y=Y+A
  14.  IF Y>144 THEN Y=144:A=0
  15.  IF X<0 THEN X=0
  16.  IF X>239 THEN X=239
  17.  SPOFS 0,X,Y
  18.  VSYNC 1
  19. GOTO @MAIN

このままでは、どこまでも落下していってしまうので、床の座標に来たら、それ以上落ちなくする。
Aを0にしているのは、Aがどこまでも加算していってしまうと、数字が大きくなりすぎてエラーに成ってしまう(オーバーフロー)を防ぐため。
これで、キャラクターの着地ができる。

歩行アニメーションを設定する

  1. CLEAR:ACLS
  2. SPSET 0,64,0,0,0,0
  3. SPANIM 0,4,8
  4. X=128
  5. Y=64
  6. A=0
  7. GCLS 6
  8. GFILL 0,160,255,191,8
  9. @MAIN
  10.  B=BUTTON()
  11.  IF B AND 4 THEN X=X-1
  12.  IF B AND 8 THEN X=X+1
  13.  A=A+0.1
  14.  Y=Y+A
  15.  IF Y>144 THEN Y=144:A=0
  16.  IF X<0 THEN X=0
  17.  IF X>239 THEN X=239
  18.  SPOFS 0,X,Y
  19.  VSYNC 1
  20. GOTO @MAIN

プレイヤーの移動ができても、動いているよう見えませんね。
プチコンのスプライトはアニメーションの順番に並んでいるので、簡単にアニメーションさせることができる。 これで、プレイヤーが歩く様子が表現できる。

プレイヤーのジャンプ1(押されたらジャンプ)

  1. CLEAR:ACLS
  2. SPSET 0,64,0,0,0,0
  3. SPANIM 0,4,8
  4. X=128
  5. Y=64
  6. A=0
  7. JP=1
  8. GCLS 6
  9. GFILL 0,160,255,191,8
  10. @MAIN
  11.  B=BUTTON()
  12.  IF B AND 4 THEN X=X-1
  13.  IF B AND 8 THEN X=X+1
  14.  IF((B AND 16)!=0)AND(JP==0)THEN JP=1:A=-3:BEEP 8
  15.  A=A+0.1
  16.  Y=Y+A
  17.  IF(Y>144)AND((B AND 16)==0)THEN JP=0
  18.  IF Y>144 THEN Y=144:A=0
  19.  IF X<0 THEN X=0
  20.  IF X>239 THEN X=239
  21.  SPOFS 0,X,Y
  22.  VSYNC 1
  23. GOTO @MAIN

少し複雑だが、Aボタンが押された時(B AND 16)の場合にジャンプするようにする。
ジャンプ状態を表す変数「JP」を用意し、「ジャンプ状態でなかったらジャンプできるようにしている。
JP:0=通常,1:ジャンプ中
ジャンプ時は、加速を値をマイナスにすることで、ジャンプができるようになる。
ついでに、音も鳴らしておく。
16行目では、着地かつAボタンが押されていない時に、次にAボタンが押されたらジャンプできるように変数を制御している。 これで、プレイヤーがジャンプできるようになる。

プレイヤーのジャンプ1(ジャンプの高さの調整)

  1. CLEAR:ACLS
  2. SPSET 0,64,0,0,0,0
  3. SPANIM 0,4,8
  4. X=128
  5. Y=64
  6. A=0
  7. JP=1
  8. GCLS 6
  9. GFILL 0,160,255,191,8
  10. @MAIN
  11.  B=BUTTON()
  12.  IF B AND 4 THEN X=X-1
  13.  IF B AND 8 THEN X=X+1
  14.  IF((B AND 16)!=0)AND(JP==0)THEN JP=1:A=-3:BEEP 8
  15.  IF ((B AND 16)==0)AND(JP==1) THEN JP=2:A=A/2
  16.  A=A+0.1
  17.  IF A>0 THEN JP=2
  18.  Y=Y+A
  19.  IF(Y>144)AND((B AND 16)==0)THEN JP=0
  20.  IF Y>144 THEN Y=144:A=0
  21.  IF X<0 THEN X=0
  22.  IF X>239 THEN X=239
  23.  SPOFS 0,X,Y
  24.  VSYNC 1
  25. GOTO @MAIN

少し複雑だが、Aボタンが離された時、かつ、上昇中の時に、ジャンプの加速を半分にする。
こうすることで、ジャンプボタンの押されている長さに応じた、自然なジャンプの高さ調整を実現できる。
JPは、着地時0、上昇中1、落下中2 というようになる。

わかりやすくコメント(注釈)を入れる

  1. ’--------------
  2. ’アクションゲームのサンプル
  3. ’      Version:0
  4. ’     ゲームナイヨウ トカ
  5. ’     2014/2/12
  6. ’--------------
  7. CLEAR:ACLS
  8. ’プレイヤー
  9. SPSET 0,64,0,0,0,0
  10. SPANIM 0,4,8
  11. X=128   ’ザヒョウ X
  12. Y=64    ’ザヒョウ Y
  13. A=0     ’カソク
  14. JP=1    ’0:チャクチ
  15.         ’1:ジョウショウ
  16.         ’2:ラッカ
  17. ’ハイケイ
  18. GCLS 6
  19. GFILL 0,160,255,191,8
  20. ’------------┐
  21. @MAIN
  22. ’------------┘
  23.  ’ボタンソウサ
  24.  B=BUTTON()
  25.  ’ヨコイドウ(←→ボタン)
  26.  IF B AND 4 THEN X=X-1
  27.  IF B AND 8 THEN X=X+1
  28.  ’ジャンプ(Aボタン)
  29.  IF((B AND 16)!=0)AND(JP==0)THEN JP=1:A=-3:BEEP 8
  30.  IF ((B AND 16)==0)AND(JP==1) THEN JP=2:A=A/2
  31.  ’ラッカ
  32.  A=A+0.1
  33.  IF A>0 THEN JP=2
  34.  Y=Y+A
  35.  ’チャクチ
  36.  IF(Y>144)AND((B AND 16)==0)THEN JP=0
  37.  IF Y>144 THEN Y=144:A=0
  38.  ’ガメン カラ デナイヨウニ
  39.  IF X<0 THEN X=0
  40.  IF X>239 THEN X=239
  41.  ’プレイヤー ヒョウジ
  42.  SPOFS 0,X,Y
  43.  VSYNC 1
  44. GOTO @MAIN

プログラムが大きくなってくると、後で読むときに苦労する。なので、わかりやすいように空行は注釈(コメントという)を入れておくと、後で自分が見た時に読みやすいし、 自分以外の人が見た時も読みやすくなる。
コメントはなるべく英語で書くことが望ましいけど、日本人なら日本語でもOKである。

コメントを書くときのポイントは多すぎず少なすぎず。
プログラムに見出しとして書くか、
プログラムで書けないことを書くとわかりやすくなる。

ここまで、できればゲームプログラミングの基本は十分である。
実際にゲームを作るときは敵の表示や動き、接触時の当たり判定処理などが必要であるが、
そこから先は複雑になっていくので、次回のアクションゲームを作るまで(第2回)で解説していきたいと思う。


ゲームを作るということは簡単なことではない

このように、プログラムと言うものはこのような単純な動きだけでも、数十行の記述が必要になり、実際にゲームを作る際は更に行数を記述することになり、相当な根気が必要なものになります。
しかし、ここまで書いて動かしてみて面白いと感じたのなら、自分で試行錯誤したり、ネットや書籍を頼りに独学でプログラミングについて学んだり、してみるのもよいでしょう。

ここから先は、もうちょっと難しくなります

ここから先は本当に初心者にとって難しいものになるため、非常に解説するのも難しくなります。
実は一番プログラムの習得が早い方法が、自分よりも上の人が作ったプログラムを見ながら書き写すこと、だったりします。
なので、QRコードで読み取らずに、自分の目で見てプログラムを書き写すことが大切なのです。

実際に書き写そうとすると、どこかに誤りがあったり(自分がおっちょこちょいだからでもある)、それを動かしながら、自分の間違いを探したり、そうしている内に命令やロジックの仕組みを理解したりできるのです。
非常に時間と根気が必要です。

自分はパズルが好きなので、どうしても自分の力だけでやり遂げたくなりますが、本当の近道は他人の良いプログラム理解することです。
(プログラムに何年も触れてわかったこと)



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




inserted by FC2 system