示例#1
0
void ScummEngine_v7::setCameraAt(int pos_x, int pos_y) {
	Common::Point old;

	old = camera._cur;

	camera._cur.x = pos_x;
	camera._cur.y = pos_y;

	clampCameraPos(&camera._cur);

	camera._dest = camera._cur;
	VAR(VAR_CAMERA_DEST_X) = camera._dest.x;
	VAR(VAR_CAMERA_DEST_Y) = camera._dest.y;

	assert(camera._cur.x >= (_screenWidth / 2) && camera._cur.y >= (_screenHeight / 2));

	if (camera._cur.x != old.x || camera._cur.y != old.y) {
		if (VAR(VAR_SCROLL_SCRIPT)) {
			VAR(VAR_CAMERA_POS_X) = camera._cur.x;
			VAR(VAR_CAMERA_POS_Y) = camera._cur.y;
			runScript(VAR(VAR_SCROLL_SCRIPT), 0, 0, 0);
		}

		// Even though cameraMoved() is called automatically, we may
		// need to know at once that the camera has moved, or text may
		// be printed at the wrong coordinates. See bugs #795938 and
		// #929242
		cameraMoved();
	}
}
void Z3DTrackballInteractionHandler::rollEvent(QMouseEvent *e, int w, int h)
{
    if (e->type() == QEvent::MouseButtonPress) {
        setState(ROLL);
        mousePressEvent(e, w, h);
    } else if (e->type() == QEvent::MouseButtonRelease) {
        mouseReleaseEvent(e, w, h);
    } else if (e->type() == QEvent::MouseMove) {
        mouseMoveEvent(e, w, h);
        emit cameraMoved();
    }
}
void Z3DTrackballInteractionHandler::keyRollEvent(QKeyEvent *e, int, int)
{
    bool accepted = false;
    if (e->key() == Qt::Key_Left) {
        m_camera->roll(m_keyPressAngle);
        accepted = true;
    } else if (e->key() == Qt::Key_Right) {
        m_camera->roll(-m_keyPressAngle);
        accepted = true;
    }
    if (accepted) {
        e->accept();
        emit cameraMoved();
    }
}
void Z3DTrackballInteractionHandler::keyDollyEvent(QKeyEvent *e, int, int)
{
    bool accepted = false;
    float factor = m_mouseMotionFactor * 0.1f * m_mouseWheelMotionFactor;
    if (e->key() == Qt::Key_Up || e->key() == Qt::Key_Equal) {
        m_camera->dolly(std::pow(1.1f, factor));
        accepted = true;
    }
    else if (e->key() == Qt::Key_Down || e->key() == Qt::Key_Minus) {
        m_camera->dolly(std::pow(1.1f, -factor));
        accepted = true;
    }
    if (accepted) {
        e->accept();
        emit cameraMoved();
    }
}
void Z3DTrackballInteractionHandler::keyRotateEvent(QKeyEvent *e, int, int)
{
    bool accepted = false;
    if (e->key() == Qt::Key_Left) {
        m_camera->rotate(m_keyPressAngle, m_camera->vectorEyeToWorld(glm::vec3(0.f, 1.f, 0.f)));
        accepted = true;
    } else if (e->key() == Qt::Key_Right) {
        m_camera->rotate(-m_keyPressAngle, m_camera->vectorEyeToWorld(glm::vec3(0.f, 1.f, 0.f)));
        accepted = true;
    } else if (e->key() == Qt::Key_Up) {
        m_camera->rotate(-m_keyPressAngle, m_camera->vectorEyeToWorld(glm::vec3(1.f, 0.f, 0.f)));
        accepted = true;
    } else if (e->key() == Qt::Key_Down) {
        m_camera->rotate(m_keyPressAngle, m_camera->vectorEyeToWorld(glm::vec3(1.f, 0.f, 0.f)));
        accepted = true;
    }
    if (accepted) {
        e->accept();
        emit cameraMoved();
    }
}
void Z3DTrackballInteractionHandler::keyShiftEvent(QKeyEvent *e, int w, int h)
{
    bool accepted = false;
    glm::ivec2 center(w/2, h/2);
    if (e->key() == Qt::Key_Left) {
        shift(center, center + glm::ivec2(-m_keyPressDistance, 0), w, h);
        accepted = true;
    } else if (e->key() == Qt::Key_Right) {
        shift(center, center + glm::ivec2(m_keyPressDistance, 0), w, h);
        accepted = true;
    } else if (e->key() == Qt::Key_Up) {
        shift(center, center + glm::ivec2(0, m_keyPressDistance), w, h);
        accepted = true;
    } else if (e->key() == Qt::Key_Down) {
        shift(center, center + glm::ivec2(0, -m_keyPressDistance), w, h);
        accepted = true;
    }
    if (accepted) {
        e->accept();
        emit cameraMoved();
    }
}
示例#7
0
void ScummEngine_v7::moveCamera() {
	Common::Point old = camera._cur;
	Actor *a = NULL;

	if (camera._follows) {
		a = derefActor(camera._follows, "moveCamera");
		if (ABS(camera._cur.x - a->_pos.x) > VAR(VAR_CAMERA_THRESHOLD_X) ||
				ABS(camera._cur.y - a->_pos.y) > VAR(VAR_CAMERA_THRESHOLD_Y)) {
			camera._movingToActor = true;
			if (VAR(VAR_CAMERA_THRESHOLD_X) == 0)
				camera._cur.x = a->_pos.x;
			if (VAR(VAR_CAMERA_THRESHOLD_Y) == 0)
				camera._cur.y = a->_pos.y;
			clampCameraPos(&camera._cur);
		}
	} else {
		camera._movingToActor = false;
	}

	if (camera._movingToActor) {
		VAR(VAR_CAMERA_DEST_X) = camera._dest.x = a->_pos.x;
		VAR(VAR_CAMERA_DEST_Y) = camera._dest.y = a->_pos.y;
	}

	assert(camera._cur.x >= (_screenWidth / 2) && camera._cur.y >= (_screenHeight / 2));

	clampCameraPos(&camera._dest);

	if (camera._cur.x < camera._dest.x) {
		camera._cur.x += (short) VAR(VAR_CAMERA_SPEED_X);
		if (camera._cur.x > camera._dest.x)
			camera._cur.x = camera._dest.x;
	}

	if (camera._cur.x > camera._dest.x) {
		camera._cur.x -= (short) VAR(VAR_CAMERA_SPEED_X);
		if (camera._cur.x < camera._dest.x)
			camera._cur.x = camera._dest.x;
	}

	if (camera._cur.y < camera._dest.y) {
		camera._cur.y += (short) VAR(VAR_CAMERA_SPEED_Y);
		if (camera._cur.y > camera._dest.y)
			camera._cur.y = camera._dest.y;
	}

	if (camera._cur.y > camera._dest.y) {
		camera._cur.y -= (short) VAR(VAR_CAMERA_SPEED_Y);
		if (camera._cur.y < camera._dest.y)
			camera._cur.y = camera._dest.y;
	}

	if (camera._cur.x == camera._dest.x && camera._cur.y == camera._dest.y) {

		camera._movingToActor = false;
		camera._accel.x = camera._accel.y = 0;
		VAR(VAR_CAMERA_SPEED_X) = VAR(VAR_CAMERA_SPEED_Y) = 0;
	} else {

		camera._accel.x += (short) VAR(VAR_CAMERA_ACCEL_X);
		camera._accel.y += (short) VAR(VAR_CAMERA_ACCEL_Y);

		VAR(VAR_CAMERA_SPEED_X) += camera._accel.x / 100;
		VAR(VAR_CAMERA_SPEED_Y) += camera._accel.y / 100;

		if (VAR(VAR_CAMERA_SPEED_X) < 8)
			VAR(VAR_CAMERA_SPEED_X) = 8;

		if (VAR(VAR_CAMERA_SPEED_Y) < 8)
			VAR(VAR_CAMERA_SPEED_Y) = 8;

	}

	cameraMoved();

	if (camera._cur.x != old.x || camera._cur.y != old.y) {
		VAR(VAR_CAMERA_POS_X) = camera._cur.x;
		VAR(VAR_CAMERA_POS_Y) = camera._cur.y;

		if (VAR(VAR_SCROLL_SCRIPT))
			runScript(VAR(VAR_SCROLL_SCRIPT), 0, 0, 0);
	}
}
示例#8
0
void ScummEngine::moveCamera() {
	int pos = camera._cur.x;
	int actorx, t;
	Actor *a = NULL;

	camera._cur.x &= 0xFFF8;

	if (VAR_CAMERA_MIN_X != 0xFF && camera._cur.x < VAR(VAR_CAMERA_MIN_X)) {
		if (VAR_CAMERA_FAST_X != 0xFF && VAR(VAR_CAMERA_FAST_X))
			camera._cur.x = (short) VAR(VAR_CAMERA_MIN_X);
		else
			camera._cur.x += 8;
		cameraMoved();
		return;
	}

	if (VAR_CAMERA_MAX_X != 0xFF && camera._cur.x > VAR(VAR_CAMERA_MAX_X)) {
		if (VAR_CAMERA_FAST_X != 0xFF && VAR(VAR_CAMERA_FAST_X))
			camera._cur.x = (short) VAR(VAR_CAMERA_MAX_X);
		else
			camera._cur.x -= 8;
		cameraMoved();
		return;
	}

	if (camera._mode == kFollowActorCameraMode) {
		a = derefActor(camera._follows, "moveCamera");

		actorx = a->_pos.x;
		t = actorx / 8 - _screenStartStrip;

		if (t < camera._leftTrigger || t > camera._rightTrigger) {
			if (VAR_CAMERA_FAST_X != 0xFF && VAR(VAR_CAMERA_FAST_X)) {
				if (t > 35)
					camera._dest.x = actorx + 80;
				if (t < 5)
					camera._dest.x = actorx - 80;
			} else
				camera._movingToActor = true;
		}
	}

	if (camera._movingToActor) {
		a = derefActor(camera._follows, "moveCamera(2)");
		camera._dest.x = a->_pos.x;
	}

	if (VAR_CAMERA_MIN_X != 0xFF && camera._dest.x < VAR(VAR_CAMERA_MIN_X))
		camera._dest.x = (short) VAR(VAR_CAMERA_MIN_X);

	if (VAR_CAMERA_MAX_X != 0xFF && camera._dest.x > VAR(VAR_CAMERA_MAX_X))
		camera._dest.x = (short) VAR(VAR_CAMERA_MAX_X);

	if (VAR_CAMERA_FAST_X != 0xFF && VAR(VAR_CAMERA_FAST_X)) {
		camera._cur.x = camera._dest.x;
	} else {
		if (camera._cur.x < camera._dest.x)
			camera._cur.x += 8;
		if (camera._cur.x > camera._dest.x)
			camera._cur.x -= 8;
	}

	/* a is set a bit above */
	if (camera._movingToActor && (camera._cur.x / 8) == (a->_pos.x / 8)) {
		camera._movingToActor = false;
	}

	cameraMoved();

	if (VAR_SCROLL_SCRIPT != 0xFF && VAR(VAR_SCROLL_SCRIPT) && pos != camera._cur.x) {
		VAR(VAR_CAMERA_POS_X) = camera._cur.x;
		runScript(VAR(VAR_SCROLL_SCRIPT), 0, 0, 0);
	}
}
void Z3DTrackballInteractionHandler::rollEvent(QWheelEvent *e, int w, int h)
{
    setState(ROLL);
    wheelEvent(e, w, h);
    emit cameraMoved();
}