Zen 0.3.0
Loading...
Searching...
No Matches
Obstacle.cpp
1#include "Obstacle.h"
2
3Obstacle::Obstacle(ObstacleType t, float x) : type(t), pos{x, 0.0f} {
4 switch (type) {
5 case ObstacleType::SmallBox:
6 size = {0.8f, 0.8f};
7 pos.y = 0.0f;
8 colour = {1.0f, 0.5f, 0.0f, 1.0f};
9 speed = 6.0f;
10 break;
11
12 case ObstacleType::TallBox:
13 size = {0.6f, 2.0f};
14 pos.y = 1.0f;
15 colour = {1.0f, 0.2f, 0.2f, 1.0f};
16 speed = 5.5f;
17 break;
18
19 case ObstacleType::FlyingBox:
20 size = {1.0f, 0.6f};
21 pos.y = 2.5f;
22 colour = {0.5f, 0.2f, 1.0f, 1.0f};
23 speed = 7.0f;
24 break;
25 }
26
27 emitter.pos = pos;
28 emitter.size = size;
29 emitter.colour = colour;
30 emitter.spawnRate = 40.0f;
31
32 emitter.props.position = pos;
33 emitter.props.velocity = {3.0f, 0.0f};
34 emitter.props.lifeTime = 0.8f;
35 emitter.props.sizeBegin = 0.3f;
36 emitter.props.sizeEnd = 0.0f;
37 emitter.props.colourBegin = colour;
38 emitter.props.colourEnd = glm::vec4(colour.r, colour.g, colour.b, 0.0f);
39}
40
41void Obstacle::update(Zen::DeltaTime dt) {
42 if (!active) {
43 return;
44 }
45
46 pos.x -= speed * dt.seconds();
47
48 emitter.pos = pos;
49 emitter.props.position = pos;
50
51 if (pos.x < -12.0f) {
52 active = false;
53 }
54}
55
56void Obstacle::reset(float x) {
57 pos.x = x;
58 active = true;
59
60 switch (type) {
61 case ObstacleType::SmallBox:
62 pos.y = 0.0f;
63 break;
64 case ObstacleType::TallBox:
65 pos.y = 1.0f;
66 break;
67 case ObstacleType::FlyingBox:
68 pos.y = 2.5f;
69 break;
70 }
71
72 emitter.pos = pos;
73 emitter.props.position = pos;
74}
75
76bool Obstacle::collidesWith(const glm::vec2 &otherPos, const glm::vec2 &otherSize) const {
77 if (!active) {
78 return false;
79 }
80
81 // simple AABB collision
82 float left1 = pos.x - (size.x * 0.5f);
83 float right1 = pos.x + (size.x * 0.5f);
84 float bottom1 = pos.y - (size.y * 0.5f);
85 float top1 = pos.y + (size.y * 0.5f);
86
87 float left2 = otherPos.x - (otherSize.x * 0.5f);
88 float right2 = otherPos.x + (otherSize.x * 0.5f);
89 float bottom2 = otherPos.y - (otherSize.y * 0.5f);
90 float top2 = otherPos.y + (otherSize.y * 0.5f);
91
92 return !(left1 > right2 || right1 < left2 || bottom1 > top2 || top1 < bottom2);
93}