QT飞机大战六(敌机血条的添加以及特殊子弹道具)

QT飞机大战六(敌机血条的添加以及特殊子弹道具)

可能有点丑但其实是没有好的资源图片

比如这个血条太生硬了,这个子弹道具怎么真的就和子弹一样??

不过没事,功能对了就行


首先考虑这个血条怎么搞。

那么首先我们的敌机需要有个属性sum_hp(总血量),初始化随机一个值

每次判断敌机和子弹相撞,更新敌机的now_hp(当前血量)

只有血量小于等于零了,才让敌机消失并播放爆炸特效

那么,我们就有一个比例就是 n o w _ h p s u m _ h p \frac{now\_hp}{sum\_hp} sum_hpnow_hp​,也就是血条的红色部分占几分之几

所以我们每次就从敌机的位置处往右绘制一个比例的红色矩形,也就是这个代码

 QBrush red_brush( QColor("#F20900") );//把刷子设置为红色
 painter.setBrush(red_brush);//应用刷子
 float rate = 1.0*enemys[i].now_hp/enemys[i].sum_hp;//计算比例
 painter.drawRect(enemys[i].m_x,enemys[i].m_y,rate*enemys[i].img_enemy.width(),enemys[i].img_enemy.height()*0.2);//绘制矩形

大概就是这个思路,我这么画的血条可能有点丑,懂意思就行

然后考虑这个特殊子弹道具怎么弄

其实有点千篇一律了,新建一个类叫BulletTool

这个特殊子弹道具需要有位置,矩形框,图片…这些都之前的类一样

我们这里还需要有威力,特殊子弹威力肯定要大一点嘛…

然后主函数中就一样了,每次定时器判断子弹和敌机相撞的时候

顺便判断一下特殊子弹道具是否和英雄相遇

如果相遇,那就遍历英雄的所有弹夹,把资源图片和威力去换一下

直接看代码吧,比较简单这个

bullettool.h

#ifndef BULLETTOOL_H
#define BULLETTOOL_H
#include <QRect>
#include <QPixmap>
class BulletTool
{
public:
    BulletTool();
    void init(QString w);//拿w路径初始化资源图片和坐标
    void New_Speed();//更新移动方向的函数
    void updatepostion();//更新位置的函数

public:
    int m_x,m_y;//位置
    int speed_x,speed_y;//移动速度
    int record;//销毁时间
    int force = 1;
    QPixmap img;//道具的图片资源
    QRect m_rect;

};

#endif // BULLETTOOL_H

bullettool.cpp

#include "bullettool.h"
#include <QPixmap>
#include <config.h>
#include <QDebug>
BulletTool::BulletTool()
{
    record = 0;
}

void BulletTool::init(QString w)
{
    img.load(w);
    force = 2;//威力
    m_x = rand()%GAME_WIDTH, m_y = rand()%GAME_HEIGHT;
    if( m_x>=GAME_WIDTH-img.width() )   m_x = GAME_WIDTH-img.width();
    if( m_y>=GAME_HEIGHT-img.height() ) m_y = GAME_HEIGHT-img.height();
    m_rect.setWidth(img.width() );
    m_rect.setHeight(img.height() );
    m_rect.moveTo(m_x,m_y);
    speed_x = rand()%3+1, speed_y += rand()%3+1;
}

void BulletTool::New_Speed()//随机一个速度方向
{
    speed_x = rand()%2, speed_y = rand()%2;
    if( rand()%2==0 )   speed_x = -speed_x;//正负方向都需要随机
    if( rand()%2==0 )   speed_y = -speed_y;
    while( speed_x==0&&speed_y==0 )    speed_x = rand()%2, speed_y = rand()%2;
}

void BulletTool::updatepostion()
{
    if( --record==0 )   return;//不需要更新坐标了,同时也不需要绘制了
    qDebug() << speed_x << " " << speed_y;
    m_x += speed_x, m_y += speed_y;
    if( m_x<0 ) m_x = 0,New_Speed();
    if( m_y<0 ) m_y = 0,New_Speed();
    if( m_x>GAME_WIDTH-img.width() )    m_x = GAME_WIDTH-img.width(),New_Speed();
    if( m_y>GAME_HEIGHT-img.height() )  m_y = GAME_HEIGHT-img.height(),New_Speed();
    m_rect.moveTo(m_x,m_y);
}

上一篇:浅谈MVC+小例子


下一篇:HP LaserJet P1005打印机在windows10中驱动无法使用