LoginSignup
4
5

More than 5 years have passed since last update.

QGraphcsViewでBox2Dを表示する。

Last updated at Posted at 2014-12-13

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つ指定して画面の自動回転とめたほうがいいでしょう。

4
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5