QGraphcsViewでBox2Dを表示する。

  • 5
    いいね
  • 2
    コメント
この記事は最終更新日から1年以上が経過しています。

QGraphicsViewとは

Qtの2DGraphicsAPi

Box2Dとは

言わずとしれた、C++で実装された2D物理エンジン

なぜQGraphicsViewを使うのか

OpenGL ES めんどくさい。
テクスチャ読み込みとか、Box2D→OpenGL ESの変換とか、その他諸々

QGraphicsView で描画できるもの


QGraphicsEllipseItem
描画できます。
矩形
QGraphicsRectItem
描画できます。
多角形
QGraphicsPolygonItem
もちろん、描画できます。
画像
QGraphicsPixmapItem
当然
動画
QGraphicsVideoItem
文字
QGraphicsTextItem

何より
QGraphicsSceneで、
クリックした座標、クリックされたQGraphicsItemのポインタが取得出来ます。

スクリーンショット

Screenshot_2014-12-13-02-03-44.jpg Screenshot_2014-12-14-00-04-09.jpg

実装

たいしたコードではないですが、githubに置きます。

QGraphicsItemの円、矩形、ポリゴンは、
頂点座標のスケールさえ変換すればBox2Dと相互に利用できます。
//Box2Dでは32px=1メートルが推奨

QGraphicsPixmapItemの座標は、左上基準なので回転などを上手く表示出来ません。
QGraphicsEllipseItemかQGraphicsRectItemの子アイテムに設定して、左上の絶対座標を設定します。
左上の絶対座標はQGraphicsEllipseItem,QGraphicsRectItemのコンストラクタ引数のQRectから流用すればOK

QGraphicsViewはその名の通り描画のみ行うクラスなので、
処理自体はQGraphicsSceneを継承したオブジェクトに記述します。

おまけ

QAccelerometer
Qt5.1からQAccelerometerクラスが追加され、
スマートフォンやタブレットの加速度センサーにQtからアクセスできるようになりました。
このデモではBox2Dの重力設定に加速度センサーの値を使用しています。

//初期化 重力方向取得モード
Accelerometer->setAccelerationMode(QAccelerometer::Gravity);
Accelerometer->setActive(true);
//読み出し
auto gravity=Accelerometer->reading();
//重力方向取得
gravity.x();gravity.y();

アプリの操作に加速度センサーからの値を用いる場合
プロジェクトにAndroidManifest.xmlを追加して
android.permission.SET_ORIENTATION権限
android:screenOrientation="portrait"or"landscape"
の2つ指定して画面の自動回転とめたほうがいいでしょう。

この投稿は Qt Advent Calendar 201413日目の記事です。