-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathenemy.cpp
More file actions
76 lines (72 loc) · 3.39 KB
/
enemy.cpp
File metadata and controls
76 lines (72 loc) · 3.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include "enemy.h"
#include "math.h"
#define PI 3.14159265
Enemy::Enemy(sf::Vector2f newPos, sf::Vector2f newVel) :
position(newPos), velocity(newVel), body(15.f, 64), eyeLeft(4.f, 64), eyeRight(4.f, 64), pupilLeft(1.5f), pupilRight(1.5f), m_vertices(sf::PrimitiveType::LineStrip, 40)
{
body.setOrigin(body.getGeometricCenter());
eyeLeft.setOrigin(eyeLeft.getGeometricCenter());
eyeRight.setOrigin(eyeRight.getGeometricCenter());
pupilLeft.setOrigin(pupilLeft.getGeometricCenter());
pupilRight.setOrigin(pupilRight.getGeometricCenter());
body.setFillColor(sf::Color::Red);
body.setOutlineColor(sf::Color::Black);
body.setOutlineThickness(3);
body.setPosition(position);
eyeLeft.setFillColor(sf::Color::White);
eyeRight.setFillColor(sf::Color::White);
eyeLeft.setPosition(position + sf::Vector2f(18.f, velocity.angle() - sf::degrees(25.f)));
eyeRight.setPosition(position + sf::Vector2f(18.f, velocity.angle() + sf::degrees(25.f)));
pupilLeft.setFillColor(sf::Color::Black);
pupilRight.setFillColor(sf::Color::Black);
pupilLeft.setPosition(position + sf::Vector2f(18.f, velocity.angle() - sf::degrees(25.f)) + sf::Vector2f(1.5f, velocity.angle()));
pupilRight.setPosition(position + sf::Vector2f(18.f, velocity.angle() + sf::degrees(25.f)) + sf::Vector2f(1.5f, velocity.angle()));
}
bool Enemy::update(sf::Time elapsed, Player *player, std::vector<bullet>* bullets)
{
position += velocity * elapsed.asSeconds();
body.setPosition(position);
if (velocity.length() != 0)
{
eyeLeft.setPosition(position + sf::Vector2f(18.f, velocity.angle() - sf::degrees(25.f)));
eyeRight.setPosition(position + sf::Vector2f(18.f, velocity.angle() + sf::degrees(25.f)));
pupilLeft.setPosition(position + sf::Vector2f(18.f, velocity.angle() - sf::degrees(25.f)) + sf::Vector2f(1.5f, (player->getCorePos() - position).angle()));
pupilRight.setPosition(position + sf::Vector2f(18.f, velocity.angle() + sf::degrees(25.f)) + sf::Vector2f(1.5f, (player->getCorePos() - position).angle()));
}
if ((player->getCorePos() - position).length() > 500.f)
{
velocity = velocity.rotatedBy(velocity.angleTo(player->getCorePos() - position) * elapsed.asSeconds());
} else
{
velocity = velocity - velocity * 0.9f * elapsed.asSeconds();
for (int i = 0; i < 40; i++)
{
m_vertices[i].color = sf::Color::Red;
m_vertices[i].position = position + sf::Vector2f(std::pow(std::pow((player->getCorePos() - position).length(), 2.f) - std::pow(176.5f, 2.f), 0.5f) / 40 * i, (player->getCorePos() - position).angle() + sf::degrees(((i % 2) - 0.5f) * 360.f * std::asin(176.5f / (player->getCorePos() - position).length()) / PI));
}
counter += 1;
if (counter > (0.5f / elapsed.asSeconds()))
{
player->changeEnergy(-1);
counter = 0.f;
}
}
for (auto bul = bullets->begin(); bul != bullets->end(); bul++)
{
if ((position - bul->position).length() < 20.f)
{
bullets->erase(bul);
return true;
}
}
return false;
}
void Enemy::draw(sf::RenderTarget &target, sf::RenderStates states) const
{
target.draw(body, states);
target.draw(eyeLeft, states);
target.draw(eyeRight, states);
target.draw(pupilLeft, states);
target.draw(pupilRight, states);
target.draw(m_vertices, states);
}