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

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

相关推荐
揽星河..3 小时前
【C语言】猜数字游戏
c语言·算法·游戏
释厄6234 小时前
AI 军备竞赛悖论——为 AI 卖游戏但 AI 需要游戏母场景
人工智能·游戏·kotlin
FLJwu7 小时前
《运动相机硬件防护选型实战》专栏|第二篇(PPTC 自恢复保险丝)
android·经验分享·数码相机·1024程序员节·运动相机
江苏久众新视8 小时前
SOP流程AI视觉检测实战案例:基于安防相机与本地AI的产线防错防漏方案落地分享
人工智能·数码相机·视觉检测
郝学胜-神的一滴8 小时前
游戏设计:原型与开发 17:数字化系统里的思维体操
人工智能·游戏·游戏程序·游戏策划·游戏设计
驱动小百科1 天前
国产3A游戏《影之刃零》正式发售:售价及电脑配置要求介绍
游戏·影之刃零·影之刃零配置要求·影之刃零下载·影之刃零售价
信奥卷王1 天前
[GESP202312 六级] 闯关游戏
游戏
德迅云安全-上官1 天前
德迅游戏盾:面向 TCP 业务的分布式云安全防护方案
分布式·tcp/ip·游戏
科技那些事儿1 天前
旗舰游戏本 CPU 对决:锐龙 9 9955HX 对比酷睿 Ultra 9 275HX
游戏·智能手机·智能电视
njsgcs1 天前
老滚5 文本替换中文简体 仓库加经验glm5.3f
游戏