目次
19日 続・プログラム中級者からの質問
23日 いびき と まくら
以前、知人がプログラム勉強中、という話を書いた。
これが、すごい勢いで上達中。
半年前には「ポインタって何?」みたいなレベルだったのが、昔の雑誌の BASIC のプログラムを C 言語に変換して移植する、くらいのことはできるようになった。
といっても、数か月かかって1本のゲームを移植した、というレベルだけど。
そして、その最中に何度も質問されたのだけど、どんどん質問が具体的になる。
面白かったので、最近受けた質問を書いてみよう。
▼教科書に載っているプログラムと、ゲームの違いについて
言語の教科書に載っているようなプログラムは、1本道で別の処理が間に挟まることはない。
たとえば、繰り返し計算が必要な場合、for 文などでループして一気に計算してしまう。
でも、ゲームだと、1回の処理では少しづつ計算して、すべてのキャラについてそれを繰り返す。
こういうことは教科書には載ってないけど、いったいどこで学んだの?
僕の答え。
「言語の教科書」には載ってないけど、ゲーム作りの教科書みたいな本には書いてある。
また、昔のパソコン少年の多くが呼んでいた雑誌、「ベーマガ」こと、マイコン BASIC マガジンには、ゲーム作りのコツが書かれた連載が繰り返し掲載されていた。
コンピューターは本来計算の道具で、計算をするプログラムを作るのであれば、一気に計算して結果を出せばよい。
普通はこちらの使い方になるので、教科書もこのやり方で書かれている。
でも、ゲームに限らず、リアルタイムでコンピューターを使う用途…たとえば家電品なんかのプログラムは、一気に計算しないで、長い時間繰り返し少しづつ処理を繰り返している。
例えば洗濯機は、洗濯中でも蓋が明けられたら危険がないように緊急停止しないといけない。
洗濯機だから洗濯に専念する、というわけには行かず、少しづついろいろな処理を同時に行っている。
ゲームもそうしたプログラムの作り方の一種。
微小時間に区切って、その時間の中で必要な計算だけをするので、「時間で微分している」ともいえる。
そして、これを何回も処理して、実際の時間の中で連続させることで「積分」して、本来得たかった結果を得る。
▼ゲームのキャラ制御について
元の移植ゲームは、ずっと同じ内容を繰り返しているようなゲームだった。
構造がわかってきたので改造して、ボスを出そうとしたらしい。
ボスは最後だけしか出てこないが、メインループの中で処理はしないといけない。
ここで、ボスがいるかどうかをフラグに持っていて、「ボス登場時だけ、ボスを動かす関数を呼ぶ」という処理にしたらしい。
ここで疑問。
ゲーム中のほとんどの時間ボスは出てないのだが、毎回ループの中でフラグをチェックしているのが無駄な気がする。
こういうやり方しかないの?
また、新しいボスを1体出そうとしただけで、その「出現」管理フラグだけでなく、ボスの位置や現在の状態など、管理しないといけない変数が大量に増えた。
普通のゲームだと、いろいろな種類の敵が出るのが普通だけど、こういうデータを全部管理している物なの?
僕の答え。
この疑問を持つようになったら、もう C 言語ではなくて C++ に進むタイミング(笑)
C++ では、変数とプログラムを強く結びつけることで、変数管理の手間を感じにくいようにしている。
また、フラグをもって処理を制御するのではなく、以下のような方法もある。
まず、ゲーム中の各種の処理の関数は「呼び出すだけ」で良いようにしておく。
必要な時は、毎ループ呼び出される。引数などは持たない。
(もしくは、すべての関数で引数の持ち方を共通化しておく)
ポインタはデータの入っている配列などを示すもの、と思われがちだが、プログラムもメモリにあるのでポインタに入れることができる。
(と話したら、この知人はそのことは知っていた。ただ、そんなこともできる、というだけで使い方の具体例はわからないようだった)
例えばポインタの配列を用意して、最初は全部 0 を入れておく。
新しく処理したい敵などが出現した場合、この配列に、敵の処理関数のポインタを入れる。
0 の所を探して入れるようにする。
そして、敵が撃破されたり退場したりした場合、配列を 0 に戻す。
あとは、メインループの中で、配列の値を取り出して、0 なら無視、そうでなければ関数として呼び出す。
これで、フラグなしで敵の関数呼び出しを制御できる。
実際にはもう少し工夫しないと使いにくいのだけど、これと C++ のデータ領域の持ち方を組み合わせてやると、非常にゲームを作りやすくなる。
最初にリンクした半年前の質問と比べて、質問のレベルが段違いなのがお分かりいただけるだろうか。
彼が移植したゲームは、BASIC の移植なので「テキスト文字」の組み合わせで作られている、1980年代っぽさが強いゲームだ。
でも、内部処理については十分な勉強になったようだ。
次は、スプライトライブラリを使ってもう少しグラフィカルなゲームを作りたいらしい。
自分で手を動かして、十分悩んでから質問してくるので、その質問がいつも鋭い。物事の核心を突いてくるのだ。
彼から質問されて答えるのが、結構楽しみだ。
同じテーマの日記(最近の一覧)
別年同日の日記
申し訳ありませんが、現在意見投稿をできない状態にしています。 |
お恥ずかしい話だが、僕は寝ている間の いびき がひどいそうだ。
というか、ここ半年ひどかったらしい。
隣で寝ている妻が安眠できないほどひどかったそうで、1か月ほど前から対策をして、今は大丈夫になった。
実は、以前にも いびき がひどい状態になったことがある。
コロナに罹患した後。
コロナ禍の初期、「医療崩壊」と言われて一番ひどかった時に罹患している。
3週間も寝込むことになり、体力が劇的に落ちたとき、いびき もひどくなったのだ。
その時はいろいろ試したのだが、結局効いたのは「筋トレ」だった。
舌や顎、頬、軟口蓋などの筋肉を鍛えるのだ。
Android のアプリでそういうものを見つけて、有料だったが購入した。
(当時は有料だったが、今見たらインストール無料で有料オプションがある形式に変わっているかもしれない)
で、改善してからは使っていなかったのだが、またひどくなったというので1か月前から使い始めた。
そしてまた改善したというわけだ。これ、治ったから大丈夫、ではなくて、続けないといけないな。
筋トレだし、そうしたものか。
余談だが、上で紹介したアプリには、セットで開発されている「いびき計測アプリ」もある。
こちらは無料でも使える。
いびき計測は無料で、改善は有料ということだな。
ただ、今回はこちらは使っていない。いびき計測アプリは「寝ている間起動しっぱなし」にするものなのだが、現在その地位はポケモンスリープが占めているためだ。
ポケスリは「睡眠計測」ができるのだが、いびき計測とはちょっと違う。
一応、寝ている間の音量も測定しているのだが、いびき計測に特化したものと違って信頼性が低い。
いびき計測は、ベッドから少し離れたところに置くように指示されていた。
このため、多少寝返りをうっても、音量は安定していて計測が正確だ。
ポケスリは、寝返りなどの動きも計測するために、布団の上に置くように指示される。
そのため、寝返りをうって顔がスマホ側をむけば、寝息なども非常に大きく計測されるし、逆もあり得る。
音量に関しては精度が低いのだ。
…が、ポケスリはゲームとして楽しんでいるので、今は変更する気はないのだった。
(古いスマホとかにいびき計測アプリ入れて計測すればよいのかもしれないが、そこまでやらない)
それとは別に、ニトリが「いびき対策枕」の TV CM を行っていた。
妻が買えというので、非常に高かったが購入した。
筋トレとは別に、そもそもいびきは「仰向け寝」だとひどくなりやすいことが分かっている。
人によって原因は違うが、舌や軟口蓋などが重力で下がり、喉を狭くするのが原因となりやすいためだ。
(筋トレはこれを防ぐためのものだ。筋肉が付けば重力で下がりにくくなる)
しかし、子供のころからずっと仰向けに寝てきた。
「横向きに寝るのは行儀が悪い」としつけられ、仰向けであまり動かないのが良い、と思っていたのだ。
なので、横向きに寝ても、寝ている間に寝返りをうって仰向けになってしまう。
そこで「いびき対策枕」だ。
CM によれば、横向き寝をしやすいように工夫されているという。
近所のニトリに見に行った。
商品名としては「横向き寝がラクなまくら」になる。シリーズになっていていくつかある。
でも、確認してわかったのは、「横向き寝がラク」ではあるが、「仰向け寝でも使える」ということだった。
僕は多分、寝返りうって仰向けになっちゃう。自信がある。
思ってたのと違った…と思いながら周囲の別の枕も見ていたら、「横向き寝促進まくら」というのが目に入る。
こちらは、横向き寝をさせるように特化していて、仰向け寝では使いにくいようになっている。
コレだ。購入。ただしお値段高め。まくらが6千円もする。
(「横向き寝がラク」な奴はこれほど高くない)
で、こちらは2週間ほど使ってみている。なかなか良い。
そもそも横向き寝に慣れていないので寝付くのに少し時間がかかってしまうのだが、横向きで寝た際に耳がすっぽりと入る穴とか開いていて、まくらが頭にフィットする。
今リンクしようと思って商品ページ確認したら、仰向けでも使えることになっているね…
実際、ふと気づくと仰向けに寝ていることもある。
でも、横向きの方が収まりがいいので、気づいたら素直に横向きになるようにしている。
以上、いびき対策としての、筋トレのサポートアプリと、まくら。
最近使い始めた(再開した)ものです。
同じテーマの日記(最近の一覧)
別年同日の日記
申し訳ありませんが、現在意見投稿をできない状態にしています。 |