标签:mamicode data setup rand pen date() tab cti date
该设计使用了鼠标事件、键盘事件、绘图事件,可通过鼠标或者方向键控制人物移动吃到月亮
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QPaintEvent> //绘图事件 #include <QMouseEvent> //鼠标 #include <QPoint> #include <QKeyEvent> //键盘 #include <QPainter> #include <QList> #include <QLineEdit> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = nullptr); ~Widget(); public: int random_x; //保存月亮随机坐标 int random_y; int direction; //保存键盘事件 int Score = 0; //得分 QString Score_data; //保存得分 bool meet = false; QPainter *painter; QLineEdit *line; void Wall_x(int &); void Wall_y(int &); //遇见墙壁 void meet_s(); //遇到月亮,重画月亮 int Xrandom(); //产生随机数 int Yrandom(); //产生随机数 void Direction(); //控制人物改变方向 void paintEvent(QPaintEvent *event); //绘图 void mousePressEvent(QMouseEvent *event); //鼠标点击 void mouseMoveEvent(QMouseEvent *event); //鼠标拖动 void keyPressEvent(QKeyEvent *event); //键盘事件 private: QPoint point; private: Ui::Widget *ui; }; #endif // WIDGET_H
#include "widget.h" #include "ui_widget.h" #include <QDebug> #include <QPainter> //绘图画家 #include <QTime> #include <QMutableListIterator> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); this->setMinimumSize(500,500); //窗口大小 point.setX(this->width()/2); //初始化人物 在窗口中央 point.setY(this->width()/2); random_x = Xrandom(); //初始化月亮 random_y = Yrandom(); } void Widget::mousePressEvent(QMouseEvent *event) //鼠标点击 { qDebug() << event->pos() ; point = event->pos(); update(); } void Widget:: mouseMoveEvent(QMouseEvent *event) //鼠标拖动 { qDebug() <<event->pos(); point = event->pos(); update(); } void Widget::Wall_x(int &x) //遇见墙壁 { if(x <= 20) { x += 50; //遇见就弹回 Score -= 3; } else if (x >= this->width()-40) { x -= 50; Score -= 3; } } void Widget::Wall_y(int &y) //遇见墙壁 { if(y <= 20) { y += 50; Score -= 3; } else if (y >= this->height()-40) { y -= 50; Score -= 3; } } void Widget::keyPressEvent(QKeyEvent *event) //键盘事件,控制人物移动 { int x = point.x(); int y = point.y(); qDebug() << event->key() ; direction = event->key(); switch(event->key()) { case Qt::Key_Up: //上 qDebug() <<"上"; y -= 10; Wall_y(y); break; case Qt::Key_Down: //下 qDebug() <<"下"; y += 10; Wall_y(y); break; case Qt::Key_Left: //左 qDebug() <<"左"; x -= 10; Wall_x(x); break; case Qt::Key_Right: //右 qDebug() <<"右"; x += 10; Wall_x(x); break; default : break; } point.setX(x) ; point.setY(y); qDebug() <<x <<":" <<y; } int Widget::Xrandom() //产生随机数 { int random_q; QTime time; time= QTime::currentTime(); qsrand(time.msec()+time.second()*1000); random_q = qrand() % (this->width()-40); if(random_q < 20) random_q += 20; return random_q; } int Widget::Yrandom() //产生随机数 { int random_q; QTime time; time= QTime::currentTime(); qsrand(time.msec()+time.second()*1000); random_q = qrand() % (this->height()-40); if(random_q < 20) random_q += 20; return random_q; } void Widget::meet_s() //遇到月亮 { if((point.x()-random_x < 20 && point.x()-random_x > -20)&& (point.y() - random_y < 20 &&point.y() - random_y > -20) ) meet = true; if(!meet) { /* 豆豆 */ QRectF target_Peas(random_x,random_y, 100, 100); QRectF source_Peas(0,0, 400,400); QPixmap pixmap_Peas(":/new/prefix1/peas3.jpg"); //此处使用自己添加的资源文件夹内的图片 painter->drawPixmap(target_Peas, pixmap_Peas, source_Peas); } else { qDebug() <<"遇见"; random_x = Xrandom(); random_y = Yrandom(); Score++; meet = false; } } void Widget::Direction() //控制人物改变方向 { QRectF target(-10,-10, 40.0, 40.0); QRectF source(0.0, 0.0, 400.0, 400.0); QPixmap pixmap_right(":/new/prefix1/character_right.jpg"); //此处使用自己添加的资源文件夹内的图片 QPixmap pixmap1_left(":/new/prefix1/character_left.jpg"); //人物向左移动是的图片 if(Qt::Key_Up == direction) //上 { painter->rotate(-90); painter->drawPixmap(target, pixmap_right, source); } else if(Qt::Key_Down == direction) //下 { painter->rotate(90); painter->drawPixmap(target, pixmap_right, source); } else if(Qt::Key_Left == direction) //左 { painter->drawPixmap(target, pixmap1_left, source); } else //右 { painter->drawPixmap(target, pixmap_right, source); } } void Widget::paintEvent(QPaintEvent *event) { painter = new QPainter(this); /* 画笔 */ QPen pen (Qt::red,10); QPen pen1 (Qt::green,5); painter->setPen(pen1); /* 边框 */ QRectF rectangle(0, 0,this->width(),this->width()); QRectF rectangle1(10, 10, this->width()-20, this->height()-20); /* 背景 */ QRectF target(0,0, this->width(), this->width()); QRectF source(0,0, this->width(), this->width()); QPixmap pixmap_background(":/new/prefix1/background.jpg"); painter->drawPixmap(target, pixmap_background, source); painter->setRenderHint(QPainter::Antialiasing,true); //抗锯齿 /* 画边框 */ painter->drawRect(rectangle); painter->drawRect(rectangle1); /* 得分 */ Score_data = "得分:" + QString::number(Score); painter->drawText(0,0,100,100,Qt::AlignCenter,Score_data); painter->setPen(pen); meet_s(); //绘制月亮 painter->translate(point.x()+10,point.y()+10); //移动画家 Direction(); //画人物 update(); //必须要刷新 } Widget::~Widget() { delete ui; }
标签:mamicode data setup rand pen date() tab cti date
原文地址:https://www.cnblogs.com/IntelligencePointer/p/11519704.html