-
Notifications
You must be signed in to change notification settings - Fork 0
/
TowerManager.cpp
125 lines (109 loc) · 4.2 KB
/
TowerManager.cpp
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include "TowerManager.hpp"
#include <vector>
#include "Game.hpp"
TowerManager::~TowerManager() {}
int TowerManager::getTowerCount() const{
return _towerTypes.size();
}
TowerType* TowerManager::getTowerType(int id) const{
for(auto& tt : _towerTypes)
if(tt && tt->model!=nullptr && id==tt->model->getId())
return tt.get();
return nullptr;
}
int TowerManager::getTowerCost(int id) const{
for(auto& tt : _towerTypes)
if(tt && tt->model!=nullptr && id==tt->model->getId()){
return tt->cost;
}
return 0;
}
TowerType* TowerManager::parseEvent(sf::Event event, Vec2i mouse, sf::Vector2i point) const{
static const std::vector<sf::Keyboard::Key> bindings({
sf::Keyboard::Q,sf::Keyboard::W,sf::Keyboard::E,sf::Keyboard::R,
sf::Keyboard::A,sf::Keyboard::S,sf::Keyboard::D,sf::Keyboard::F
});
if(_towerTypes.size()==0)
return nullptr;
Vec2d p(point.x + 15, point.y + 15);
Vec2i t;
switch(event.type){
case sf::Event::MouseMoved:
t.x = (mouse.x-p.x)/(10+Game::pixelsPerSquare);
t.y = (mouse.y-p.y)/(10+Game::pixelsPerSquare);
if(mouse.x>=p.x && mouse.y>=p.y && t.x<=1 && t.y<=(_towerTypes.size()-1)/2
&& mouse.x-p.x-t.x*(10+Game::pixelsPerSquare) <= Game::pixelsPerSquare
&& mouse.y-p.y-t.y*(10+Game::pixelsPerSquare) <= Game::pixelsPerSquare
&& t.y*2 + t.x < _towerTypes.size()){
auto it = _towerTypes.begin();
for(int i = t.y*2 + t.x; i>0; i--)
it++;
return it->get();
}
case sf::Event::MouseButtonPressed:
if(event.mouseButton.button == sf::Mouse::Left){
t.x = (mouse.x-p.x)/(10+Game::pixelsPerSquare);
t.y = (mouse.y-p.y)/(10+Game::pixelsPerSquare);
if(mouse.x>=p.x && mouse.y>=p.y && t.x<=1 && t.y<=(_towerTypes.size()-1)/2
&& mouse.x-p.x-t.x*(10+Game::pixelsPerSquare) <= Game::pixelsPerSquare
&& mouse.y-p.y-t.y*(10+Game::pixelsPerSquare) <= Game::pixelsPerSquare
&& t.y*2 + t.x < _towerTypes.size()){
auto it = _towerTypes.begin();
for(int i = t.y*2 + t.x; i>0; i--)
it++;
return it->get();
}
}
break;
case sf::Event::KeyPressed:
for(int i=0; i<bindings.size(); i++)
if(bindings[i] == event.key.code){
if(i<_towerTypes.size()){
auto it = _towerTypes.begin();
while(i-->0)
++it;
return it->get();
}
break;
}
break;
default:
break;
}
return nullptr;
}
sf::Vector2i TowerManager::getDrawRectSize() const{
return sf::Vector2i(Game::pixelsPerSquare*2 + 40,
(Game::pixelsPerSquare+10)*(_towerTypes.size()/2 + (_towerTypes.size()%2!=0)) + 20); // 30 - (10 remaining)
}
void TowerManager::drawTowersPanel(sf::RenderWindow* window, sf::Vector2i point) const{
sf::Vector2i size = getDrawRectSize();
window->pushGLStates();
sf::RectangleShape rect;
rect.setOutlineColor(sf::Color::White);
rect.setOutlineThickness(1);
rect.setFillColor(sf::Color::Blue);
rect.setPosition(point.x, point.y);
rect.setSize(sf::Vector2f(size.x, size.y));
window->draw(rect);
rect.setSize(sf::Vector2f(Game::pixelsPerSquare,Game::pixelsPerSquare));
rect.setOutlineColor(sf::Color::Black);
rect.setFillColor(sf::Color::Green);
for(int i=0; i<_towerTypes.size(); i++){
rect.setPosition(point.x + 15 + (i%2!=0? 10+Game::pixelsPerSquare:0),
point.y + 15 + (i/2)*(Game::pixelsPerSquare+10));
window->draw(rect);
}
window->popGLStates();
int i = 0;
Vec2d p;
for(auto& tt:_towerTypes){
if(!tt || tt->model==nullptr)
continue;
p.x = point.x + 15 + Game::pixelsPerSquare/2 + (i%2)*(10+Game::pixelsPerSquare);
p.y = point.y + 15 + Game::pixelsPerSquare/2 + (i/2)*(Game::pixelsPerSquare+10);
tt->model->draw(window, p);
tt->model->drawOver(window, p);
++i;
}
}