summaryrefslogtreecommitdiffstats
path: root/mazescene.cpp
diff options
context:
space:
mode:
authorSamuel Rødal <srodal@gmail.com>2008-11-30 17:41:26 +0100
committerSamuel Rødal <srodal@gmail.com>2008-11-30 17:41:26 +0100
commit8b9e2e330c6d5d97b4170703e543adbd555e8be7 (patch)
treed8443301bec8b121299e34920b79f30b81daf43f /mazescene.cpp
parent67ccfa20650a55f6c4301bf334a92998ba90f59e (diff)
Split into more source files.
Diffstat (limited to 'mazescene.cpp')
-rw-r--r--mazescene.cpp285
1 files changed, 4 insertions, 281 deletions
diff --git a/mazescene.cpp b/mazescene.cpp
index 730e2e3..6a516c5 100644
--- a/mazescene.cpp
+++ b/mazescene.cpp
@@ -15,6 +15,8 @@
#include <qdebug.h>
#include "matrix4x4.h"
+#include "scriptwidget.h"
+#include "entity.h"
#ifdef USE_PHONON
#include "mediaplayer/mediaplayer.h"
@@ -155,7 +157,7 @@ static inline QTransform rotatingTransform(qreal angle)
return transform;
}
-void MazeScene::drawBackground(QPainter *painter, const QRectF &rect)
+void MazeScene::drawBackground(QPainter *painter, const QRectF &)
{
static QImage floor = QImage("floor.png").convertToFormat(QImage::Format_RGB32);
QBrush floorBrush(floor);
@@ -406,6 +408,7 @@ void ProjectedItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *, Q
void ProjectedItem::setAnimationTime(qreal time)
{
+ // hacky way of handling door animation
QRectF rect = boundingRect();
m_targetRect = QRectF(QPointF(rect.left() + rect.width() * time, rect.top()),
rect.bottomRight());
@@ -683,283 +686,3 @@ void MazeScene::toggleRenderer()
else
view->setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));
}
-
-const QImage toAlpha(const QImage &image)
-{
- if (image.isNull())
- return image;
- QRgb alpha = image.pixel(0, 0);
- QImage result = image.convertToFormat(QImage::Format_ARGB32_Premultiplied);
- QRgb *data = reinterpret_cast<QRgb *>(result.bits());
- int size = image.width() * image.height();
- for (int i = 0; i < size; ++i)
- if (data[i] == alpha)
- data[i] = 0;
- return result;
-}
-
-Entity::Entity(const QPointF &pos)
- : ProjectedItem(QRectF(-0.3, -0.4, 0.6, 0.9), false)
- , m_pos(pos)
- , m_angle(180)
- , m_walking(false)
- , m_walked(false)
- , m_turnVelocity(0)
- , m_useTurnTarget(false)
- , m_animationIndex(0)
- , m_angleIndex(0)
-{
- startTimer(300);
-}
-
-void Entity::walk()
-{
- m_walking = true;
-}
-
-void Entity::stop()
-{
- m_walking = false;
- m_useTurnTarget = false;
- m_turnVelocity = 0;
-}
-
-void Entity::turnTowards(qreal x, qreal y)
-{
- m_turnTarget = QPointF(x, y);
- m_useTurnTarget = true;
-}
-
-void Entity::turnLeft()
-{
- m_useTurnTarget = false;
- m_turnVelocity = -0.5;
-}
-
-void Entity::turnRight()
-{
- m_useTurnTarget = false;
- m_turnVelocity = 0.5;
-}
-
-static QVector<QImage> loadSoldierImages()
-{
- QVector<QImage> images;
- for (int i = 1; i <= 40; ++i) {
- QImage image(QString("soldier/O%0.png").arg(i, 2, 10, QLatin1Char('0')));
- images << toAlpha(image.convertToFormat(QImage::Format_RGB32));
- }
- return images;
-}
-
-static inline int mod(int x, int y)
-{
- return ((x % y) + y) % y;
-}
-
-void Entity::updateTransform(const Camera &camera, qreal time)
-{
- qreal angleToCamera = QLineF(m_pos, camera.pos()).angle();
- int cameraAngleIndex = mod(qRound(angleToCamera + 22.5), 360) / 45;
-
- m_angleIndex = mod(qRound(cameraAngleIndex * 45 - m_angle + 22.5), 360) / 45;
-
- QPointF delta = QLineF::fromPolar(1, 270.1 + 45 * cameraAngleIndex).p2();
- setPosition(m_pos - delta, m_pos + delta);
-
- updateImage();
- ProjectedItem::updateTransform(camera, time);
-}
-
-bool Entity::move(MazeScene *scene)
-{
- bool moved = false;
- if (m_useTurnTarget) {
- qreal angleToTarget = QLineF::fromPolar(1, m_angle)
- .angleTo(QLineF(m_pos, m_turnTarget));
-
- if (angleToTarget != 0) {
- if (angleToTarget >= 180)
- angleToTarget -= 360;
-
- if (angleToTarget < 0)
- m_angle -= qMin(-angleToTarget, 0.5);
- else
- m_angle += qMin(angleToTarget, 0.5);
- moved = true;
- }
- } else if (m_turnVelocity != 0) {
- m_angle += m_turnVelocity;
- moved = true;
- }
-
- m_walked = false;
- if (m_walking) {
- QPointF walkingDelta = QLineF::fromPolar(0.006, m_angle).p2();
- if (scene->tryMove(m_pos, walkingDelta, this)) {
- moved = true;
- m_walked = true;
- }
- }
-
- return moved;
-}
-
-void Entity::timerEvent(QTimerEvent *)
-{
- ++m_animationIndex;
- updateImage();
-}
-
-void Entity::updateImage()
-{
- static QVector<QImage> images = loadSoldierImages();
- if (m_walked)
- setImage(images.at(8 + 8 * (m_animationIndex % 4) + m_angleIndex));
- else
- setImage(images.at(m_angleIndex));
-}
-
-void MazeScene::addEntity(Entity *entity)
-{
- addItem(entity);
- m_entities << entity;
-}
-
-static QScriptValue qsRand(QScriptContext *, QScriptEngine *engine)
-{
- QScriptValue value(engine, qrand() / (RAND_MAX + 1.0));
- return value;
-}
-
-void ScriptWidget::setPreset(int preset)
-{
- const char *presets[] =
- {
- "// available functions:\n"
- "// entity.turnLeft()\n"
- "// entity.turnRight()\n"
- "// entity.turnTowards(x, y)\n"
- "// entity.walk()\n"
- "// entity.stop()\n"
- "// rand()\n"
- "// script.display()\n"
- "\n"
- "// available variables:\n"
- "// my_x\n"
- "// my_y\n"
- "// player_x\n"
- "// player_y\n"
- "// time\n"
- "\n"
- "entity.stop();\n",
- "entity.walk();\n"
- "if ((time % 20000) < 10000) {\n"
- " entity.turnTowards(10, 2.5);\n"
- " if (my_x >= 5.5)\n"
- " entity.stop();\n"
- "} else {\n"
- " entity.turnTowards(-10, 2.5);\n"
- " if (my_x <= 2.5)\n"
- " entity.stop();\n"
- "}\n",
- "dx = player_x - my_x;\n"
- "dy = player_y - my_y;\n"
- "if (dx * dx + dy * dy < 5) {\n"
- " entity.stop();\n"
- "} else {\n"
- " entity.walk();\n"
- " entity.turnTowards(player_x, player_y);\n"
- "}\n"
- };
-
- m_sourceEdit->setPlainText(QLatin1String(presets[preset]));
-}
-
-ScriptWidget::ScriptWidget(MazeScene *scene, Entity *entity)
- : m_scene(scene)
- , m_entity(entity)
-{
- new QVBoxLayout(this);
-
- m_statusView = new QLineEdit;
- m_statusView->setReadOnly(true);
- layout()->addWidget(m_statusView);
-
- m_sourceEdit = new QPlainTextEdit;
- layout()->addWidget(m_sourceEdit);
-
- QPushButton *compileButton = new QPushButton(QLatin1String("Compile"));
- layout()->addWidget(compileButton);
-
- QComboBox *combo = new QComboBox;
- layout()->addWidget(combo);
-
- combo->addItem(QLatin1String("Default"));
- combo->addItem(QLatin1String("Patrol"));
- combo->addItem(QLatin1String("Follow"));
-
- setPreset(0);
- connect(combo, SIGNAL(currentIndexChanged(int)), this, SLOT(setPreset(int)));
- connect(compileButton, SIGNAL(clicked()), this, SLOT(updateSource()));
-
- m_engine = new QScriptEngine(this);
- QScriptValue entityObject = m_engine->newQObject(m_entity);
- m_engine->globalObject().setProperty("entity", entityObject);
- QScriptValue widgetObject = m_engine->newQObject(this);
- m_engine->globalObject().setProperty("script", widgetObject);
- m_engine->globalObject().setProperty("rand", m_engine->newFunction(qsRand));
-
- m_engine->setProcessEventsInterval(5);
-
- resize(300, 400);
- updateSource();
-
- startTimer(50);
- m_time.start();
-}
-
-void ScriptWidget::timerEvent(QTimerEvent *)
-{
- QPointF player = m_scene->camera().pos();
- QPointF entity = m_entity->pos();
-
- QScriptValue px(m_engine, player.x());
- QScriptValue py(m_engine, player.y());
- QScriptValue ex(m_engine, entity.x());
- QScriptValue ey(m_engine, entity.y());
- QScriptValue time(m_engine, m_time.elapsed());
-
- m_engine->globalObject().setProperty("player_x", px);
- m_engine->globalObject().setProperty("player_y", py);
- m_engine->globalObject().setProperty("my_x", ex);
- m_engine->globalObject().setProperty("my_y", ey);
- m_engine->globalObject().setProperty("time", time);
-
- m_engine->evaluate(m_source);
- if (m_engine->hasUncaughtException()) {
- QString text = m_engine->uncaughtException().toString();
- m_statusView->setText(text);
- }
-}
-
-void ScriptWidget::display(QScriptValue value)
-{
- m_statusView->setText(value.toString());
-}
-
-void ScriptWidget::updateSource()
-{
- bool wasEvaluating = m_engine->isEvaluating();
- if (wasEvaluating)
- m_engine->abortEvaluation();
-
- m_time.restart();
- m_source = m_sourceEdit->toPlainText();
- if (wasEvaluating)
- m_statusView->setText(QLatin1String("Aborted long running evaluation!"));
- else if (m_engine->canEvaluate(m_source))
- m_statusView->setText(QLatin1String("Evaluation succeeded"));
- else
- m_statusView->setText(QLatin1String("Evaluation failed"));
-}