summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuel Rødal <sroedal@trolltech.com>2008-12-04 17:06:50 +0100
committerSamuel Rødal <sroedal@trolltech.com>2008-12-04 17:06:50 +0100
commitb7c6148cb72f129c19bcca399080ba203cd789c8 (patch)
tree06281ef2d6bbf4399198907a7d784bf5d7a65c5a
parent7a0aaa3f8c192bb3f1c8b976325c696a9dc81994 (diff)
Implement mouse looking when clicking and dragging with right mouse button.
-rw-r--r--mazescene.cpp52
-rw-r--r--mazescene.h6
2 files changed, 51 insertions, 7 deletions
diff --git a/mazescene.cpp b/mazescene.cpp
index 6fb126a..10b7eaf 100644
--- a/mazescene.cpp
+++ b/mazescene.cpp
@@ -82,6 +82,8 @@ MazeScene::MazeScene(const QVector<Light> &lights, const char *map, int width, i
, m_strafingVelocity(0)
, m_turningSpeed(0)
, m_pitchSpeed(0)
+ , m_deltaYaw(0)
+ , m_deltaPitch(0)
, m_simulationTime(0)
, m_walkTime(0)
, m_width(width)
@@ -208,6 +210,11 @@ static inline QTransform rotatingTransform(qreal angle)
return transform;
}
+void Camera::setPitch(qreal pitch)
+{
+ m_pitch = qBound(qreal(-30), pitch, qreal(30));
+}
+
Matrix4x4 Camera::matrix(qreal time) const
{
Matrix4x4 m;
@@ -549,6 +556,21 @@ void ProjectedItem::updateTransform(const Camera &camera, qreal time)
setTransform(m.toQTransform());
}
+
+void MazeScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+ if (focusItem()) {
+ QGraphicsScene::mouseMoveEvent(event);
+ return;
+ }
+
+ if (event->buttons() & Qt::RightButton) {
+ QPointF delta(event->scenePos() - event->lastScenePos());
+ m_deltaYaw += delta.x() * 80;
+ m_deltaPitch -= delta.y() * 80;
+ }
+}
+
void MazeScene::keyPressEvent(QKeyEvent *event)
{
if (handleKey(event->key(), true)) {
@@ -704,9 +726,21 @@ void MazeScene::move()
QSet<Entity *> movedEntities;
long elapsed = m_time.elapsed();
bool walked = false;
- while (m_simulationTime <= elapsed) {
- m_camera.setYaw(m_camera.yaw() + m_turningSpeed);
- m_camera.setPitch(qBound(qreal(-30), m_camera.pitch() + m_pitchSpeed, qreal(30)));
+
+ const int stepSize = 5;
+ int steps = (elapsed - m_simulationTime) / stepSize;
+
+ if (steps) {
+ m_deltaYaw /= steps;
+ m_deltaPitch /= steps;
+
+ m_deltaYaw += m_turningSpeed;
+ m_deltaPitch += m_pitchSpeed;
+ }
+
+ for (int i = 0; i < steps; ++i) {
+ m_camera.setYaw(m_camera.yaw() + m_deltaYaw);
+ m_camera.setPitch(m_camera.pitch() + m_deltaPitch);
bool walking = false;
if (m_walkingVelocity != 0) {
@@ -730,8 +764,8 @@ void MazeScene::move()
walked = walked || walking;
if (walking)
- m_walkTime += 5;
- m_simulationTime += 5;
+ m_walkTime += stepSize;
+ m_simulationTime += stepSize;
foreach (Entity *entity, m_entities) {
if (entity->move(this))
@@ -739,12 +773,18 @@ void MazeScene::move()
}
}
- if (walked || m_turningSpeed != 0 || m_pitchSpeed != 0) {
+ if (walked || m_deltaYaw != 0 || m_deltaPitch != 0) {
updateTransforms();
} else {
foreach (Entity *entity, movedEntities)
entity->updateTransform(m_camera, m_walkTime * 0.001);
}
+
+ if (steps) {
+ m_deltaYaw = 0;
+ m_deltaPitch = 0;
+ }
+
}
void MazeScene::toggleDoors()
diff --git a/mazescene.h b/mazescene.h
index 32a9e62..3924520 100644
--- a/mazescene.h
+++ b/mazescene.h
@@ -62,7 +62,7 @@ public:
QPointF pos() const { return m_pos; }
void setYaw(qreal yaw) { m_yaw = yaw; }
- void setPitch(qreal pitch) { m_pitch = pitch; }
+ void setPitch(qreal pitch);
void setPos(const QPointF &pos) { m_pos = pos; }
Matrix4x4 matrix(qreal time) const;
@@ -153,6 +153,7 @@ public:
Camera camera() const { return m_camera; }
protected:
+ void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
void keyPressEvent(QKeyEvent *event);
void keyReleaseEvent(QKeyEvent *event);
bool eventFilter(QObject *target, QEvent *event);
@@ -187,6 +188,9 @@ private:
qreal m_turningSpeed;
qreal m_pitchSpeed;
+ qreal m_deltaYaw;
+ qreal m_deltaPitch;
+
QTime m_time;
QTimeLine *m_doorAnimation;
long m_simulationTime;