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效果

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

相关推荐
言乐63 小时前
Python游戏水平测试辅助系统
开发语言·python·游戏·django·pygame
微小冷14 小时前
海康威视相机C#二次开发环境配置
数码相机·c#·.net·海康威视·相机开发
EanoJiang16 小时前
【UE】支持所有Graph的截图插件
游戏
浪里镖客16 小时前
realsense d435i相机所有内外参获得
数码相机
大锅盖116 小时前
Web 工单要调用相机,第一步不是打开取景框,而是建立能力门禁
前端·数码相机·harmonyos
市象19 小时前
暑期档市占3%,全景相机距离影像主赛道还有点远
数码相机·全景相机·手持影像
微小冷20 小时前
海康威视相机C#二次开发指图像采集
数码相机·c#·二次开发·机器视觉·海康威视·mvs·相机开发
埃科光电2 天前
丰富算法 易于集成:UB系列小面阵相机 持续上新
图像处理·数码相机·计算机视觉·制造·相机
双翌视觉2 天前
机器视觉引导上下料:给机械手装上一双“眼睛”
人工智能·数码相机·计算机视觉
huluang2 天前
专业级安卓现场取证利器:拍照取证(PaiZaoXue),补齐行业取证工具核心短板
android·数码相机