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 天前
CentOS 7.6 YUM源更换完整教程
游戏
格林威1 天前
工业相机Chunk功能全解析:图像嵌入时间戳、编码器元数据(附堡盟C#代码)
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
XMAIPC_Robot1 天前
RK3588四路1080P工业MIPI相机视觉网关,同时支持RK3588+FPGA的24路相机同步方案
人工智能·数码相机
德迅云安全-上官1 天前
德迅云安全游戏盾与DDoS高防IP对比:差异、优势及选型指南
tcp/ip·游戏·ddos
丁小未2 天前
Unity 几种常见合批手段的要求
游戏·unity·合批·srpbatcher·动态合批·静态合批
河南花仙子科技2 天前
花仙子科技详解:小游戏合规开发完整要点
科技·游戏
吐了啊取名字太难2 天前
美颜系统AI修图本地跑并支持Mac、win、安卓、iOS不卡顿
android·人工智能·windows·数码相机·mac·ai编程
旧物有情2 天前
游戏开发常用架构 #MVP,MVC
游戏·unity·架构·mvc
笨鸟先飞的橘猫2 天前
游戏后端分布式学习——一致性协议Raft
分布式·学习·游戏
科技圈快迅2 天前
科美锐(Komery)新手入门数码相机产品梳理:百元到千元,不同价位实际能买到什么
数码相机