1.相机的概念
相机是游戏设计中很重要的一个环节,他把地图的视角单独的抽离了出来,实现了地图坐标的统一,方便后续地图的显示和人物的绘制
2代码实现
// Camera.h
#pragma once
#include <QObject>
#include <QRectF>
#include <QPointF>
#include <QSizeF>
namespace gameTools {
class Camera : public QObject
{
Q_OBJECT
Q_PROPERTY(QPointF position READ position WRITE setPosition NOTIFY positionChanged)
Q_PROPERTY(qreal zoom READ zoom WRITE setZoom NOTIFY zoomChanged)
Q_PROPERTY(QRectF viewport READ viewport NOTIFY viewportChanged)
Q_PROPERTY(QSizeF viewportSize READ viewportSize WRITE setViewportSize NOTIFY viewportSizeChanged)
Q_PROPERTY(bool followTarget READ followTarget WRITE setFollowTarget NOTIFY followTargetChanged)
Q_PROPERTY(QPointF targetPosition READ targetPosition WRITE setTargetPosition NOTIFY targetPositionChanged)
Q_PROPERTY(qreal followSpeed READ followSpeed WRITE setFollowSpeed NOTIFY followSpeedChanged)
Q_PROPERTY(QRectF worldBounds READ worldBounds WRITE setWorldBounds NOTIFY worldBoundsChanged)
public:
explicit Camera(QObject *parent = nullptr);
explicit Camera(const QSizeF &viewportSize, QObject *parent = nullptr);
// 相机变换方法
QTransform viewTransform() const;
QTransform inverseViewTransform() const;
// 坐标转换
QPointF screenToWorld(const QPointF &screenPos) const;
QPointF worldToScreen(const QPointF &worldPos) const;
QRectF screenToWorld(const QRectF &screenRect) const;
QRectF worldToScreen(const QRectF &worldRect) const;
// 相机移动
void moveTo(const QPointF &position);
void moveBy(const QPointF &delta);
void centerOn(const QPointF &worldPos);
// 缩放
void zoomTo(qreal zoomLevel);
void zoomBy(qreal factor, const QPointF ¢er = QPointF());
// 跟随目标更新
void updateFollow(qreal deltaTime);
// 边界检查
void clampToBounds();
// Getters
QPointF position() const { return m_position; }
qreal zoom() const { return m_zoom; }
QRectF viewport() const { return m_viewport; }
QSizeF viewportSize() const { return m_viewportSize; }
bool followTarget() const { return m_followTarget; }
QPointF targetPosition() const { return m_targetPosition; }
qreal followSpeed() const { return m_followSpeed; }
QRectF worldBounds() const { return m_worldBounds; }
// Setters
void setPosition(const QPointF &position);
void setZoom(qreal zoom);
void setViewportSize(const QSizeF &size);
void setFollowTarget(bool follow);
void setTargetPosition(const QPointF &position);
void setFollowSpeed(qreal speed);
void setWorldBounds(const QRectF &bounds);
signals:
void positionChanged(const QPointF &position);
void zoomChanged(qreal zoom);
void viewportChanged(const QRectF &viewport);
void viewportSizeChanged(const QSizeF &size);
void followTargetChanged(bool follow);
void targetPositionChanged(const QPointF &position);
void followSpeedChanged(qreal speed);
void worldBoundsChanged(const QRectF &bounds);
private:
void updateViewport();
QPointF m_position; // 相机中心点(世界坐标)
qreal m_zoom; // 缩放级别(1.0为原始大小)
QRectF m_viewport; // 当前可见区域(世界坐标)
QSizeF m_viewportSize; // 视口大小(屏幕像素)
bool m_followTarget; // 是否跟随目标
QPointF m_targetPosition; // 目标位置
qreal m_followSpeed; // 跟随速度(0-1)
QRectF m_worldBounds; // 世界边界
bool m_bounded; // 是否限制在边界内
};
} // namespace gameTools
3效果
人物在规定的地图范围内移动,并且有边界效果