QT桌面宠物+桌面大鹅(1)

前言

记录一下自己想做的一个小项目的过程,主要是看到了有一款桌面软件很有意思,名叫 Desktop Goose,他应该是使用Unity去做的,我也想有一个自己的要是能够将它的功能复现并且还能加上播放音乐,根据时间提示我该去干嘛了等功能就更好了。话不多说,说干就干,再写这篇文章的时候,已经能将大鹅的基本功能进行实现。

阶段一

阶段一先实现大鹅的基础功能,能够每经过一段事件进行移动,并且会有一定的速度,要能够在之后进行速度控制,并且在移动时不能拖动。
我使用Qt 的 QThread 类来创建新线程来控制鹅在桌面上的移动速度,这样方便之后让我的大鹅能够拥有自己的速度。并且能够在该线程中每隔一段事件移动一下大鹅的位置。

该线程的.h代码:

#ifndef GOOSETHREAD_H
#define GOOSETHREAD_H
#include <QRect>
#include <QThread>
#include <QTimer>
#include <cstdlib>
#include <ctime>
#include <QGuiApplication>
#include <QScreen>
#include <QApplication>
#include <qmath.h>
extern QPoint currentPosition;
class GooseThread : public QThread
{
    Q_OBJECT

public:
    explicit GooseThread(QObject *parent = nullptr);
    void run() override;
    void onTimer();
    bool isMoving()const;


signals:
    void moveGoose(int x, int y);
    //void enableMouseTracking(bool enabled);

private:
    int m_speed;
    int m_moveInterval = 50;
    int screenWidth;
    int screenHeight;
    bool m_isMoving; // 添加标志变量
    int m_pauseInterval = 30000;
    int counter = 0;
    QRect screenRect;
    QTimer *m_timer;
};
#endif // GOOSETHREAD_H

该线程的.c文件代码

#include "goosethread.h"
#include "QDebug"

QPoint currentPosition(0, 0); // 初始化大鹅位置为屏幕左上角
GooseThread::GooseThread(QObject *parent):QThread(parent), m_speed(500),m_isMoving(false)
{
    //QPoint currentPosition(0, 0);
//    m_timer = new QTimer(this);
//    connect(m_timer, &QTimer::timeout, this, &GooseThread::onTimer);
//    m_timer->start(10000); // 每隔一秒钟触发一次
}

void GooseThread::run()
{
//    while (true) {

//            QThread::msleep(m_speed);
//    }


    QRect screenRect = QGuiApplication::primaryScreen()->geometry();
    int screenWidth = screenRect.width();
    int screenHeight = screenRect.height();
    while (true) {
        //emit enableMouseTracking(false);
        // 生成随机位置
        int x = qrand() % screenWidth;
        int y = qrand() % screenHeight;
        QPoint newPosition(x, y);

        // 计算大鹅移动的速度和方向
        qreal dx = newPosition.x() - currentPosition.x();
        qreal dy = newPosition.y() - currentPosition.y();
        qreal distance = qSqrt(dx * dx + dy * dy);
        qreal speed = m_speed / 5000.0; // 毫秒转换为秒
        qreal duration = distance / speed;
        qreal vx = dx / duration;
        qreal vy = dy / duration;
        m_isMoving = true; // 开始移动,禁止鼠标拖拽事件
        // 更新大鹅的位置
        for (qreal t = 0; t < duration; t += m_moveInterval) {
            currentPosition.setX(currentPosition.x() + vx * m_moveInterval);
            currentPosition.setY(currentPosition.y() + vy * m_moveInterval);
            emit moveGoose(currentPosition.x(), currentPosition.y());
            qDebug() << "1" <<currentPosition;
            QThread::msleep(m_moveInterval);
        }
        m_isMoving = false; // 移动结束,允许鼠标拖拽事件
        //emit enableMouseTracking(true);
        currentPosition = newPosition;
        msleep(m_pauseInterval);

    }
}

bool GooseThread::isMoving() const
{
    return m_isMoving;
}

//void GooseThread::onTimer()
//{
//    QRect screenRect = QGuiApplication::primaryScreen()->geometry();
//    int screenWidth = screenRect.width();
//    int screenHeight = screenRect.height();
//    // 设置随机数种子
//    srand(time(NULL));
//    // 生成随机坐标
//    int newX = rand() % screenWidth;
//    int newY = rand() % screenHeight;

//        // 发送移动信号
//        emit moveGoose(newX, newY);
//}

在这里我们定义了一个全局变量来保存大鹅的位置,将鼠标移动的坐标也保存在里面。
在主窗口中,我暂时添加了鼠标拖拉大鹅,判断是否大鹅在移动,移动的时候将拖拽事件禁止 。
widget.cpp代码如下:

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>


Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    m_Menu = new QMenu(this);
    m_Action = new QAction(this);
    m_Action->setText("退出");
    m_Menu->addAction(m_Action);
    backgroundWidget *m_backgroundWidget = new backgroundWidget(this);
    ui->backDoose->addWidget(m_backgroundWidget);
    setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
    setAttribute(Qt::WA_TranslucentBackground);
    setMouseTracking(true);
    m_gooseThread = new GooseThread(this);
    connect(m_gooseThread, &GooseThread::moveGoose, this, &Widget::moveGoose);
    connect(m_Action,&QAction::triggered,this,[=](){
        qApp->exit(0);
    });
    //connect(m_gooseThread, &GooseThread::enableMouseTracking,this,&Widget::setMouseTrackingEnabled);
    m_gooseThread->start();
}

Widget::~Widget()
{
    delete ui;
}

void Widget::moveGoose(int dx, int dy)
{
    this->move(dx,dy);           // 移动大鹅图像
}

void Widget::mouseMoveEvent(QMouseEvent *event)
{
//    if (event->buttons() & Qt::LeftButton) {
//           int dx = event->pos().x() - currentPosition.x();
//           int dy = event->pos().y() - currentPosition.y();
//           move(x() + dx, y() + dy);
//           currentPosition = event->pos();
//           event->accept();
//    }
    if (m_gooseThread->isMoving()) { // 如果大鹅正在移动,则禁止拖拽事件
        event->ignore();
        return;
    }
    currentPosition = event->globalPos() - mOffese;
    qDebug() << currentPosition;
    this->move(currentPosition);

}

void Widget::mousePressEvent(QMouseEvent *event)
{
//    QPoint currentPosition = mapFromGlobal(QCursor::pos());
//    if (event->button() == Qt::LeftButton) {
//           currentPosition = event->pos();
//           event->accept();
//    }

    mOffese = event->globalPos() - this->pos();
}

void Widget::contextMenuEvent(QContextMenuEvent *event)
{
    m_Menu->exec(QCursor::pos());

    event->accept();
}

//void Widget::setMouseTrackingEnabled(bool enabled)
//{
//    QWidget::setMouseTracking(enabled);
//        if (enabled) {
//            this->setCursor(Qt::OpenHandCursor);
//        } else {
//            this->setCursor(Qt::ArrowCursor);
//        }
//}

实现以下功能: 1. 宠物的外观和动作设计,包括不同的表情、动作和声音效果。 2. 宠物的基本行为,包括走路、跳跃、摇头、摆尾等。 3. 宠物的基本需求,包括饥饿、口渴、睡眠和生病等,并且能够根据宠物的需求进行相应的处理。 4. 宠物的互动,包括和用户进行交互,如通过键盘、鼠标等输入设备来和宠物进行互动,可以和宠物玩游戏、聊天、喂食等。 5. 宠物的成长和进化,可以根据宠物的行为和需求的满足程度来进行成长和进化,比如宠物的等级、能力值、外观等。 6. 数据持久化,可以将宠物的状态保存在本地文件或者数据库中,以便下一次启动时能够继续上一次的游戏。 实现过程: 1. 设计宠物的外观和动作,可以使用QT中的QPixmap和QMovie类来实现,通过定时器来控制不同表情和动作的切换。 2. 实现宠物的基本行为,可以通过定时器来控制宠物的移动和动作。 3. 实现宠物的基本需求,可以通过定时器来控制宠物的饥饿、口渴、睡眠和生病等状态,并且根据宠物的需求进行相应的处理。 4. 实现宠物的互动,可以通过键盘、鼠标等输入设备来和宠物进行互动,比如通过键盘输入来控制宠物的行为,通过鼠标点击来进行喂食、玩游戏等操作。 5. 实现宠物的成长和进化,可以根据宠物的行为和需求的满足程度来进行成长和进化,比如通过计算宠物的经验值来提升等级,通过满足宠物的需求来提升能力值,通过改变宠物的外观来进行进化等。 6. 实现数据持久化,可以通过QT中的QSettings、QFile、QSqlDatabase等类来进行数据的保存和读取,以便下一次启动时能够继续上一次的游戏。 需要注意的是,在开发过程中需要考虑宠物的性别、品种等因素,以及宠物之间的互动和交配等功能,还需要考虑宠物的AI算法,以便使宠物的行为更加智能化和自然化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值