qt实现类似windows的屏幕保护(小球碰撞动画)

最近看了篇文章啊,讲的就是让小球进行移动,可能别人做的是仿真啊,用到了太多的数学函数,什么运动学,各种的,我就想着,自己能不能使用qt实现下这种效果,就是有一个球不停的移动,当碰到边框的时候就进行反方向移动。原理很简单,首先不停的重绘球体位置,其他就是计算的问题了。
直接看代码吧!
.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <qpainter.h>
#include <QTime>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

protected:
    void paintEvent(QPaintEvent *event);

protected slots:
    void on_timer_timeout();

private:
    QTimer *m_time;

    int m_X=10;
    int m_Y=10;

    bool m_bColl=false;

    bool m_bYcoll=false;
};
#endif // WIDGET_H

.cpp

#include "widget.h"
#include <QTimer>
#include <qdebug.h>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    this->resize(800,500);
    m_time=new QTimer(this);
    m_time->stop();
    m_time->setInterval (10) ;//设置定时周期,单位:毫秒
    m_time->start();
    connect(m_time,SIGNAL(timeout()),this,SLOT(on_timer_timeout()));

}

Widget::~Widget()
{
}

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter paint(this);
    paint.setRenderHint(QPainter::Antialiasing, true);
    paint.setPen(QColor("red"));
    paint.setBrush(QBrush(QColor("green")));
    if(m_bColl==false)
    {
        m_X=m_X+1;
        if(m_bYcoll==false)
        {
            m_Y=m_Y+1;
            paint.drawEllipse(m_X,m_Y,50,50);
        }
        else
        {
            m_Y=m_Y-1;
            paint.drawEllipse(m_X,m_Y,50,50);
        }

    }
    else
    {
        m_X=m_X-1;
        if(m_bYcoll==false)
        {
            m_Y=m_Y+1;
            paint.drawEllipse(m_X,m_Y,50,50);
        }
        else
        {
            m_Y=m_Y-1;
            paint.drawEllipse(m_X,m_Y,50,50);
        }
    }

}

void Widget::on_timer_timeout()
{
    if(m_X+50>=this->width())
    {
        m_bColl=true;  //反方向走
    }
    if(m_X<=0)
    {
        m_bColl=false;
    }
    if(m_Y+50>=this->height())
    {
        m_bYcoll=true;
    }
    if(m_Y<=0)
    {
        m_bYcoll=false;
    }
    update();
}


效果图:
在这里插入图片描述

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加油小杜(接qt定制功能,单模块开发等)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值