さて、初めての記事なので、markdownを少しでもうまく使って、わかりやすい記事にできたらなと思います。(見やすくするアドバイスがあったら是非コメントで教えてください)
なお、記事の内容の都合で別サイトの内容に対して否定の言葉の使っている箇所が何個かありますが、あくまでも個人的な意見として参考にしてください。(ここら辺の言い回しって良い表現ないですか?)、
ネットで見つけたものや個人的に考えたものもdxlibの小技を書いていきます。
#1.キー入力
dxlibにはキー入力の方法として、いくつかあります。たぶん多く使われるのはCheckHitKeyかなと思います。一番使うのが簡単ですし。
ただ実際にゲームで使おうとすると、関数が実行されるたびにキーが押されているかを取得しているので速度もおそらく遅いです。(といっても計測したことないですけど)
そこで、dxlibにあるGetHitKeyStateAllを使います。この関数はすべてのキー入力について配列に代入してくれる関数です。この関数を実行して配列にキーの入力状態を配列に代入したら、後はその配列を参照することで、処理速く複数のキーの入力状態を取得できます。
で、前置きが長くなりましたが、ここからが本題で、この関数を使ったとしても、キーが押されているか押されていないかしかわかりません。実際にゲームで利用するとなると、
- キーが押された瞬間
- キーが押している間
- キーが離れた瞬間
- キーが押されてない
とかを取得したいものです。この中でキーを押された瞬間というのは特にゲームで使うでしょう。ゲームの仕様として、キーの長押しを禁じたい場合は数多く存在するでしょう。
そこで、ネットでは何人かの人が専用の関数を作ることを思いつきました。
https://dixq.net/g/02_09.html
がわかりやすいでしょうか。このサイトは他にも役に立つ情報が多いので参考にしてる人も多いと思います。
しかし、上記のgpUpdateKeyではキーが離れた瞬間というのは取得できません。まあ使うゲームは限られているでしょうが。去年のアドベントカレンダーでこれを解決しようとした人がいました。
https://qiita.com/legohasiri/items/ff258bb3cb4522b4aa66
けどここの方法だと使うキーが増えるたびにオブジェクトを作る必要があります。しかもよく読んでみるとわかるんですけど、キーの数だけupdateを実行する必要がありますし、僕の勘違いでなければGetHitKeyStateAllは本来1フレーム(ゲームのメインループ一回)に一回呼べばいいのにこれじゃキーの数だけ呼ばれてしまいます。
じゃあどうすればいいのかと。方法としては、gpUpdateKeyを改良すればいいんです。僕が考えたのは、配列をもう一個作って、キーが押されてないときにその配列の対応するところを1にする。すでに1だったら0にするという方法です。そこまで作って、ふとこのぐらいの仕組みなら作った人いないかなと思いました。検索して見つけたのは
https://dixq.net/forum/viewtopic.php?t=8685
の一番下にあるものです。
配列を一個も増やさずに見事に作られています。見つけて以降僕はこれを使っています。
#2.画像のカラーバリエーション
ゲームによっては画像をたくさん使うと思います。それこそ色違いとか。そんな色違いの画像を用意するのを楽にする方法です。
まず、色を白にした画像を用意します。それをLoadGraphで読み込んで、実際に表示するときには以下のようにします
SetDrawBright(表示色のR、表示色のG、表示色のB)
DrawGraph(表示するX, 表示するY, 画像のハンドル, ここはご自由に);
SetDrawBrightは描画するときの色を重ねてくれる?関数で、白の画像に対して使えば指定した色に画像を塗ることができます。こうすることで、カラーバリエーションが必要な時でも画像は一つで済みます。
今某落ち物ゲームを作っていて、この方法を使わせてもらってます。白の画像を用意するというのはどこかのサイトを参考にしたと記憶してるのですがどこだったか忘れたので思い出したら追記しておきます。
なお、この方法は問題があって、(気づいたときは驚きました)上記のように画像を描画した後DrawLineなどを使って白い直線を描画すると、描画されるのはなんとさっき指定した色になります。なのでSetDrawBrightで白を指定して戻す必要があります。画像のみに適用する方法誰か知りませんか?
#まとめ
記事を書くときは内容をもう少し考える。
間違った情報はたぶんないとは思いますがあったらあったらコメントお願いします。
また、このサイトでリンクを張らせてもらったサイトを書いた人へ、今回の記事の内容はサイトが無ければ書けませんでした。ありがとうございます。