现在要开始实战做一个翻金币游戏,是这样的环境
一共二十关,金币一面金色,一面银色。翻一个会使周围四个一起翻转,目标是所有金币都是金色。
首先需要添加这些图片资源,方法不多说,主要是资源包括八张金币不同位置的图片,翻转效果是动态实现的,利用帧数不同位置金币实现。back按钮按下会不同,所以资源文件有两个back按钮。
3.主场景配置
我们创建一个主场景的类。设置宽高,标题等,并且对开始菜单项中的退出按钮进行处理。最后重写绘图事件实现背景图片的插入。
接下来,我们要实现:按下start按钮(有一个跳跃的特效,让用户知道按下了按钮),然后跳到选择关卡的界面。
默认的按钮是没有跳跃效果的。所以需要自定义一个按钮mypushbotton,这个点前面也说过。
mypushbutton::mypushbutton(QString normalImg,QString pressImg)
{
this->normalImgPath=normalImg;
this->pressImgPath=pressImg;
QPixmap pix;
bool ret=pix.load(normalImg);
if(!ret)
{
qDebug()<<"加载失败";
return;
}
this->setFixedSize(pix.width(),pix.height());//设置按钮的宽高,和图片资源一样
this->setIcon(pix);//设置图标
this->setIconSize(QSize(pix.width(),pix.height()));//设置图标大小
}
void mypushbutton::zoom1()
{
//创建动态对象
QPropertyAnimation * animation = new QPropertyAnimation(this,"geometry");
//设置动画时间间隔
animation->setDuration(200);
//起始位置
animation->setStartValue(QRect(this->x(),this->y(),this->width(),this->height()));
//结束位置
animation->setEndValue(QRect(this->x(),this->y()+10,this->width(),this->height()));
//设置弹跳曲线
animation->setEasingCurve(QEasingCurve::OutBounce);
//执行动画
animation->start();
}
void mypushbutton::zoom2()
{
//创建动态对象
QPropertyAnimation * animation = new QPropertyAnimation(this,"geometry");
//设置动画时间间隔
animation->setDuration(200);
//起始位置
animation->setStartValue(QRect(this->x(),this->y()+10,this->width(),this->height()));
//结束位置
animation->setEndValue(QRect(this->x(),this->y(),this->width(),this->height()));
//设置弹跳曲线
animation->setEasingCurve(QEasingCurve::OutBounce);
//执行动画
animation->start();
}
这两部分是设置开始按钮和图标。
mypushbutton *startbtn=new mypushbutton(":/res/MenuSceneStartButton.png");
startbtn->setParent(this);
startbtn->move(this->width()*0.5-startbtn->width()*0.5,this->height()*0.7);
//startbtn->show();
connect(startbtn,&mypushbutton::clicked,[=](){
qDebug() << "点击了开始";
//做弹起特效
startbtn->zoom1(); //向下跳跃
startbtn->zoom2(); //向上跳跃
这一部分是创建并显示出来。其中zoom其实就是一个跳跃的动画效果,不做也不影响游戏本身。
接下来,我们要实现按下开始按钮跳到选择关卡的场景。
必然的,需要新建一个选择关卡场景的类。然后点击开始,隐藏主场景,跳到选择关卡场景。
QTimer::singleShot(500,this,[=](){
//自身隐藏
this->hide();
//显示选择关卡场景
choosescene->show();
});
这一段代码就在开始按钮的信号槽函数里面追加。
这样点击就会跳到一个新的空白的界面。接下来设置选择关卡的大小背景等。
chooselevel::chooselevel(QWidget *parent) : QMainWindow(parent)
{
//配置选择关卡场景
//设置窗口固定大小
this->setFixedSize(320,588);
//设置图标
this->setWindowIcon(QPixmap(":/res/Coin0001.png"));
//设置标题
this->setWindowTitle("选择关卡");
//创建菜单栏
QMenuBar * bar = this->menuBar();
this->setMenuBar(bar);
//创建开始菜单
QMenu * startMenu = bar->addMenu("开始");
//创建按钮菜单项
QAction * quitAction = startMenu->addAction("退出");
//点击退出 退出游戏
connect(quitAction,&QAction::triggered,[=]()
{
this->close();
});
}
void chooselevel::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QPixmap pix;
pix.load(":/res/OtherSceneBg.png");
painter.drawPixmap(0,0,this->width(),this->height(),pix);
//加载标题
pix.load(":/res/Title.png");
painter.drawPixmap( (this->width() - pix.width())*0.5,30,pix.width(),pix.height(),pix);
}
接下来我们需要实现关卡按钮的设置,可以把这个按钮看成mypushbutton类的一个对象。
实现很容易,只是要实现矩阵形状的,我们要设置关卡按钮的位置。当然两层for循环可以,一层也能实现,通过取余取模,因为逻辑上二维,物理排列上实际可以看成是一维的。
到这里,选择关卡场景也布置完毕,接下来就是游戏场景了。