41 lines
1.6 KiB
C++
41 lines
1.6 KiB
C++
//
|
|
// Created by Benjamin on 4/23/2021.
|
|
//
|
|
|
|
#ifndef SFML_TEMPLATE_BEAMWEAPON_H
|
|
#define SFML_TEMPLATE_BEAMWEAPON_H
|
|
|
|
#include "Beam.h"
|
|
|
|
class BeamWeapon : public Weapon {
|
|
private:
|
|
int duration;
|
|
int framesShot = 0;
|
|
public:
|
|
BeamWeapon(Beam _proj, const sf::SoundBuffer& buffer, float volume, double effectiveAngle, int _duration, int frameDelay) : Weapon(frameDelay, effectiveAngle, buffer, volume) {
|
|
projectile = std::move(_proj);
|
|
duration = _duration;
|
|
}
|
|
|
|
Shootable* shoot(const Ship* shooter) override {
|
|
framesShot++;
|
|
if (framesShot == duration) {
|
|
framesShot = 0;
|
|
currentFrame = 0;
|
|
}
|
|
|
|
noise.play();
|
|
|
|
projectile.setShooter((GameSprite *) shooter);
|
|
double newWidth = shooter->getTarget() == nullptr ? projectile.getRange() : GameSprite::distance(shooter->getPosition(), shooter->getTarget()->getPosition());
|
|
projectile.setTextureRect(sf::IntRect(projectile.getTextureRect().left, projectile.getTextureRect().top, newWidth > projectile.getRange() ? projectile.getRange() * (1/projectile.getScale().x) : newWidth * (1/projectile.getScale().x), projectile.getTextureRect().height));
|
|
projectile.setOrigin(0, projectile.getLocalBounds().height/2);
|
|
projectile.setDirection(shooter->getTarget() == nullptr ? shooter->getDirection() : -GameSprite::getAimAngle(shooter->getTarget()->getPosition(), shooter->getPosition()));
|
|
projectile.setPosition(shooter->getPosition());
|
|
|
|
return new Shootable(projectile);
|
|
}
|
|
};
|
|
|
|
|
|
#endif //SFML_TEMPLATE_BEAMWEAPON_H
|