プチコン3号講座


初心者の方へ

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

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

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

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


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

画面の初期化

  1. ACLS

まずは、ここから始まる。
このプログラムをEDITモードで入力して、黒い画面で「RUN」と入力して「Enter」を押す。(RUNと入力しなくてもスタートボタンでOK)
これで、画面の表示がすべて消える。
プログラムを書くときはとりあえず書いておけ、というのは正解だが内容を知っておかないと意味がない。 ACLSで、画面の表示をすべて消去。

キャラクタの表示

  1. ACLS
  2. SPSET 0,616

これで、画面にキャラクターが表示される。
キャラクターなどはスプライトと呼ばれ、番号を指定することでどんな絵を出すかを指定できる。
この場合、自分の管理番号が0で、表示される絵が64番ということになる。この絵の番号を定義番号と呼ぶ。
プチコン3号では、あらかじめ定義番号に表示されている絵が設定されており、スマイルツールの「SPDEF」で確認することができる。
また、このようにプログラムは上から順番に実行される。

背景の表示

  1. ACLS
  2. SPSET 0,616
  3. GCLS RGB(0,128,255)
  4. GFILL 0,192,399,239,RGB(160,128,96)

これで、水色の空と茶色の地面を表す背景と図形が表示される。
GCLS命令で、背景をすべて塗りつぶし、GFILL命令で指定した範囲を四角で塗りつぶす。
色の指定は、RGB関数で行う。
RGB関数では、R(赤)、G(緑)、B(青)をそれぞれ0~255の256段階で指定する。


ヘルプを開くと基本色の作り方が書いてあるので、基本的にはそれを参考にすればある程度の色は作れるようになる。

メインループを作成

  1. ACLS
  2. SPSET 0,616
  3. GCLS RGB(0,128,255)
  4. GFILL 0,192,399,239,RGB(160,128,96)
  5. WHILE TRUE
  6.  VSYNC 1
  7. WEND

これで、プログラムが終了しなくなる
(メインループという:ゲームプログラムの基本)
プチコンの場合はSTARTボタンで終了できるので別に無限ループが危ないわけではない。
5行目のWHILEで条件が一致するまで、7行目の「WEND」まで繰り返しを行うことを意味し、上限がTRUEなので無限に繰り返すことを意味する。
6行目のVSYNCという命令は一定時間待つことを意味する。

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

  1. ACLS
  2. SPSET 0,616
  3. X=128
  4. Y=64
  5. GCLS RGB(0,128,255)
  6. GFILL 0,192,399,239,RGB(160,128,96)
  7. WHILE TRUE
  8.  SPOFS 0,X,Y
  9.  VSYNC 1
  10. WEND

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

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

  1. ACLS
  2. SPSET 0,616
  3. X=128
  4. Y=64
  5. GCLS RGB(0,128,255)
  6. GFILL 0,192,399,239,RGB(160,128,96)
  7. WHILE TRUE
  8.  B=BUTTON()
  9.  IF B AND 8 THEN X=X+1
  10.  SPOFS 0,X,Y
  11.  VSYNC 1
  12. WEND

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

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

  1. ACLS
  2. SPSET 0,616
  3. X=128
  4. Y=64
  5. GCLS RGB(0,128,255)
  6. GFILL 0,192,399,239,RGB(160,128,96)
  7. WHILE TRUE
  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. WEND

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

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

  1. ACLS
  2. SPSET 0,616
  3. X=128
  4. Y=64
  5. GCLS RGB(0,128,255)
  6. GFILL 0,192,399,239,RGB(160,128,96)
  7. WHILE TRUE
  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>383 THEN X=383
  13.  SPOFS 0,X,Y
  14.  VSYNC 1
  15. WEND

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

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

  1. ACLS
  2. SPSET 0,616
  3. X=128
  4. Y=64
  5. A=0
  6. GCLS RGB(0,128,255)
  7. GFILL 0,192,399,239,RGB(160,128,96)
  8. WHILE TRUE
  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>383 THEN X=383
  16.  SPOFS 0,X,Y
  17.  VSYNC 1
  18. WEND

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

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

  1. ACLS
  2. SPSET 0,616
  3. X=128
  4. Y=64
  5. A=0
  6. GCLS RGB(0,128,255)
  7. GFILL 0,192,399,239,RGB(160,128,96)
  8. WHILE TRUE
  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>176 THEN Y=176:A=0
  15.  IF X<0 THEN X=0
  16.  IF X>383 THEN X=383
  17.  SPOFS 0,X,Y
  18.  VSYNC 1
  19. WEND

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

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

  1. ACLS
  2. SPSET 0,616
  3. SPANIM 0,3,8,617,8,616,0
  4. X=128
  5. Y=64
  6. A=0
  7. GCLS RGB(0,128,255)
  8. GFILL 0,192,399,239,RGB(160,128,96)
  9. WHILE TRUE
  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>176 THEN Y=176:A=0
  16.  IF X<0 THEN X=0
  17.  IF X>383 THEN X=383
  18.  SPOFS 0,X,Y
  19.  VSYNC 1
  20. WEND

プレイヤーの移動ができても、動いているよう見えませんね。
なので、SPANIMという命令を使用して、アニメーションするように設定する。
SPANIMはできることが多いので少し複雑である。
SPANIM 定義番号,アニメ対象,パラメータ
となっており、アニメ対象の指定のよって指定するパラメータが異なっていたり、パラメータを指定する方法が複数あるため、前作経験者でもわかりにくいという声が多い。

今回は、アニメ対象を(3:定義番号)を指定する。
要するに、定義番号(絵の種類)を変えることでアニメーションを表現する。
パラメータを指定する方法は複数あるが、今回は直接指定する方法を書いている。
わかりやすく改行を入れるとこうなる(改行があったらエラーになるので注意)

SPANIM '
0,     ’管理番号
3,     ’アニメ対象(アニメ方法の指定:今回はコマを帰るので3)
8,617, ’1コマ目のパラメータ (表示時間、定義番号(絵の番号))
8,616, ’2コマ目のパラメータ (表示時間、定義番号(絵の番号))
0      ’ループ回数(0は無限ループ)

「ねっ。簡単でしょ。」

表示時間はフレーム数で指定する。ゲームの世界では60分の1秒が1フレームとなる。
コマ数を増やしたい場合は、2コマ目に続けて同様に書いていけば良い。

これで、プレイヤーが歩く様子が表現できる。

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

  1. ACLS
  2. SPSET 0,616
  3. SPANIM 0,3,8,617,8,616,0
  4. X=128
  5. Y=64
  6. A=0
  7. JP=1
  8. GCLS RGB(0,128,255)
  9. GFILL 0,192,399,239,RGB(160,128,96)
  10. WHILE TRUE
  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)&&(JP==0)THEN JP=1:A=-3:BEEP 8
  15.  A=A+0.1
  16.  Y=Y+A
  17.  IF(Y>176)&&(B AND 16)==0 THEN JP=0
  18.  IF Y>176 THEN Y=176:A=0
  19.  IF X<0 THEN X=0
  20.  IF X>383 THEN X=383
  21.  SPOFS 0,X,Y
  22.  VSYNC 1
  23. WEND

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

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

  1. ACLS
  2. SPSET 0,616
  3. SPANIM 0,3,8,617,8,616,0
  4. X=128
  5. Y=64
  6. A=0
  7. JP=1
  8. GCLS RGB(0,128,255)
  9. GFILL 0,192,399,239,RGB(160,128,96)
  10. WHILE TRUE
  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)&&(JP==0)THEN JP=1:A=-3:BEEP 8
  15.  IF((B AND 16)==0)&&(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>176)&&(B AND 16)==0 THEN JP=0
  20.  IF Y>176 THEN Y=176:A=0
  21.  IF X<0 THEN X=0
  22.  IF X>383 THEN X=383
  23.  SPOFS 0,X,Y
  24.  VSYNC 1
  25. WEND

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

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

  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. GCLS RGB(0,128,255)
  19. GFILL 0,192,399,239,RGB(160,128,96)
  20. ’------------------------------
  21. WHILE TRUE
  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.  ’ジャンプ
  29.  IF(B AND 16)&&(JP==0)THEN JP=1:A=-3:BEEP 8
  30.  IF((B AND 16)==0)&&(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>176)&&(B AND 16)==0 THEN JP=0
  37.  IF Y>176 THEN Y=176:A=0
  38.  ’がめんからでないように
  39.  IF X<0 THEN X=0
  40.  IF X>383 THEN X=383
  41.  ’プレイヤーひょうじ
  42.  SPOFS 0,X,Y
  43.  VSYNC 1
  44. WEND

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

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

ここまで、できればゲームプログラミングの基本は十分である。
実際にゲームを作るときは敵の表示や動き、接触時の当たり判定処理などが必要であるが、
そこから先は複雑になっていくので、次回のアクションゲームを作るまで(第2回)で解説していきたいと思う。内容はほとんど同じ(命令が若干異なる)のMk2版はこちら
※ MK2ではメインループをGOTOで処理するのが主流ですが、3号ではWHILE TRUE ~ WENDで行うのが主流になると思われます…


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

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

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

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

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

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


まだ、3号コンテンツはこれしか作っていませんが、
ゲームの作り方の基本は3号も前作Mk2も基本的には変わりません。


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




inserted by FC2 system