-
Notifications
You must be signed in to change notification settings - Fork 3
/
Flashlight.cpp
105 lines (86 loc) · 2.91 KB
/
Flashlight.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
#include <cstdint>
#include <iostream>
#include <SFML/Graphics.hpp>
class Application
{
public:
Application() :
m_window{ sf::VideoMode{ { 300u, 300u } }, "Flashlight!" },
m_rectangle{ { 100.f, 100.f } },
m_flashlight{ m_flashlightTexture.getTexture() },
m_sprite{ m_layer.getTexture() },
m_position{ 0.f, 0.f }
{
m_window.setFramerateLimit(60u);
m_window.setMouseCursorVisible(false);
if (!m_layer.create({ 300u, 300u }))
{
sf::err() << "Failed to create RenderTexture" << std::endl;
}
if (!m_flashlightTexture.create({ 60u, 60u }))
{
sf::err() << "Failed to create RenderTexture" << std::endl;
}
// We want to have semi-transparent edges.
generateSpot();
m_flashlight.setTexture(m_flashlightTexture.getTexture(), true);
m_flashlight.setPosition({ 150.f, 150.f });
m_flashlight.setOrigin({ 30.f, 30.f });
m_rectangle.setFillColor(sf::Color::Red);
m_rectangle.setPosition({ 100.f, 100.f });
m_sprite.setTexture(m_layer.getTexture(), true);
}
void generateSpot()
{
m_flashlightTexture.clear();
// Draw 6 circles with increasing transparency
for (auto i = 0u; i < 6u; ++i)
{
const auto index = static_cast<float>(i);
auto temp = sf::CircleShape{ 30.f - (index * 2.f) };
temp.setOrigin({ 30.f - (index * 2.f), 30.f - (index * 2.f) });
temp.setFillColor({ 255u, 255u, 255u, static_cast<std::uint8_t>(61u - (i * 10u)) });
temp.setPosition({ 30.f, 30.f });
m_flashlightTexture.draw(temp, sf::BlendNone);
}
m_flashlightTexture.display();
}
void run()
{
while (m_window.isOpen())
{
for (auto event = sf::Event{}; m_window.pollEvent(event);)
{
if (event.type == sf::Event::Closed)
{
m_window.close();
}
}
// Update the position of the 'flashlight' to the current mouse position
m_position = m_window.mapPixelToCoords(sf::Mouse::getPosition(m_window));
m_flashlight.setPosition(m_position);
// Stance-out the 'flashlight' circle
m_layer.clear();
m_layer.draw(m_flashlight, sf::BlendNone);
m_layer.display();
m_window.clear(sf::Color::Blue);
// Draw the layer sprite on top of the 'scene'
m_window.draw(m_rectangle);
m_window.draw(m_sprite);
m_window.display();
}
}
private:
sf::RenderWindow m_window;
sf::RenderTexture m_flashlightTexture;
sf::RenderTexture m_layer;
sf::RectangleShape m_rectangle;
sf::Sprite m_flashlight;
sf::Sprite m_sprite;
sf::Vector2f m_position;
};
int main()
{
auto app = Application{};
app.run();
}