可能有点丑但其实是没有好的资源图片
比如这个血条太生硬了,这个子弹道具怎么真的就和子弹一样??
不过没事,功能对了就行
首先考虑这个血条怎么搞。
那么首先我们的敌机需要有个属性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);
}