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

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

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

不过没事,功能对了就行


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

那么首先我们的敌机需要有个属性​​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);
}