void Map::Update() { GameObjectPtr focusedObject = GameObject::GetFocusedObject(); if (focusedObject) { //TODO: Dynamic timing or something. 20ticks are somehow random... int mx, my; int dx=0, dy=0; focusedObject->GetMapPosition(mx, my); if (mx - dox < ox+walkarea.x) { Move(mx - dox - (ox+walkarea.x), 0, 20); } else if (mx - dox + walkarea.x > width+ox) { Move(mx - dox + walkarea.x - (width + ox), 0, 20); } if (my - doy < oy + walkarea.y) { Move(0, my - doy - (oy + walkarea.y), 20); } else if (my - doy + walkarea.y > width + oy) { Move(0, my - doy + walkarea.y - (width + oy), 20); } } //trigger foo if (focusedObject) { int mx, my; focusedObject->GetMapPosition(mx, my); for (auto t : triggers) { if (mx >= t.x&&mx <= t.x + t.w&&my >= t.y && my <= t.y + t.h) { ScriptEngine::RawEval(std::string("On") + t.name + "()"); //Run the callback for this trigger } } } if (ticksLeftMapMovement > 0) { float dx = (float)dox*(float)(movementLength-ticksLeftMapMovement) / (float)movementLength; float dy = (float)doy*(float)(movementLength - ticksLeftMapMovement) / (float)movementLength; mapMovementOffset = glm::vec4(tilesize[2] *dx, tilesize[3] * dy, 0.0f, 0.0f); glm::vec2 res = Env::GetResolution(); res.x = 1.0f / res.x; res.y = 1.0f / res.y; mapMovementOffset.x = floorf(mapMovementOffset.x / res.x)*res.x; mapMovementOffset.y = floorf(mapMovementOffset.y / res.y)*res.y; //clamp offset to pixels ticksLeftMapMovement--; } else if (ticksLeftMapMovement==0) { ticksLeftMapMovement--; mapMovementOffset = glm::vec4(0.0f); ox += dox; oy += doy; dox = 0; doy = 0; movementLength = 0; } for (auto c : children) { GameObjectPtr cPtr = std::dynamic_pointer_cast<GameObject>(c); if (cPtr) { cPtr->UpdatePositionFromMap(); } } BaseClass::Update(); }