You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
438 lines
9.6 KiB
438 lines
9.6 KiB
#include "player.h"
|
|
#include"playerbullet.h"
|
|
#include"gamewidget.h"
|
|
|
|
|
|
int Player::pixStatus = 0;
|
|
|
|
|
|
Player::Player()
|
|
{
|
|
setPixmap(QPixmap(":/roles/img/roles/usagi1.png"));
|
|
mSpeed = 2;
|
|
mExp = 0;
|
|
mLevel = 1;
|
|
mHP = 5;
|
|
maxHP = 5;
|
|
mHPRecovery = 0;//生命再生
|
|
mHPPlunder = 0;//生命窃取
|
|
mAttackPoint = 1;//初始攻击力
|
|
mDefence = 0;//防御力
|
|
mAttackRatio = 0;//攻击倍率
|
|
mAttackSpeed = 0;//攻击速度
|
|
mSpeedRatio = 0;//移速加成
|
|
mEXPratio = 0;//经验倍率
|
|
mBulletNum = 1;//子弹个数
|
|
mExtraBullet = 0;//额外子弹
|
|
|
|
InvincibleTimes = 0;//无敌次数
|
|
recessionIndex = 0;//击退系数
|
|
bloodAttack = 0;//生命值扣血
|
|
|
|
HPRecoveryTimer = new QTimer(this);
|
|
connect(HPRecoveryTimer,&QTimer::timeout,this,&Player::HPRecover);
|
|
//HPRecoveryTimer->start(this->getRecoveryInterval());
|
|
|
|
InvincibleTimer = new QTimer(this);
|
|
connect(InvincibleTimer,&QTimer::timeout,[this](){
|
|
isInvincible = 0;
|
|
});
|
|
|
|
//配置人物音效
|
|
//发射音效
|
|
// SFXshoot = new QMediaPlayer(this);
|
|
// audiooutputShoot = new QAudioOutput(this);
|
|
// SFXshoot->setAudioOutput(audiooutputShoot);
|
|
// SFXshoot->setSource(QUrl("qrc:/sfx/sounds/effcet_sfx_playershoot.ogg"));
|
|
SFXshoot = new QMediaPlayer(this);
|
|
QUrl audioUrl = QUrl("qrc:/sfx/sounds/effcet_sfx_playershoot.ogg");
|
|
SFXshoot->setMedia(QMediaContent(audioUrl));
|
|
//触发保命音效
|
|
// SFXhurt = new QMediaPlayer(this);
|
|
// audiooutputHurt = new QAudioOutput(this);
|
|
// SFXhurt->setAudioOutput(audiooutputHurt);
|
|
// SFXhurt->setSource(QUrl("qrc:/sfx/sounds/usagiHurtSFX0.MP3"));
|
|
SFXhurt = new QMediaPlayer(this);
|
|
QUrl hurtaudioUrl = QUrl("qrc:/sfx/sounds/usagiHurtSFX0.MP3");
|
|
SFXhurt->setMedia(QMediaContent(hurtaudioUrl));
|
|
}
|
|
|
|
QPointF Player::getPos()
|
|
{
|
|
return pos();
|
|
}
|
|
|
|
int Player::getAttackInterval()
|
|
{
|
|
qreal _attackSpeed = mAttackSpeed;
|
|
_attackSpeed /= 80;
|
|
qreal deltaT = GameDefine::OriginalAttackInterval * pow(0.5,_attackSpeed);
|
|
return (int)deltaT < GameDefine::LimitedAttackInterval ? GameDefine::LimitedAttackInterval : (int)deltaT;
|
|
}
|
|
|
|
int Player::getRecoveryInterval()
|
|
{
|
|
qreal _Recovery = mHPRecovery;
|
|
_Recovery /= 8;
|
|
qreal deltaT = 10000 * pow(0.5,_Recovery);
|
|
return (int)deltaT;
|
|
}
|
|
|
|
void Player::HPRecoverControl()
|
|
{
|
|
if(mHPRecovery > 0)
|
|
{
|
|
HPRecoveryTimer->start(getRecoveryInterval());
|
|
}
|
|
else
|
|
{
|
|
HPRecoveryTimer->stop();
|
|
}
|
|
}
|
|
|
|
void Player::HPRecover()
|
|
{
|
|
if(!GameWidget::widget->isRunning || mHP == maxHP) return;
|
|
mHP++;
|
|
GameWidget::widget->resetHPBar();
|
|
}
|
|
|
|
void Player::canPlunder()
|
|
{
|
|
int x = QRandomGenerator::global()->bounded(0,100);
|
|
if(x < mHPPlunder*100 && mHP < maxHP)
|
|
{
|
|
mHP += 1;
|
|
}
|
|
}
|
|
|
|
void Player::playerShoot(QPointF _dir)
|
|
{
|
|
int _attack = (int)(getAttackPoint() * (1+getAttackRatio()));//攻击力计算
|
|
if(_attack < 1) _attack = 1;
|
|
qDebug()<<_attack;
|
|
|
|
//主子弹
|
|
|
|
for(int i=0;i<mBulletNum;i++)
|
|
{
|
|
auto* playerBT = new playerBullet(this,_dir, _attack);
|
|
GameWidget::widget->getGameScene().addItem(playerBT);
|
|
GameWidget::widget->mBulletList.append(playerBT);
|
|
playerBT->setZValue(0.9);
|
|
for(int j=0;j<5 * i;j++)
|
|
{
|
|
playerBT->BulletMove();
|
|
//SFXplayer->play();
|
|
}
|
|
}
|
|
|
|
|
|
//额外散射子弹
|
|
int _extraNum = mExtraBullet / 2;
|
|
int _extraAttack = _attack/2;
|
|
if(_extraAttack < 1) _extraAttack = 1;
|
|
if(mExtraBullet > 4)
|
|
{
|
|
_extraNum = 2;
|
|
_extraAttack *= pow(1.2,mExtraBullet/2 - 2);
|
|
}
|
|
for(int i=0;i<_extraNum;i++)
|
|
{
|
|
// QPointF dirUpper(_dir.x()*0.996-_dir.y()*0.087,
|
|
// _dir.y()*0.996+_dir.x()*0.087);
|
|
// QPointF dirLower(_dir.x()*0.996+_dir.y()*0.087,
|
|
// _dir.y()*0.996-_dir.x()*0.087);
|
|
QPointF dirUpper(_dir.x()*0.966-_dir.y()*0.259,
|
|
_dir.y()*0.966+_dir.x()*0.259);
|
|
QPointF dirLower(_dir.x()*0.966+_dir.y()*0.259,
|
|
_dir.y()*0.966-_dir.x()*0.259);
|
|
auto* playerBTUpper = new playerBullet(this,dirUpper,_extraAttack);
|
|
GameWidget::widget->getGameScene().addItem(playerBTUpper);
|
|
GameWidget::widget->mBulletList.append(playerBTUpper);
|
|
playerBTUpper->setZValue(0.9);
|
|
|
|
auto* playerBTLower = new playerBullet(this,dirLower,_extraAttack);
|
|
GameWidget::widget->getGameScene().addItem(playerBTLower);
|
|
GameWidget::widget->mBulletList.append(playerBTLower);
|
|
playerBTLower->setZValue(0.9);
|
|
for(int j=0;j<5 * i;j++)
|
|
{
|
|
playerBTUpper->BulletMove();
|
|
playerBTLower->BulletMove();
|
|
}
|
|
|
|
}
|
|
SFXshoot->setMedia(QUrl("qrc:/sfx/sounds/effcet_sfx_playershoot.ogg"));
|
|
SFXshoot->play();
|
|
qDebug()<<"playershoot is click";
|
|
}
|
|
|
|
void Player::setFaceDir(bool _fac)
|
|
{
|
|
faceDir = _fac;
|
|
//qDebug() << faceDir;
|
|
|
|
}
|
|
|
|
void Player::getHurt(int _attack)
|
|
{
|
|
qreal defen = mDefence;
|
|
defen /= 8;//免伤计算
|
|
int oriHP = mHP;
|
|
mHP -= (int)(_attack * pow(0.5,defen))==0 ? 1 : (int)(_attack * pow(0.5,defen));
|
|
|
|
if(mHP <=0 && InvincibleTimes > 0)
|
|
{
|
|
InvincibleTimes -= 1;
|
|
mHP = 0;
|
|
mHP += maxHP * 0.8;
|
|
SFXhurt->setMedia(QUrl("qrc:/sfx/sounds/usagiHurtSFX0.MP3"));
|
|
audiooutputHurt->setVolume(1);
|
|
SFXhurt->play();
|
|
}
|
|
else if(oriHP - mHP >= 3)
|
|
{
|
|
SFXhurt->setMedia(QUrl("qrc:/sfx/sounds/usagiHurtSFX.MP3"));
|
|
audiooutputHurt->setVolume(0.5);
|
|
SFXhurt->play();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void Player::picUpdate()
|
|
{
|
|
QString address = ":/roles/img/roles/usagi";
|
|
//address += std::to_string((pixStatus)/7+1);
|
|
address += QString::fromStdString(std::to_string((pixStatus)/7+1));
|
|
|
|
if(getFaceDir()) address += "-mir";
|
|
if(isInvincible) address += "-invincible";
|
|
address += ".png";
|
|
|
|
this->setPixmap(QPixmap(address));
|
|
pixStatus ++;
|
|
pixStatus %= 21;
|
|
}
|
|
|
|
void Player::PlayerGetExp(int _val)
|
|
{
|
|
mExp += (int)(_val * (1+getEXPRatio()));
|
|
}
|
|
|
|
void Player::getItem(int num)//获得物品加成
|
|
{
|
|
switch(num)
|
|
{
|
|
case 0:
|
|
{
|
|
mHP += 3;
|
|
maxHP += 3;
|
|
mDefence += 2;
|
|
mSpeedRatio -= 0.05;
|
|
InvincibleTimes += 1;
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
mEXPratio += 0.1;
|
|
mHPRecovery += 2;
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
mAttackPoint += 2;
|
|
mAttackRatio += 0.05;
|
|
break;
|
|
}
|
|
case 3:
|
|
{
|
|
mBulletNum += 1;
|
|
mHP -= 5;
|
|
maxHP -= 5;
|
|
if(mHP <= 0)
|
|
{
|
|
mHP = 1;
|
|
}
|
|
if(maxHP <= 0)
|
|
{
|
|
maxHP = 1;
|
|
}
|
|
mDefence -= 3;
|
|
break;
|
|
}
|
|
case 4:
|
|
{
|
|
mAttackPoint += 1;
|
|
mHP += 2;
|
|
maxHP += 2;
|
|
break;
|
|
}
|
|
case 5:
|
|
{
|
|
mAttackPoint += 2;
|
|
mHP += 2;
|
|
maxHP += 2;
|
|
mDefence += 2;
|
|
break;
|
|
}
|
|
case 6:
|
|
{
|
|
mAttackSpeed += 10;
|
|
mHPRecovery += 2;
|
|
mSpeedRatio += 0.03;
|
|
break;
|
|
}
|
|
case 7://柠檬水
|
|
{
|
|
mSpeedRatio += 0.05;
|
|
mHPPlunder += 0.05;
|
|
break;
|
|
}
|
|
case 8:
|
|
{
|
|
mAttackPoint += 2;
|
|
mDefence -= 1;
|
|
mHPPlunder += 0.05;
|
|
break;
|
|
}
|
|
case 9:
|
|
{
|
|
mHP += 3;
|
|
maxHP += 3;
|
|
mHPRecovery += 3;
|
|
mAttackRatio += 0.05;
|
|
break;
|
|
}
|
|
case 10:
|
|
{
|
|
mAttackPoint += 5;
|
|
mAttackRatio += 0.1;
|
|
mAttackSpeed += 10;
|
|
break;
|
|
}
|
|
case 11:
|
|
{
|
|
mEXPratio += 0.15;
|
|
mAttackRatio += 0.05;
|
|
break;
|
|
}
|
|
case 12:
|
|
{
|
|
mAttackPoint += 3;
|
|
mAttackSpeed += 15;
|
|
mDefence -= 2;
|
|
break;
|
|
}
|
|
case 13:
|
|
{
|
|
mDefence += 5;
|
|
mEXPratio -= 0.1;
|
|
break;
|
|
}
|
|
case 14:
|
|
{
|
|
mHP += 4;
|
|
maxHP +=4;
|
|
mHPRecovery += 2;
|
|
break;
|
|
}
|
|
case 15:
|
|
{
|
|
mEXPratio += 0.1;
|
|
mHP += 1;
|
|
maxHP += 1;
|
|
mDefence += 1;
|
|
break;
|
|
}
|
|
case 16:
|
|
{
|
|
mEXPratio += 0.2;
|
|
mAttackSpeed += 10;
|
|
break;
|
|
}
|
|
case 17:
|
|
{
|
|
mAttackRatio += 0.1;
|
|
mHP += 5;
|
|
maxHP += 5;
|
|
mSpeedRatio -= 0.05;
|
|
break;
|
|
}
|
|
case 18:
|
|
{
|
|
mAttackSpeed += 10;
|
|
mDefence += 2;
|
|
break;
|
|
}
|
|
case 19:
|
|
{
|
|
mAttackRatio -= 0.1;
|
|
mExtraBullet += 2;
|
|
mAttackSpeed -= 20;
|
|
break;
|
|
}
|
|
case 20:
|
|
{
|
|
mAttackSpeed += 5;
|
|
mHP += 2;
|
|
maxHP += 2;
|
|
mHPRecovery += 3;
|
|
break;
|
|
}
|
|
case 21:
|
|
{
|
|
mAttackRatio += 0.1;
|
|
mHP += 2;
|
|
maxHP += 2;
|
|
mSpeedRatio += 0.05;
|
|
break;
|
|
}
|
|
case 22:
|
|
{
|
|
bloodAttack += 1;
|
|
mAttackPoint -= 10;
|
|
mAttackRatio -= 0.5;
|
|
mHPPlunder += 0.1;
|
|
break;
|
|
}
|
|
case 23:
|
|
{
|
|
recessionIndex += 1;
|
|
mEXPratio -= 0.2;
|
|
mDefence += 3;
|
|
break;
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
|
|
void Player::resetPlayer()
|
|
{
|
|
setPixmap(QPixmap(":/roles/img/roles/usagi1.png"));
|
|
mSpeed = 2;
|
|
mExp = 0;
|
|
mLevel = 1;
|
|
mHP = 5;
|
|
maxHP = 5;
|
|
mHPRecovery = 0;//生命再生
|
|
mHPPlunder = 0;//生命窃取
|
|
mAttackPoint = 1;//初始攻击力
|
|
mDefence = 0;//防御力
|
|
mAttackRatio = 0;//攻击倍率
|
|
mAttackSpeed = 0;//攻击速度
|
|
mSpeedRatio = 0;//移速加成
|
|
mEXPratio = 0;//经验倍率
|
|
mBulletNum = 1;//子弹个数
|
|
mExtraBullet = 0;//额外子弹
|
|
|
|
InvincibleTimes = 0;
|
|
recessionIndex = 0;
|
|
bloodAttack = 0;
|
|
|
|
HPRecoveryTimer->stop();
|
|
|
|
}
|