/**
* one room arena
* Copyright (C) 2016 POSITIVE MENTAL ATTITUDE
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include
#include "Bullet.hpp"
#include "Map.hpp"
#include "Player.hpp"
Bullet::Bullet(Vector2f position, float angle, int strength):
_map(nullptr),
_self(nullptr),
_dead(false),
_strength(strength),
_madeByPlayer(false)
{
this->setPosition(position);
this->setRotation(angle);
}
void Bullet::registerMap(Map* map)
{
_map = map;
}
void Bullet::registerSelf(Player* player)
{
_self = player;
}
RectBullet::RectBullet(Vector2f position, float angle, int strength): Bullet(position, angle, strength)
{
this->setSize(Vector2f(2.f, 50.f));
this->setOrigin(1.f, 25.f);
_speed = 1200.f;
_explosive = false;
}
NukeBullet::NukeBullet(Vector2f position, float angle, int strength): Bullet(position, angle, strength)
{
_badlyAllocatedTexture.loadFromFile("data/fatman.png");
this->setSize(Vector2f(64.f, 128.f));
this->setOrigin(32.f, 64.f);
this->setTexture(&_badlyAllocatedTexture);
_speed = 200.f;
_explosive = true;
}
void Bullet::update(float delta)
{
this->move(Vector2f(std::sin(getRotation() * 3.1415f / 180.f), -std::cos(getRotation() * 3.1415f / 180.f)) * _speed * delta);
for(unsigned i = 0; i < getPointCount(); ++i)
{
Vector2f pos = getTransform().transformPoint(getPoint(i));
if(_map->collision(pos))
{
if(_explosive)
{
_map->destroy(getPosition(), _strength);
}
_dead = true;
// delete this;
}
for(unsigned j = 0; j < Player::aiPlayer->size(); ++j)
{
if(Player::aiPlayer->at(j) == _self)
continue;
if(std::pow(Player::aiPlayer->at(j)->getPosition().x - pos.x, 2) + std::pow(Player::aiPlayer->at(j)->getPosition().y - pos.y, 2) < 50*50)
{
Player::aiPlayer->at(j)->kill(_madeByPlayer);
_dead = true;
break;
}
}
if(Player::actualPlayer != _self)
{
if(std::pow(Player::actualPlayer->getPosition().x - pos.x, 2) + std::pow(Player::actualPlayer->getPosition().y - pos.y, 2) < 50*50)
{
Player::actualPlayer->kill(false);
_dead = true;
}
}
}
}
bool Bullet::isDead() const
{
return _dead;
}
bool Bullet::isExplosive() const
{
return _explosive;
}
void Bullet::setColor(Color color)
{
this->setFillColor(color);
}
void Bullet::madeByPlayer()
{
_madeByPlayer = true;
}