プログラミング未経験ならゲームプログラミングをしてみよう
こんにちは。継続の錬金術士なおキーヌです。
ブログ毎日更新は110日目になります。
プログラミング未経験にゲームプログラミングをおすすめしたいのはいくつか理由があります。
完成させるのが目的ではなく、プログラミングスキル向上の一環として
ゲームを作るという行為は成長に繋がります。
楽しく作るので身に付きやすいというのが一番の利点ですが、
プログラミング初心者がゲームプログラミングをすることで得られる利点は他にもあります。
ゲームプログラミングはプログラム言語の基礎を使いながら作り上げるので
教本に沿って勉強するより基礎が身に付くのでプログラミング教育に取り入れてほしい所です。
1F単位で処理するということを体験できる
プログラムというのは基本的に1ループ1フレームという計算になります。
プログラミングでは基本的なことですが、Webプログラミングをしているとあまり1F単位での処理は意識しないので、いざインタラクティブな処理を行おうとすると苦戦すると思います。
ゲームプログラミングをすれば嫌でも1ループでの処理を記述しなければならないので
プログラミングの基本的な処理の書き方も学べますし、処理負荷を気にするようにもなります。
大枠の1ループ(以下メインループ)の中でループ処理を書くと処理負荷がかかります。
よくソフトを触っていて「応答なし」となってフリーズする時があると思います。
あれは1ループの中で処理が終わらず内部では頑張っています。
ゲームではそのようなことが起こってしまってはエラーが出てゲームが終了してしまいます。
わかりやすいのがゲームのデータロードする時です。
メインループの中でファイル読み込み処理を記述してロードが終わるまでは次の処理に行けません。
このような処理を書くとファイルロードが終わるまで応答なしになってしまいます。
4項目めで紹介するのですが、ファイル読み込みは基本的に非同期処理で行うのがベストです。
アプリケーションに重要なキー入力の処理を体験できる
ゲームのみならず、他のアプリケーションにも共通して言えるのがキー入力処理です。
何かを押すと、イベントが発動して何かが起こる。
ユーザーが操作するタイプのアプリケーションであれば必須の機能ですね。
ゲームプログラミングでも同様にユーザーがキー入力をしてキャラクターを動かしたり、
カーソルを動かしたり様々なキー入力処理が必須になります。
キー入力ができないゲームは、もはやゲームとは言えないと思います。
このキー入力とはマウスのクリックやタッチ操作もキー入力に含んでいます。
キー入力処理を作るには押されたキーの監視や押されたキーによる分岐処理、
どれだけそのキーを押されているか、いつ押されているキーが離されたか等の監視も必須になります。
ざっくりな例えですが、60F=1秒として決定ボタンを押したとき、
1秒間に60回実行されていることになるので凄まじい速さでボタンが押されていることになります。
1秒間に16連打の高橋名人もびっくりですね!
選択肢のあるゲームであればメッセージ送りの次に出てくる選択肢が押されてしまうぐらい早いです。
この連打状態を解消するためにはキー入力の制御処理が必要になります。
例えば1回そのキーがおされたらキーフラグをONにして、次のループの時にそのキーのフラグがONであれば何もしない、
キーが話されたらフラグをOFFにするという風にすれば1回おし続けていても1回しか実行されません。
しかし、これだけでは例えば右キーで1ドット進む度にキーを離してはまた右キーを押さなければいけませんね。
そうすると移動するために右キーを連打しなければいけません。
1つのONOFFフラグだけで管理する処理を作ってしまえば、ユーザーは穴に落ちるどころか電源を切ってしまいます。
キー入力制御こそが、クソゲーと良ゲーの分かれ道になりますので色々試行錯誤しましょう。
セーブデータを作るためにファイル入出力を体験できる
最近のゲームにはセーブデータがあるのは普通ですので、セーブデータを書き込むためにファイルの出力をしなければいけません。
そして再開する時には出力したファイルを読み込む必要があります。
ファイルの読み書きはゲームプログラミングだけではなく普通のプログラミングにもよく使うことになります。
これをファイル操作と言いますが、単純に読み込んで書き込むだけではないことに気を付けましょう。
ファイル操作の基本的なフローは
- ファイルを開く
- 書き込む or 読み込む
- ファイルを閉じる
が1セットとなります。
ファイルを閉じる処理をしないと保存もされませんし、開いたファイルがメモリに残ったままになるので
閉じないまま何度も開いてしまうとメモリリークの原因になってしまいます。
今の時代、よほどのことをしない限りはメモリリークは起こりませんがファイル操作の作法なのでしっかりと覚えておきましょう。
使ったら後処理する癖はプログラミングにおいて重要になります。
データのロードを実装するために非同期処理を体験できる
「1F単位で処理するということを体験できる」の項目でも言いましたが、ロードは基本的に時間のかかる処理です。
ファイルが軽いと一瞬でロードは終わりますが、重たいファイルの場合は読み込むのに時間がかかります。
読み込む時間が長いと、メインループの1回が中々終わらないので応答なしという状況になってしまいます。
これを解消するのは非同期という処理を行います。
非同期というのは、1つの処理(メインスレッド)が動いてるところとは別のところで処理(サブスレッド)が動いていることを指します。
非同期という名前ではありますが実際はメインスレッドを中断してサブスレッドに移り、サブスレッドの処理が少し進んだらメインスレッドに戻り……
という動きをしているため同時に動いているように見えます。
非同期処理については難易度が高いので、ある程度プログラミングに慣れてからしっかりと勉強しましょう。
しかしゲームプログラミングでは結構頻繁に使われる処理なので、複雑なゲームを作る前に
しっかりと扱えるようになる必要があります。
恐らく一番最初に非同期処理を組み込むのはロード画面の実装時になるでしょう。
市販のゲームにはNow Loading…となっている時に画面のちびキャラが動いたりTIPSが表示されたりしますよね。
あれがまさに非同期処理になっていてロードが終わるまでは表示され続けます。
何故非同期処理にして動かすのかというと、フリーズしているかのように見えてしまうのでプレイヤーは不安になってしまいます。
ゲームクリエイターはプレイヤーに快適にゲームをしてもらうために尽くさねばなりません。
プレイヤーにいじわるするのはゲームプレイでやりましょう。
システム面でプレイヤーにいじわるするとクソゲーのレッテルを張られてしまいゲームを投げ捨てられます。
そうならない為にも、フリーズするようなつくりのコードを書くのはやめましょう。
──ゲームを作るときは、いかにプレイヤーの気持ちになって作るかです。
ソーシャルゲームのような集金するだけしか考えていないようなゲームを作るのはやめましょう。
そういうのは企業に任せておけばいいです。
それでは。