Qt + OpenGl-基本。 パート1

この記事は、Qt(C ++プログラミング言語でソフトウェアを開発するためのクロスプラットフォームツールキット)+ OpenGL(グラフィックスライブラリ)を学ぶ予定の初心者向けに、Qt + OpenGLに慣れるように設計された入門書です。

初心者に必要なもの:
1) Qt Creator (入力中に優れた組み込みのドキュメントとヒントがあります)。 ジャンプする
2) doc.qt.nokia.com-英語の公式ドキュメント
3) doc.crossplatform.ru-ロシア語のドキュメント
4) QtOpenGLについて必ずお読みください
5) 学習を始めるのに最適な記事

私たちは何をしますか
この記事では特に基本に焦点を当てているため、タスクは次のようになります。
1)アプリケーションの作成方法を解析する
2)オブジェクトの描画方法
3)マウスポインターとイベント(キーボードとマウスのキーストローク)の操作方法
4)タイマーを使用する
5)最初の平凡なゲームを作成しましょう。 タイマーを使用して、正方形をランダムに移動します。 ポインターの正方形をポイントし、マウスの左ボタンでクリックした後、正方形の場合、取得したポイントに+1を追加します。



プロジェクトを作成する

Qt Creatorを開くと、新しいプロジェクトの作成が開始されます。
Qt Widgetプロジェクト -> Qt GUIアプリケーションを選択 ます
[ クラス情報]セクションで、チェックボックスをオフにしてフォームを作成します。
アクションの結果として、ファイルを含むプロジェクトを取得します。
opengl.pro-プロジェクトのコンパイルに必要
mainwindow.h-すべてのグローバルデータを宣言する
main.cpp
mainwindow.cpp-プログラムのメソッド

ライブラリを接続する

プロジェクトの* .proファイルのQt + =行で、openglライブラリの使用を有効にするためにopenglを追加する必要があります。 他のライブラリも同じ方法で接続されます。

mainwindow.hファイル内-デフォルト名が選択されている場合、接続する必要があります:
#include <QGLWidget> #include <QtOpenGL> #include <QTimer> 


必要なメソッドと変数を事前に定義する

mainwindow.hを開きます
まず、変更します。
クラスMainWindow:public QMainWindow

クラスMainWindow:public QGLWidget
これは、 QMainWindowが単純なウィンドウを表示するためのクラスだからです。 OpenGLを使用します。QGLWidgetが必要です。これは、OpenGLライブラリの機能を実装するグラフィックスを出力するためのクラスです。

次に、変数とメソッドを事前定義します
 protected: int geese_size; //   int point; //   int gdx, gdy; //   int cax, cay, cbx, cby; //   (  (   )   ) int wax ,way; //     bool singling; //   ,  true      cax, cay, cbx, cby void self_cursor(); //      void initializeGL(); //    opengl void resizeGL(int nWidth, int nHeight); //        void paintGL(); //       void keyPressEvent(QKeyEvent *ke); //       void mouseMoveEvent(QMouseEvent *me); //     ,    setMouseTracking(false) void mousePressEvent(QMouseEvent *me); //      void mouseReleaseEvent(QMouseEvent *me); //    ""   void singling_lb(); //     void geese(); //         


タイマーを使用して、クリックする正方形の新しい座標をカウントするためのスロットも1つあります。

 protected slots: void geese_coord(); //    


画像構築の原理

QGLWidgetは 、クラスが最初に初期化されるときに、次の順序で自動的にメソッドを呼び出すように配置されています。
起動時: initializeGL()-> resizeGL()-> paintGL()
ウィンドウのサイズを変更する場合: resizeGL()-> paintGL()
updateGL()paintGL()を呼び出します

initializeGL-イメージ構築のグローバルカスタマイズに使用する必要があります。これは、フレームの構築時に指定する必要はありません。
resizeGL-ウィンドウのサイズを構築するために使用されます。 作業中にウィンドウのサイズが変更されても、表示領域が変更されない場合、サイズを大きくすると、予測できない現象が観察される可能性があります。
paintGL-このメソッドは、表示用の各フレームを構築します。
 glClear(GL_COLOR_BUFFER_BIT); //   glMatrixMode(GL_PROJECTION); //   glLoadIdentity(); //   glOrtho(0,500,500,0,1,0); //     // BlendFunc     ,       // glEnable(GL_BLEND); // glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); qglColor(Qt::white); //     // renderText     ,       ( QFont) renderText(10, 10 , 0, QString::fromUtf8("  %1 :").arg(17), QFont() , 2000); // glBegin  glEnd -     (  ), glBegin   ,   . glBegin(GL_POLYGON); glColor4f(0,1,0, 0.25);//    glVertex2f(200, 300); //  1  4 -     glVertex2f(300, 300); glVertex2f(300, 400); glVertex2f(200, 400); glEnd(); swapBuffers(); 


なぜダブルバッファリング

PaintGLはすぐに画面に絵を描くのではなく、それをバッファに書き込み、要求に応じて、swapBuffers()は現在の画像をバッファに現れたものに置き換えます。 バッファリングだけで、画像をより正確に置き換えて、画面にジャンプしないようにすることができます。

マウスクリックイベント

mousePressEvent() -マウスが押されると、メソッドが自動的に呼び出されます。 送信されたパラメータでは、たとえば、どのボタンが押されたか、座標のどのポイントにあるかなど、さまざまな情報を取得できます。
-この例のこのイベントは、マウスがクリックされた場所を判別するために使用され、座標が正方形フィールド内にある場合、ポイントに+ 1を追加してフレームを再構築します。
-また、ポインターを固定して移動するときに画面上の領域を強調表示するための初期座標を決定するためにも使用します。

マウス移動イベント

mouseMoveEvent() -マウスポインターの座標が変更されると自動的に呼び出されます。 ただし、1つありますが、デフォルトはsetMouseTracking(false)であるため、マウスボタンが押されたときにのみイベントが発生するため、クリックせずにメソッドが呼び出されるようにするには、setMouseTracking(true)を設定する必要があります。
-このメソッドを使用して、ポインターの現在の位置を取得し、領域の選択を再構築するか、独自のカーソルを描画します。

マウスボタンが「押された」ときのイベント

mouseReleaseEvent() -マウスボタンが押されると自動的に呼び出されます。 また、さまざまなパラメーターを受け入れます。
-この場合、メソッドを使用して、画面から選択した領域を消去します。

キーボードキーイベント

keyPressEvent() -メソッドは、キーボードのボタンが押されたときにイベントで呼び出されます。
-この例では、このメソッドを使用して、正方形の座標を再定義し、新しい位置に移動します。

タイマー

QTimer-シグナルをリッスンし、対応するスロットを実行するストリームを作成できます。
-この場合、750ミリ秒待機してからタイムアウト()信号を送信して作業を終了するタイマーを作成しますが、信号の終わりに作業を停止するのではなく、クリックする必要がある正方形の座標を再定義するためにスロットを再起動しますポイントを獲得するために。
 QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(geese_coord())); timer->start(750); 


同化のためのこの材料の割り当て。

私がレイアウトした既成のコードは機能しますが、宿題でゲームを開始すると挨拶が表示され、クリックするとポイントを獲得できるようにコードが変更されます。 1分後、得点が表示され、再びプレーすることが提案されました。

結論!

最初の原始的なゲームでここに書かれた小さなもののほとんどは、単に必要ありません。 しかし、私は再び注意したい:「これは、 Qt + OpenGLに精通するように設計され入門記事です。」 また、この方法で作成されたプログラムは、任意のオペレーティング環境用にコンパイルできます。

作業コードの完成バージョンは、次の場所で入手できます。

ソースの表示とダウンロード
Windows用ゲームをダウンロード
Linux用ゲームをダウンロード

PS将来、反対しなければ、私はレッスンを書き続けます。 たとえば、次のレッスンでは、たとえばアヒルで射撃するゲームを作成します。

質問がある場合-コメントまたはPMに記入してください。

Source: https://habr.com/ru/post/J132674/


All Articles