diff options
author | Samuel Rødal <srodal@gmail.com> | 2008-11-30 17:41:26 +0100 |
---|---|---|
committer | Samuel Rødal <srodal@gmail.com> | 2008-11-30 17:41:26 +0100 |
commit | 8b9e2e330c6d5d97b4170703e543adbd555e8be7 (patch) | |
tree | d8443301bec8b121299e34920b79f30b81daf43f /mazescene.cpp | |
parent | 67ccfa20650a55f6c4301bf334a92998ba90f59e (diff) |
Split into more source files.
Diffstat (limited to 'mazescene.cpp')
-rw-r--r-- | mazescene.cpp | 285 |
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")); -} |