Qt 5.2からQt 5.4の2Dプラットフォーム

画像 こんにちは、Habr。 この記事は冬に書かれるはずでしたが、客観的な理由で今書いています。



私は1年前にゲーム開発を行うことにしました。 もちろん少し遅いですが、話はそれについてではありません。 モバイルデバイス用に何を書くかをすぐに決めました。 方向は有望であり、私にとっては非常に興味深いことが判明しました。



私はC ++でプログラミングしているため、クロスプラットフォーム開発環境を選択する必要があることを意味します。 選択肢はQtに落ちました。 今、私は彼女がなぜそうなのか正確に言うつもりはないが、選択はなされた、そして物語はそれについてではない。



私はロシア語で本を取り出し、慎重に半分読んで、子供向けのゲーム「Bulls and Cows」を作りました。 話すことは何もありません、それはテストプロジェクトでした。



もう一度読みましたが、Qtのサイトには非常に優れたドキュメントがあり、必要なオブジェクトの説明を簡単に見つけることができます。 そして、それはできません。



問題は、プロジェクトをもう少し深刻にすることです。 どこでも、彼らは初心者に最初に簡単なことから始めるようにアドバイスします。 私はすでに古くて馴染みのあるLinesを書く準備を始めましたが、ここで1つのプロジェクトがAndroidで何かを書くことが必要になりました。 それで、プラットフォーマーを書くというアイデアが生まれました。 そして、実際、物語はまさにそれについてです。



C ++で記述することにしました。Androidでどの程度適切に動作するかを確認したかったのです。

そして、すぐにQtグラフィックライブラリを使用して作成することにしました。前述のように、多くの優れたマニュアルがあります。 プラットフォーマーを作成するプロセスについては説明しませんが、グローバルネットワークでのこの優れた機能は、さまざまな言語で十分です。



私はこの奇跡をQt 5.2の9月末に書き始めました。すでに5.3だったことは知っていますが、更新するには怠tooすぎました。 11月上旬にはすべての準備が整いましたが、特定の理由により、ゲームが作成されていたイベントは開催されず、春に延期されました。 プロジェクトを事前に世界にアップロードすることはできません。 マイナーな改善に取り組み、Qt 5.4に移行するのに十分な時間がありました。



簡単に言えば、実装プロセスでは、実際、開発中に発生した問題と、あるバージョンから別のバージョンへの移行について説明しました。



グラフィックライブラリ:



グラフィックライブラリ
横棒から始めましょう。

ネイティブのQtライブラリは多くのメモリを消費します。 使用済みコンポーネントQImage。 サイズが780バイトの画像がメモリにロードされると、使用されるメモリの量は数キロバイトではなく、数十、時には数百キロバイト増加しました。 この事実は私にはあまり喜ばしくなく、時には迷惑なものでした。



何らかの方法で使用されるメモリの量を減らすために、すべてのグラフィック要素を1つのファイルに配置しました。 しかし、それは使いやすさにも関連していました。 使用メモリ量はすぐに10M減少しました。



私の目に留まった2番目のことは、プロセッサの負荷量です。 100%ではなく、50%以上。 たぶんゲームではこれは普通ですが、それからもっと面白かったです。



Qt 5.4のリリースにより、開発会社はグラフィックライブラリを改善したと主張しました。

私は彼らが何かを改善したことを確認します:)。 5.4への移植時には、RAMの使用量はさらに少なく、プロセッサのロードはすでに50%未満でした。 私はこれらのすべてのパラメーターをWindowsで調べました。Androidでの状況は-知らないうちに。



その過程で、Zoomで別の興味深い事実が発見されました。

私のゲームの標準画面サイズは540x960です。 彼だけです。 写真を縮小するとき、問題はありませんでしたが、少し速く動作し始めました。 しかし、増加に伴い、いくつかの問題が特定されました。



まず、スムーズなスケーリングが機能しなかったため、レンダリングプロセスがすぐに20〜30倍に増加しました。 しかし、あなたはこれを拒否することができます、それはあなたがスケジュールに多くの注意を払う必要があるそれほど深刻なプロジェクトではありません。 しかし、彼は、さまざまな画面解像度に合わせて写真を準備する必要があることを自覚しました。



2番目の問題は次のとおりでした。 前述のように、すべてのグラフィック要素は1つのファイルに配置されていました。 ゲーム画面に再描画する領域を指定する必要がありました。 この領域が拡大されると、何らかの理由で、指定された領域よりも1ピクセル大きくキャプチャされました。



この問題の解決策は、要素間に1〜2ピクセルの小さな空き領域を残す必要があることです。 または、要素自体を領域自体よりも少し小さくします。 2番目のオプションがありました。



そして、私が好きではなかった最後のこと。 小さい配色(16および256)の写真を操作する機能の欠如。 伝えられるところでは、QIMageには256ビットが実装されていますが、各ビットは事前に登録する必要があります。



図書館の残りの部分は私を幸せにしました。 それを使用すると便利で、さまざまな画像形式をサポートし、結果の画像をディスクに保存できます。 さまざまなツールサイズ




音を扱う



音を扱う
この本は、バージョン4.8のマルチメディアの操作について説明しています。 しかし、それ以来、すべてが変わりました。 そして、コンポーネント、およびそれらと連携します。 少しグーグルでドキュメントを読んで成功しました。 最終的には、それほど複雑ではありませんでした。 詳細は説明しませんが、今日はフォーラムでこの情報で十分であり、ドキュメントがあります。 しかし、誰かが理解するのが面倒で、書くなら、答えます。



実際に、私が遭遇した問題。 大きなWAVファイルは許容されません。 大-3秒より長いことを意味します。 MP3ファイルも特に好まれません。 5MB以上が接続に失敗しました。 合計メディアサイズが10 MBを超えると、私は集まりたくありませんでした。 たぶん、この制限は何らかの形で規制されていますが、私はその方法を見つけていません。 オーディオMP3ファイルの品質を下げたところ、すべてうまくいきました。



それ以外の場合、サウンド管理コンポーネントは適切に機能しました。 オーディオを停止することなく、音量レベル、MUTE'irovatサウンドを制御できます。 メインの再生ストリームを停止することなく、バックグラウンドで音楽/サウンドを開始します。 別のストリームでサウンドを起動した場合にのみ、終了するまでサウンドが鳴り、強制的に停止することはできません。



5.2でも問題に遭遇しました-サウンドレベルを調整するための外部ボタンが機能しませんでした。 アクティビティを終了する必要がありました。 これをどのように行ったかについて、Habré についての記事を書きまし 。 バージョン5.4では、すべてがすでに機能しているため、何も完了する必要はありません。




タッチスクリーン



タッチスクリーン
ここで、最大の誤解が生じました。 しかし、本質は次のとおりです。



バージョン5.2では、タッチスクリーンイベントの操作方法を詳細に研究しました。 画面上のすべての「指」の座標と状態を保存するコンテナがあります。 最初のタッチ(最初の「指」)に応答するイベント、変更するイベント(「指」の動きまたは画面上の番号の変更)、および手押し車の完了を報告するイベント(すべての「指」が画面から削除されたとき)があります。



実際、アプリケーションでマルチタッチを使用する場合、マウスイベントを処理することさえできません。 タッチスクリーンのイベントではすべてがうまく機能します。 しかし、特定のニーズのために、マウスイベントを処理する必要がありました。 その後、問題を整理するのに役立ちました。



バージョン5.4ではすべてが変更されました。 新しいQtでプロジェクトをまとめ、新しい機能をテストするために座ったとき、コントロールが飛んだことを発見したときの驚きは何でしたか。 そして、次のことが起こりました。



何らかの理由で、Qの開発者は、タッチスクリーンとマウスのイベントのロジックを変更しました! 今では、なんとなくうまく機能します。 「指」の最初のタッチで、 MouseButtonPressおよびTouchBeginイベントが生成されます。 ただし、 MouseMoveイベントが生成され、 TouchUpdateが生成されない場合。 しかし、手押し車のコンテナでは、ポイントは残りますが、その座標と状態は変わりません。 また、 MouseButtonReleaseイベントが生成されると、 TouchEndイベント生成されず、事実上1本の指が常に画面にぶら下がっていることがわかります。

この問題は、 TouchBeginイベントステータスコンテナをyoursにコピーし、 MouseButtonReleaseで次のTouchBeginまでクリアします。



2番目の「指」が画面に表示されると、マウスイベントの生成はオフになります。 その後、画面に何本指を置いても、何本離れても、 TouchUpdateイベントは常に生成されます。 すべての指が画面から削除されると、 TouchEndイベントが生成されますが、 MouseButtonRelease生成されません。 MouseButtonReleaseと同じ方法でTouchEndイベントに応答することにより、問題を回避できます。 ただし、実際には、次にTouchBeginイベントが生成されるときに、 MouseButtonPressは生成されず、タッチスクリーンイベントを引き続き使用します。 これが最大の問題が潜んでいるところです。



MouseButtonReleaseイベントが発生するまで、 MouseButtonPressは生成されません。 MouseButtonReleaseを人為的に呼び出すと、とにかく成功しません。 MouseButtonRelease体系的に生成された後、画面に配置して1つの「指」のみを削除する必要があります。

この問題は次のように解決されました。 TouchBeginとともに、 MouseButtonPressイベントを人為的に発生させました。 関数では、このイベントの処理は最初にグローバル変数の状態をチェックし、 falseの場合はtrueが割り当てられ、関数コードが実行されました。trueの場合 、このイベントを処理し、関数を終了します。 TouchEndまたはMouseButtonReleaseの場合この変数はfalseに設定されていまし



5.4のタッチスクリーンで何も変更されていなかった場合、テキストのこの部分はここになかった可能性があります。 それで私はとても不満でした。 「5年の期間」に一度、タッチスクリーンにバグが表示されますが、それを再現することはできず、その結果、それが発生する理由を理解します。 これが発生したらすぐに、ここで登録を解除します。




他に何



英語への翻訳も追加しましたが、問題はなく、Qtでのアプリケーションの国際化に関する十分な情報もありました。



まとめ



ゲームが作成され、プロジェクトで正常に起動されました。 彼女は元の目的地を実現しました-私はゲーム開発で経験を積み、都市クエストのタスクの1つになりました。 今、彼女は私のポートフォリオの一部である彼女の二次的な使命を果たします。



これを読んでくれてありがとう。



All Articles