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

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

相关推荐
da_vinci_x5 小时前
【游戏场景】手绘贴图“接缝”地狱?PS 智能平铺流,3步量产无缝地砖
游戏·3d·prompt·aigc·贴图·技术美术·游戏美术
BlackWolfSky6 小时前
React中文网课程笔记2—实战教程之井字棋游戏
笔记·react.js·游戏
在风中的意志6 小时前
[数据库SQL] [leetcode-511] 511. 游戏玩法分析 I
数据库·sql·游戏
CodeCaptain6 小时前
Cocos Creator3.8.0 Tiled地图三合一完整脚本(加载+兼容性校验+坐标互转,一键可用,适配Tiled1.4.x)
游戏·cocos2d
CodeCaptain7 小时前
一个快速校验地图资源是否符合兼容要求的小脚本(Cocos Creator3.8.0)
游戏·typescript·cocos2d
minglie18 小时前
nim游戏原理
游戏
C66668888 小时前
机器视觉常见相机类型
数码相机·计算机视觉
tg-zm8899969 小时前
全开源PC+H5游戏账号交易网站源码/账号转让平台源码
游戏
小白开始进步10 小时前
USB相机连接与操作:基于OpenCV的完整实现
人工智能·数码相机·opencv