Skip to content

Commit b1e60d7

Browse files
committed
Global targets (static class) spawned from level
1 parent cc84201 commit b1e60d7

File tree

9 files changed

+68
-31
lines changed

9 files changed

+68
-31
lines changed

include/controls/mouse_handler.hpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
#include "gui/window.hpp"
55
#include "navigation/camera.hpp"
6-
#include "entities/target.hpp"
76
#include "audio/audio.hpp"
87

98
/**
@@ -14,7 +13,6 @@
1413
class MouseHandler {
1514
public:
1615
/* No need for instance constructor to init static private members */
17-
// static void init(Window* window, Camera* camera, std::vector<Target *> targets, Audio* audio);
1816
static void init(Window* window, Camera* camera, Audio* audio);
1917

2018
/* static methods can be passed as function pointers callbacks (no `this` argument) */
@@ -30,9 +28,6 @@ class MouseHandler {
3028
/* Needed to get 3d projection matrix for raycasting (mouse position to 3d position) */
3129
static Window* m_window;
3230

33-
/* Color cube to check for intersection with camera's line of sight */
34-
static std::vector<Target *> m_targets;
35-
3631
/* previous mouse xy-coords to compare to when moving (modified inside listeners below) */
3732
static int m_xmouse;
3833
static int m_ymouse;

include/entities/target.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,15 @@ struct Target {
1212
// program declared first (i.e. init first) as it's needed by renderer
1313
// https://stackoverflow.com/a/41886567/2228912
1414
Program m_program;
15+
glm::vec3 m_position;
1516

1617
public:
1718
Renderer renderer;
1819

1920
/* kill target on intersection with mouse cursor */
2021
bool is_dead;
2122

22-
Target();
23+
Target(const glm::vec3& position);
2324
void draw(const Uniforms& uniforms={});
2425
void set_transform(const Transformation& t);
2526
void free();

include/globals/targets.hpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#ifndef TARGETS_HPP
2+
#define TARGETS_HPP
3+
4+
#include "entities/target.hpp"
5+
6+
/* static class */
7+
class Targets {
8+
public:
9+
static std::vector<Target> cubes;
10+
static void add(const Target& target);
11+
static void free();
12+
13+
private:
14+
/* Cannot create class instances */
15+
Targets();
16+
};
17+
18+
#endif // TARGETS_HPP

include/render/level_renderer.hpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,12 @@
1515
struct LevelRenderer {
1616
/* Used to block camera from going through walls */
1717
std::vector<glm::vec3> positions_walls;
18-
/* Targets to kill by mouse cursor intersection */
19-
// std::vector<Target> targets;
2018

2119
LevelRenderer(const Program& program_tile, const Tilemap& tilemap, const glm::vec3& position, Assimp::Importer& importer);
2220
void draw(const Uniforms& u={});
2321
void draw_floor(const Uniforms& u);
2422
void draw_ceiling(const Uniforms& u);
23+
void draw_targets(const Uniforms& u);
2524
void set_transform(const Transformation& t);
2625
void free();
2726

@@ -30,8 +29,6 @@ struct LevelRenderer {
3029
private:
3130
/* same renderer for all ceiling/floor & walls */
3231
Renderer m_renderer;
33-
/* same target rendered multiple times */
34-
Target m_target;
3532
/* same grass prop rendered multiple times */
3633
Model m_tree;
3734

src/controls/mouse_handler.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
#include "controls/mouse_handler.hpp"
44
#include "math/transformation.hpp"
55
#include "globals/score.hpp"
6+
#include "globals/targets.hpp"
67

78
/* Static class members require a declaration in *.cpp (to allocate space for them) */
89
Camera* MouseHandler::m_camera;
910
Window* MouseHandler::m_window;
10-
std::vector<Target *> MouseHandler::m_targets;
1111
int MouseHandler::m_xmouse;
1212
int MouseHandler::m_ymouse;
1313
Audio* MouseHandler::m_audio;
@@ -19,14 +19,12 @@ Audio* MouseHandler::m_audio;
1919
* @param cube Check for its intersection with camera's intersection
2020
* @param audio
2121
*/
22-
// void MouseHandler::init(Window* window, Camera* camera, std::vector<Target *> targets, Audio* audio) {
2322
void MouseHandler::init(Window* window, Camera* camera, Audio* audio) {
2423
// init static members: initial mouse's xy-coords at center of screen
2524
m_camera = camera;
2625
m_window = window;
2726
m_xmouse = m_window->width / 2;
2827
m_ymouse = m_window->height / 2;
29-
// m_targets = targets;
3028
m_audio = audio;
3129
}
3230

@@ -39,13 +37,13 @@ void MouseHandler::on_mouse_click(GLFWwindow* window, int button, int action, in
3937
// play gun shot sound
4038
m_audio->play_2d("assets/audio/gun_shot.mp3");
4139

42-
for (Target* target : m_targets) {
43-
BoundingBox bounding_box = target->renderer.bounding_box;
40+
for (Target& target : Targets::cubes) {
41+
BoundingBox bounding_box = target.renderer.bounding_box;
4442
bool is_intersecting = bounding_box.intersects(m_camera->position, m_camera->direction);
4543

4644
// remove target & increase score on intersection
4745
if (is_intersecting) {
48-
target->is_dead = true;
46+
target.is_dead = true;
4947
score++;
5048
std::cout << "Intersecting!" << '\n';
5149
} else {

src/entities/target.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#include <glm/gtc/matrix_transform.hpp>
2+
13
#include "entities/target.hpp"
24
#include "geometries/cube.hpp"
35
#include "shaders/shader_exception.hpp"
@@ -7,11 +9,13 @@
79
* TODO:
810
* 1. pass ModelRenderer (like for Player)
911
* 2. Both Target & Player inherit from Character class containing draw() & m_is_dead
12+
* @param position Position extracted from tilemap
1013
*/
11-
Target::Target():
14+
Target::Target(const glm::vec3& position):
1215
m_program("assets/shaders/color.vert", "assets/shaders/color.frag"),
1316
renderer(m_program, VBO(Cube{}), {{0, "position", 3, 12, 0}, {0, "color", 3, 12, 3}}), // render colored cube
14-
is_dead(false)
17+
is_dead(false),
18+
m_position(position)
1519
{
1620
// vertex or fragment shaders failed to compile
1721
if (m_program.has_failed()) {
@@ -28,9 +32,12 @@ void Target::draw(const Uniforms& uniforms) {
2832
renderer.draw(uniforms);
2933
}
3034

31-
/* delegate transform to renderer */
35+
/**
36+
* Delegate transform to renderer
37+
* Translate target to position from tilemap
38+
*/
3239
void Target::set_transform(const Transformation& t) {
33-
renderer.set_transform(t);
40+
renderer.set_transform({ glm::translate(glm::mat4(1.0f), m_position), t.view, t.projection });
3441
}
3542

3643
/* Free renderer (vao/vbo buffers) & shader program */

src/globals/targets.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#include "globals/targets.hpp"
2+
3+
/* Static class members require a declaration in *.cpp (to allocate space for them & avoid linking error) */
4+
std::vector<Target> Targets::cubes;
5+
6+
void Targets::add(const Target& target) {
7+
cubes.push_back(target);
8+
}
9+
10+
/* Free all targets */
11+
void Targets::free() {
12+
for (Target& target : Targets::cubes) {
13+
target.free();
14+
}
15+
}

src/main.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,6 @@ int main() {
149149
*/
150150

151151
// callback for processing mouse click (after init static members)
152-
// MouseHandler::init(&window, &camera, targets, &audio);
153152
MouseHandler::init(&window, &camera, &audio);
154153
window.attach_mouse_listeners(MouseHandler::on_mouse_move, MouseHandler::on_mouse_click, MouseHandler::on_mouse_scroll);
155154
std::cout << "window.width: " << window.width

src/render/level_renderer.cpp

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@
44

55
#include "render/level_renderer.hpp"
66
#include "geometries/surface.hpp"
7+
#include "globals/targets.hpp"
78

89
/**
910
* Sets positions of walls tiles only once in constructor
1011
* Needed for collision with camera
1112
*/
1213
LevelRenderer::LevelRenderer(const Program& program_tile, const Tilemap& tilemap, const glm::vec3& position, Assimp::Importer& importer):
13-
// renderer for walls/floors & characters (targets, grass)
14+
// renderer for walls/floors, props (trees)
1415
m_renderer(program_tile, VBO(Surface()), {{0, "position", 2, 4, 0}, {0, "texture_coord", 2, 4, 2}}),
15-
m_target(),
1616
m_tree(importer, "assets/models/tree/tree.obj", Program("assets/shaders/basic.vert", "assets/shaders/basic.frag")),
1717

1818
m_tilemap(tilemap),
@@ -52,6 +52,10 @@ LevelRenderer::LevelRenderer(const Program& program_tile, const Tilemap& tilemap
5252
case Tilemap::Tiles::WALL_L_INV:
5353
angle = glm::radians(-90.0f);
5454
break;
55+
case Tilemap::Tiles::ENEMMY: // non-mobile enemies
56+
glm::vec3 position_target = position_tile + glm::vec3(0.0f, 0.5f, 0.0f);
57+
Targets::add(Target(position_target));
58+
continue;
5559
}
5660

5761
// save world position for walls (for collision with camera)
@@ -79,10 +83,11 @@ LevelRenderer::LevelRenderer(const Program& program_tile, const Tilemap& tilemap
7983
* @param uniforms Uniforms passed to shader
8084
*/
8185
void LevelRenderer::draw(const Uniforms& u) {
82-
// draw floor & ceiling
86+
// draw floor & ceiling & targets
8387
Uniforms uniforms = u;
8488
draw_floor(uniforms);
8589
draw_ceiling(uniforms);
90+
draw_targets(uniforms);
8691

8792
for (size_t i_row = 0; i_row < m_tilemap.n_rows; ++i_row) {
8893
for (size_t i_col = 0; i_col < m_tilemap.n_cols; ++i_col) {
@@ -95,13 +100,7 @@ void LevelRenderer::draw(const Uniforms& u) {
95100
// choose angle/texture of surface accord. to tile
96101
switch (tile) {
97102
case Tilemap::Tiles::ENEMMY:
98-
// colored cube enemies
99-
m_target.set_transform({
100-
glm::translate(glm::mat4(1.0f), position_tile + glm::vec3(0.0f, 0.5f, 0.0f)), // local origin at cube centroid
101-
m_transformation.view, m_transformation.projection });
102-
m_target.draw(uniforms);
103103
continue;
104-
break;
105104
case Tilemap::Tiles::TREE:
106105
// 3d model
107106
m_tree.set_transform({
@@ -160,6 +159,14 @@ void LevelRenderer::draw(const Uniforms& u) {
160159
}
161160
}
162161

162+
/* Draw targets */
163+
void LevelRenderer::draw_targets(const Uniforms& u) {
164+
for (Target& target : Targets::cubes) {
165+
target.set_transform(m_transformation);
166+
target.draw(u);
167+
}
168+
}
169+
163170
/**
164171
* Draw horizontal surface at given height
165172
* @param size Amount by which to scale surface on xy vertical plan
@@ -207,6 +214,6 @@ void LevelRenderer::set_transform(const Transformation& t) {
207214
/* Renderer lifecycle managed internally */
208215
void LevelRenderer::free() {
209216
m_renderer.free();
210-
m_target.free();
211217
m_tree.free();
218+
Targets::free();
212219
}

0 commit comments

Comments
 (0)