qml练习:实现游戏相机(3)

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 &center = 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效果

人物在规定的地图范围内移动,并且有边界效果

相关推荐
上海云盾-小余1 小时前
BGP 高防与普通高防差异解析:游戏与政企业务该如何选型
游戏
_Evan_Yao1 小时前
当 if 成为性能判官:分支预测、流水线冲刷与 Java 中的“猜谜游戏”
人工智能·游戏
魔士于安1 小时前
Unity windows 同步 异步 打开文件文件夹工具
游戏·unity·游戏引擎·贴图·模型
魔士于安2 小时前
unity lowpoly 风格 城市 建筑 道路 交通标志
游戏·unity·游戏引擎·贴图·模型
^—app5668662 小时前
短剧游戏APP广告联盟SDK类型模块调用源代码
游戏
steven_yzx2 小时前
自动驾驶相机坐标系转换
人工智能·数码相机·自动驾驶
chushiyunen2 小时前
pygame实现射击游戏
python·游戏·pygame
steven_yzx3 小时前
自动驾驶相机坐标系转换2
人工智能·数码相机·自动驾驶
开开心心就好3 小时前
支持批量添加水印的实用工具推荐
人工智能·游戏·ci/cd·docker·音视频·语音识别·媒体
黑客说3 小时前
2026 AI 游戏热度排行榜|游戏推荐
人工智能·科技·游戏·娱乐