Skip to content

Commit 173a8d1

Browse files
author
Martin Pelak
committed
Added a basic collision detection algorithm (AABB)
1 parent 0ed161e commit 173a8d1

34 files changed

+613
-294
lines changed

Begin.cpp

-1
This file was deleted.

Begin.h

-12
This file was deleted.

Beginning.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#include "Beginning.h"

Beginning.h

+92
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
#pragma once
2+
#include "GameComponents.h"
3+
#include "Slide.h"
4+
#include "Text.h"
5+
6+
class Beginning : public Slide
7+
{
8+
private:
9+
Text text = { "welcome", sprites.alphabet, Position(300, 30) };
10+
public:
11+
void tick(const Time currentTime) override
12+
{
13+
text.tick(currentTime);
14+
}
15+
};
16+
17+
class End : public Slide
18+
{
19+
private:
20+
Text text = { "end", sprites.alphabet, Position(300, 30) };
21+
public:
22+
void tick(const Time currentTime) override
23+
{
24+
text.tick(currentTime);
25+
}
26+
};
27+
28+
class Level01 : public Slide
29+
{
30+
private:
31+
Text text = { "space invaders 2d", sprites.alphabet, Position(80, 30) };
32+
public:
33+
Level01()
34+
{
35+
auto& [player, bullets, enemies] = GameComponents::get().getAllComponents();
36+
37+
// 1 player
38+
player.position = Position(400, 550);
39+
player.size = Size(50, 50);
40+
41+
// 10 bullets
42+
bullets.emplace_back_multiple(10, sprites.bullet, Size(10, 10));
43+
44+
// 50 enemies
45+
enemies.emplace_back_multiple(50, sprites.enemy);
46+
}
47+
48+
void tick(const Time currentTime) override
49+
{
50+
auto& [player, bullets, enemies] = GameComponents::get().getAllComponents();
51+
52+
player.tick(currentTime);
53+
54+
for (auto& bullet : bullets)
55+
{
56+
bullet.tick(currentTime);
57+
}
58+
59+
for (auto& enemy : enemies)
60+
{
61+
enemy.tick(currentTime);
62+
}
63+
64+
text.tick(currentTime);
65+
66+
// Detect colitions
67+
for (auto& bullet : bullets)
68+
{
69+
if (bullet.visible)
70+
{
71+
const auto& [min01, max01] = bullet.getBoundingBox();
72+
73+
for (auto& enemy : enemies)
74+
{
75+
if (enemy.visible)
76+
{
77+
const auto& [min02, max02] = enemy.getBoundingBox();
78+
79+
// Colision detected
80+
if (max01.x > min02.x && min01.x < max02.x && max01.y > min01.y && min01.y < max02.y)
81+
{
82+
bullet.visible = false;
83+
enemy.visible = false;
84+
break;
85+
}
86+
}
87+
}
88+
}
89+
}
90+
}
91+
};
92+

Bullet.cpp

+31
Original file line numberDiff line numberDiff line change
@@ -1 +1,32 @@
11
#include "Bullet.h"
2+
3+
4+
Bullet::Bullet(const Sprite& sprite, const Size size) noexcept : GameComponent(sprite)
5+
{
6+
this->size = size;
7+
}
8+
9+
void Bullet::setDirection(const Direction direction)
10+
{
11+
this->direction = direction;
12+
this->angle = direction.getAngle();
13+
}
14+
15+
void Bullet::setPosition(const Position position)
16+
{
17+
this->position = position;
18+
}
19+
20+
void Bullet::tick(const Time currentTime)
21+
{
22+
if (this->visible)
23+
{
24+
constexpr float speed = 5.f;
25+
this->position -= this->direction * speed;
26+
27+
// Compute bounding box
28+
this->recomputeBoundingBox();
29+
30+
this->draw();
31+
}
32+
}

Bullet.h

+5-22
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,13 @@
11
#pragma once
22
#include "GameComponent.h"
3+
#include "Sprite.h"
34

45
class Bullet : public GameComponent
56
{
67
public:
7-
const Sprite& sprite;
8-
Bullet(const Sprite& sprite, const Size size) noexcept : sprite(sprite)
9-
{
10-
this->size = size;
11-
}
8+
Bullet(const Sprite& sprite, const Size size) noexcept;
129

13-
void draw()
14-
{
15-
DrawSprite(sprite, position.x, position.y, size.width, size.height, angle, 0xffffffff);
16-
}
17-
18-
void setPosition(const Position position)
19-
{
20-
this->position = position;
21-
}
22-
23-
void tick(const Time currentTime)
24-
{
25-
this->position.y -= 4;
26-
this->angle += 0.1f;
27-
28-
this->draw();
29-
}
10+
void setDirection(const Direction direction);
11+
void setPosition(const Position position);
12+
void tick(const Time currentTime) override;
3013
};

Container.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#include "Container.h"

Container.h

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#pragma once
2+
3+
#include <deque>
4+
5+
template <typename T>
6+
class Container : public std::deque<T>
7+
{
8+
using iterator = typename std::deque<T>::iterator;
9+
using size_type = typename std::deque<T>::size_type;
10+
using parent = std::deque<T>;
11+
12+
public:
13+
Container() = default;
14+
15+
iterator begin() noexcept
16+
{
17+
return parent::begin();
18+
}
19+
20+
iterator end() noexcept
21+
{
22+
return parent::end();
23+
}
24+
25+
void next(iterator& iterator)
26+
{
27+
iterator = std::next(iterator);
28+
if (iterator == parent::end())
29+
{
30+
iterator = parent::begin();
31+
}
32+
}
33+
34+
template<class... Args>
35+
T& emplace_back(Args&&... args)
36+
{
37+
return parent::emplace_back(std::forward<Args>(args)...);
38+
}
39+
40+
template<class... Args>
41+
void emplace_back_multiple(const size_type count, Args&&... args)
42+
{
43+
for (size_type i = 0; i < count; ++i)
44+
{
45+
parent::emplace_back(std::forward<Args>(args)...);
46+
}
47+
}
48+
};

Drawable.cpp

-1
This file was deleted.

Enemy.cpp

+57-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,60 @@
11
#include "Enemy.h"
22

3+
int Enemy::s_seed = 0;
34

4-
int Enemy::s_seed = 0;
5+
6+
Enemy::Enemy(const Sprite& sprite) noexcept : GameComponent(sprite)
7+
{
8+
this->init();
9+
}
10+
11+
Enemy::Enemy(const Enemy& copy) noexcept : GameComponent(copy.sprite)
12+
{
13+
this->init();
14+
}
15+
16+
17+
void Enemy::init() noexcept
18+
{
19+
this->seed = Enemy::s_seed;
20+
this->basePosition = { (seed % 10) * 60 + 120.f, (seed / 10) * 60 + 70.f };
21+
this->size = { (10 + ((seed) % 17)), (10 + ((seed) % 17)) };
22+
23+
++Enemy::s_seed;
24+
}
25+
26+
void Enemy::tick(const Time time)
27+
{
28+
if (!this->visible)
29+
{
30+
return;
31+
}
32+
33+
int dx = 0, dy = 0;
34+
const int n1 = time + seed * seed + seed * seed * seed;
35+
const int n2 = time + seed + seed * seed + seed * seed * seed * 3;
36+
constexpr float twoPi = 2 * std::numbers::pi;
37+
if (((n1 >> 6) & 0x7) == 0x7)
38+
{
39+
const int radius = 20 + ((seed * seed) % 9);
40+
const float angle = (n1 & 0x7f) / 64.0f * twoPi;
41+
42+
dx = radius * (1 - cos(angle));
43+
dy = radius * sin(angle);
44+
}
45+
46+
if (((n2 >> 8) & 0xf) == 0xf)
47+
{
48+
const int distance = 150 + ((seed * seed) % 9);
49+
const float angle = (n2 & 0xff) / 256.0f * twoPi;
50+
51+
dy += distance * (1 - cos(angle));
52+
}
53+
54+
this->position = this->basePosition + Position(dx, dy);
55+
56+
// Compute bounding box
57+
this->recomputeBoundingBox();
58+
59+
this->draw();
60+
}

Enemy.h

+8-45
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,20 @@
1-
#pragma once
2-
#include "GameComponent.h"
1+
#pragma once
2+
33
#include <numbers>
44

5+
#include "GameComponent.h"
6+
57
class Enemy : public GameComponent
68
{
79
private:
810
static int s_seed;
911
Seed seed;
1012

11-
void init() noexcept
12-
{
13-
this->seed = Enemy::s_seed;
14-
this->basePosition = { (seed % 10) * 60 + 120, (seed / 10) * 60 + 70 };
15-
this->size = { (10 + ((seed) % 17)), (10 + ((seed) % 17)) };
16-
17-
++Enemy::s_seed;
18-
}
13+
void init() noexcept;
1914

2015
public:
21-
const Sprite& sprite;
22-
Enemy(const Sprite& sprite) noexcept : sprite(sprite)
23-
{
24-
this->init();
25-
}
26-
27-
Enemy(const Enemy& copy) noexcept : sprite(copy.sprite)
28-
{
29-
this->init();
30-
}
31-
32-
void draw()
33-
{
34-
DrawSprite(sprite, position.x, position.y, size.width, size.height, angle, 0xffffffff);
35-
}
36-
37-
void tick(const Time time)
38-
{
39-
int dx = 0, dy = 0;
40-
const int n1 = time + seed * seed + seed * seed * seed;
41-
const int n2 = time + seed + seed * seed + seed * seed * seed * 3;
42-
if (((n1 >> 6) & 0x7) == 0x7)
43-
{
44-
dx = (1 - cos((n1 & 0x7f) / 64.0f * 2.f * std::numbers::pi)) * (20 + ((seed * seed) % 9));
45-
dy = (sin((n1 & 0x7f) / 64.0f * 2.f * std::numbers::pi)) * (20 + ((seed * seed) % 9));
46-
}
47-
48-
if (((n2 >> 8) & 0xf) == 0xf)
49-
{
50-
dy += (1 - cos((n2 & 0xff) / 256.0f * 2.f * 3.141592)) * (150 + ((seed * seed) % 9));
51-
}
52-
53-
this->position = this->basePosition + Position(dx, dy);
16+
Enemy(const Sprite& sprite) noexcept;
17+
Enemy(const Enemy& copy) noexcept;
5418

55-
this->draw();
56-
}
19+
void tick(const Time time);
5720
};

Frame.cpp

-1
This file was deleted.

Frame.h

-7
This file was deleted.

GameComponent.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -1 +1,11 @@
11
#include "GameComponent.h"
2+
3+
GameComponent::GameComponent(const Sprite& sprite) : sprite(sprite)
4+
{
5+
6+
}
7+
8+
void GameComponent::draw()
9+
{
10+
DrawSprite(sprite, position.x, position.y, size.width, size.height, angle, 0xffffffff);
11+
}

0 commit comments

Comments
 (0)