Page Menu
Home
Phabricator (Chris)
Search
Configure Global Search
Log In
Files
F130119
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
43 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1372c3c..c9b83e8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,10 +1,10 @@
cmake_minimum_required(VERSION 3.14)
project(SDL_Game)
set(CMAKE_CXX_STANDARD 17)
include_directories(include)
find_package(Boost REQUIRED COMPONENTS filesystem)
include_directories(${Boost_INCLUDE_DIRS})
link_directories(lib)
link_libraries(mingw32 SDL2main SDL2 SDL2_image SDL2_gfx)
-add_executable(SDL_Game src/main.cpp src/Game.cpp src/Game.h src/Entity.h src/Component.h src/System.h src/systems/RenderSystem.cpp src/systems/RenderSystem.h src/components/Visibility.cpp src/components/Visibility.h src/components/Velocity.cpp src/components/Velocity.h src/systems/MovementSystem.cpp src/systems/MovementSystem.h src/components/Position.h src/components/PathIndex.h src/GameData.h src/components/Speed.h src/components/Sequence.cpp src/components/Sequence.h src/components/Kind.h src/systems/SpawnSystem.cpp src/systems/SpawnSystem.h src/GameData.cpp src/components/Action.h src/systems/EventSystem.cpp src/systems/EventSystem.h src/components/Draggable.h src/systems/DraggingSystem.cpp src/systems/DraggingSystem.h src/Settings.h src/components/Type.h src/systems/RemoveEntitiesSystem.cpp src/systems/RemoveEntitiesSystem.h src/eventComponents/RemoveEntityEvent.h src/eventComponents/MoveEntityEvent.h src/systems/HandleMoveEntitiySystem.cpp src/systems/HandleMoveEntitiySystem.h src/components/Range.h src/components/RangeShadow.h)
+add_executable(SDL_Game src/main.cpp src/Game.cpp src/Game.h src/Entity.h src/Component.h src/System.h src/systems/RenderSystem.cpp src/systems/RenderSystem.h src/components/Visibility.cpp src/components/Visibility.h src/components/Velocity.cpp src/components/Velocity.h src/systems/MovementSystem.cpp src/systems/MovementSystem.h src/components/Position.h src/components/PathIndex.h src/GameData.h src/components/Speed.h src/components/Sequence.cpp src/components/Sequence.h src/components/Kind.h src/systems/SpawnSystem.cpp src/systems/SpawnSystem.h src/GameData.cpp src/components/Action.h src/systems/EventSystem.cpp src/systems/EventSystem.h src/components/Draggable.h src/systems/DraggingSystem.cpp src/systems/DraggingSystem.h src/Settings.h src/components/Type.h src/systems/RemoveEntitiesSystem.cpp src/systems/RemoveEntitiesSystem.h src/eventComponents/RemoveEntityEvent.h src/eventComponents/MoveEntityEvent.h src/components/Range.h src/components/RangeShadow.h src/Physics.cpp src/Physics.h)
target_link_libraries(SDL_Game ${Boost_LIBRARIES})
\ No newline at end of file
diff --git a/assets/knight.png b/assets/knight.png
deleted file mode 100644
index 9737c77..0000000
Binary files a/assets/knight.png and /dev/null differ
diff --git a/src/Component.h b/src/Component.h
index 1bd14a4..85391f2 100644
--- a/src/Component.h
+++ b/src/Component.h
@@ -1,29 +1,29 @@
//
// Created by Ido Mozes on 20/06/2019.
//
#ifndef SDL2_GAME_COMPONENT_H
#define SDL2_GAME_COMPONENT_H
struct Point {
- short X;
- short Y;
+ float X;
+ float Y;
};
class Entity;
enum ComponentType {
VISIBILITY, POSITION, VELOCITY, SPEED, ACCELERATION, PATH_INDEX, HEALTH, KIND, TYPE,RANGE, DAMAGE, PIERCE, SPREAD, SEQUENCE, ACTION, DRAGGABLE,RANGE_SHADOW,
MOVE_ENTITY_EVENT, REMOVE_ENTITY_EVENT,
LENGTH
};
class Component {
public:
Component() = default;
virtual ~Component() = default;
};
#endif //SDL2_GAME_COMPONENT_H
diff --git a/src/Game.cpp b/src/Game.cpp
index 411b587..1aa1517 100644
--- a/src/Game.cpp
+++ b/src/Game.cpp
@@ -1,124 +1,133 @@
//
// Created by Ido Mozes on 18/06/2019.
//
#include <array>
#include "Game.h"
using namespace boost::filesystem;
Game::Game(bool fullscreen, float mapScale) {
gameData.mapScale = mapScale;
gameData.fullscreen = fullscreen;
path p = path("../assets/Bloons");
directory_iterator it{p};
for (auto &p :it) {
gameData.assets[p.path().filename().string().substr(0, p.path().filename().string().length() - 4)] = IMG_Load(
p.path().string().c_str());
}
+ p = path("../assets/Sprites");
+ it = directory_iterator{p};
+ for (auto &p :it) {
+ gameData.assets[p.path().filename().string().substr(0, p.path().filename().string().length() - 4)] = IMG_Load(
+ p.path().string().c_str());
+ }
gameData.assets["map"] = IMG_Load("../assets/map0.jpg");
gameData.assets["upgrade_bar"] = IMG_Load("../assets/upgrade_bar.jpg");
gameData.assets["upgrade_bar2"] = IMG_Load("../assets/upgrade_bar2.jpg");
gameData.assets["menu"] = IMG_Load("../assets/menu.jpg");
- gameData.assets["Super_Monkey"] = IMG_Load("../assets/Super_Monkey.png");
- gameData.assets["Sniper_Monkey"] = IMG_Load("../assets/Sniper_Monkey.png");
renderSystem = new RenderSystem();
renderSystem->init(gameData);
loadMap();
std::initializer_list<std::pair<std::string, Point>> sprites[]{
{{"map", {SIDEBAR_WIDTH, 0}}},
{},
{},
{{"upgrade_bar", {0, 0}}, {"menu", {MAP_WIDTH + SIDEBAR_WIDTH, 0}}},
};
for (int i = 0; i < N_LAYERS; i++) {
for (auto &sprite :sprites[i]) {
auto spriteEntity = new Entity();
spriteEntity->addComponent<Visibility>(gameData.renderer, gameData.assets[sprite.first],
- SDL_Rect{sprite.second.X, sprite.second.Y,
+ SDL_Rect{int(sprite.second.X), int(sprite.second.Y),
gameData.assets[sprite.first]->w,
gameData.assets[sprite.first]->h});
layers[i].emplace_back(spriteEntity);
}
}
- auto button = new Entity();
- button->addComponent<Kind>("Super_Monkey");
- button->addComponent<Visibility>(gameData.renderer, gameData.assets["Super_Monkey"],
- SDL_Rect{SIDEBAR_WIDTH + MAP_WIDTH + 10, 10,
- int(gameData.assets["Super_Monkey"]->w / 1.5), 0});
- button->addComponent<Action>(DRAG);
- button->addComponent<Range>(200);
- layers[MENU_LAYER].emplace_back(button);
- button = new Entity();
- button->addComponent<Kind>("Sniper_Monkey");
- button->addComponent<Visibility>(gameData.renderer, gameData.assets["Sniper_Monkey"],
- SDL_Rect{SIDEBAR_WIDTH + MAP_WIDTH + 100, 10,
- int(gameData.assets["Sniper_Monkey"]->w / 1.5), 0});
- button->addComponent<Action>(DRAG);
- button->addComponent<Range>(30);
- layers[MENU_LAYER].emplace_back(button);
+ auto tower = new Entity();
+ tower->addComponent<Kind>("Super_Monkey");
+ tower->addComponent<Visibility>(gameData.renderer, gameData.assets["Super_Monkey"],
+ SDL_Rect{SIDEBAR_WIDTH + MAP_WIDTH + 10, 10,
+ int(gameData.assets["Super_Monkey"]->w / 1.5), 0});
+ tower->addComponent<Action>(DRAG);
+ tower->addComponent<Range>(100);
+ layers[MENU_LAYER].emplace_back(tower);
+ tower = new Entity();
+ tower->addComponent<Kind>("Sniper_Monkey");
+ tower->addComponent<Visibility>(gameData.renderer, gameData.assets["Sniper_Monkey"],
+ SDL_Rect{SIDEBAR_WIDTH + MAP_WIDTH + 100, 10,
+ int(gameData.assets["Sniper_Monkey"]->w / 1.5), 0});
+ tower->addComponent<Action>(DRAG);
+ tower->addComponent<Range>(30);
+ layers[MENU_LAYER].emplace_back(tower);
auto s = new Entity();
s->addComponent<Sequence>(100, 10, 0);
s->addComponent<Kind>(std::string("Ceramic"));
- s->addComponent<Speed>(3.5);
+ s->addComponent<Type>(SEQUENCE_T);
+ s->addComponent<Speed>(1);
layers[GAME_LAYER].emplace_back(s);
s = new Entity();
s->addComponent<Sequence>(100, 10, 60 * 5);
s->addComponent<Kind>(std::string("Blue"));
- s->addComponent<Speed>(1.5);
+ s->addComponent<Type>(SEQUENCE_T);
+ s->addComponent<Speed>(1);
layers[GAME_LAYER].emplace_back(s);
systems.emplace_back(new EventSystem);
systems.emplace_back(new SpawnSystem);
systems.emplace_back(new DraggingSystem);
systems.emplace_back(new MovementSystem);
- systems.emplace_back(new HandleMoveEntitiySystem);
systems.emplace_back(new RemoveEntitiesSystem);
systems.emplace_back(renderSystem);
}
Game::~Game() {
SDL_Quit();
}
void Game::update() {
for (auto &system : systems) {
system->update(layers, gameData);
}
}
void Game::loadMap() {
std::string fileName = "../assets/map" + std::to_string(gameData.map);
std::ifstream obstaclesFile(fileName + "_obstacles.data", std::ios::binary);
int x = 0, y = 0;
for (int i = 0; i < ceilf(MAP_WIDTH * MAP_HEIGHT / 8.0); ++i) {
unsigned char byte;
obstaclesFile.read((char *) &byte, 1);
for (int j = 0; j < 8; ++j) {
char bit = (byte & 2 << j) >> j;
gameData.mapData[x][y] = bit;
x++;
if (x == MAP_WIDTH) {
x = 0;
y++;
}
if (x * y >= MAP_WIDTH * MAP_HEIGHT)
goto readPathFile;
}
}
readPathFile:
gameData.path.clear();
std::ifstream pathFile(fileName + "_path.data", std::ios::binary);
unsigned int length;
- pathFile.read((char *) &gameData.startingPoint, 4);
+
+ TempPoint startingPoint, finishPoint;
+ pathFile.read((char *) &startingPoint, 4);
pathFile.read((char *) &length, 4);
gameData.path.resize(length);
pathFile.read(&gameData.path[0], length);
- pathFile.read((char *) &gameData.finishPoint, 4);
+ pathFile.read((char *) &finishPoint, 4);
+ gameData.startingPoint = {float(startingPoint.X), float(startingPoint.Y)};
+ gameData.finishPoint = {float(finishPoint.X), float(finishPoint.Y)};
}
diff --git a/src/Game.h b/src/Game.h
index 8824648..5a9cee5 100644
--- a/src/Game.h
+++ b/src/Game.h
@@ -1,48 +1,47 @@
//
// Created by Ido Mozes on 18/06/2019.
//
#ifndef SDL2_GAME_GAME_H
#define SDL2_GAME_GAME_H
#include <iostream>
#include <cmath>
#include <fstream>
#include <memory>
#include <vector>
#include "SDL.h"
#include "SDL_image.h"
#include <comdef.h>
#include "Entity.h"
#include "System.h"
#include "systems/RenderSystem.h"
#include "systems/MovementSystem.h"
#include "systems/EventSystem.h"
#include "systems/SpawnSystem.h"
#include "systems/DraggingSystem.h"
-#include "systems/HandleMoveEntitiySystem.h"
#include "systems/RemoveEntitiesSystem.h"
#include "GameData.h"
#include "boost/filesystem.hpp"
#include <iostream>
-
+struct TempPoint{short X;short Y;};
class Game {
std::vector<std::unique_ptr<System>> systems;
Entities layers[N_LAYERS];
RenderSystem * renderSystem;
GameData gameData;
public:
explicit Game(bool fullscreen, float mapScale=1.5);
~Game();
void update();
bool running() { return gameData.isRunning; }
void loadMap();
};
#endif //SDL2_GAME_GAME_H
diff --git a/src/Physics.cpp b/src/Physics.cpp
new file mode 100644
index 0000000..9377aa1
--- /dev/null
+++ b/src/Physics.cpp
@@ -0,0 +1,5 @@
+//
+// Created by Ido Mozes on 11/07/2019.
+//
+
+#include "Physics.h"
diff --git a/src/Physics.h b/src/Physics.h
new file mode 100644
index 0000000..1f9dea7
--- /dev/null
+++ b/src/Physics.h
@@ -0,0 +1,29 @@
+//
+// Created by Ido Mozes on 11/07/2019.
+//
+
+#ifndef SDL_GAME_PHYSICS_H
+#define SDL_GAME_PHYSICS_H
+
+#include <tuple>
+#include <cmath>
+#include "Component.h"
+
+inline std::tuple<float, float> cartesianToPolar(float X, float Y) {
+ float alpha = atan2f(Y, X);
+ float R = X / sinf(alpha);
+ return std::make_tuple(alpha, R);
+}
+
+inline std::tuple<float, float> polarToCartesian(float alpha, float R) {
+ return std::make_tuple(R * cosf(alpha), R * sinf(alpha));
+}
+
+inline float twoPointsDistance(Point point1, Point point2){
+ return sqrtf(powf(point1.X - point2.X, 2) +
+ powf(point1.Y - point2.Y, 2));
+}
+inline float twoPointsAngle(Point point1, Point point2){
+ return atan2f(point2.Y - point1.Y,point2.X - point1.X);
+}
+#endif //SDL_GAME_PHYSICS_H
diff --git a/src/System.h b/src/System.h
index 4098306..8aa941f 100644
--- a/src/System.h
+++ b/src/System.h
@@ -1,40 +1,41 @@
//
// Created by Ido Mozes on 23/06/2019.
//
#ifndef SDL2_GAME_SYSTEM_H
#define SDL2_GAME_SYSTEM_H
#include <initializer_list>
#include <vector>
#include <cmath>
#include "Entity.h"
#include "GameData.h"
#include "components/Sequence.h"
#include "components/Speed.h"
#include "components/Kind.h"
#include "components/Position.h"
#include "components/Visibility.h"
#include "components/PathIndex.h"
#include "components/Velocity.h"
#include "components/Draggable.h"
#include "components/Action.h"
#include "components/Range.h"
+#include "components/Type.h"
#include "components/RangeShadow.h"
#include "eventComponents/MoveEntityEvent.h"
#include "eventComponents/RemoveEntityEvent.h"
typedef std::vector<std::shared_ptr<Entity>> Entities;
inline void
operator+=(Entities &originalVector, Entities &newVector) {
originalVector.insert(originalVector.end(), std::make_move_iterator(newVector.begin()),
std::make_move_iterator(newVector.end()));
}
class System {
public:
virtual void update(Entities *entities, GameData &gameData) = 0;
};
#endif //SDL2_GAME_SYSTEM_H
diff --git a/src/components/Kind.h b/src/components/Kind.h
index fa5f33e..8824d14 100644
--- a/src/components/Kind.h
+++ b/src/components/Kind.h
@@ -1,22 +1,22 @@
//
// Created by Ido Mozes on 07/07/2019.
//
#ifndef SDL_GAME_KIND_H
#define SDL_GAME_KIND_H
#include "../Component.h"
#include <string>
class Kind : public Component {
public:
- std::string kind;
+ std::string value;
static constexpr ComponentType type = ComponentType::KIND;
- explicit Kind(std::string kind) :kind(std::move(kind)) {}
+ explicit Kind(std::string value) :value(std::move(value)) {}
~Kind() override = default;
};
#endif //SDL_GAME_KIND_H
diff --git a/src/components/Position.h b/src/components/Position.h
index 7fbb5ab..df3dc1c 100644
--- a/src/components/Position.h
+++ b/src/components/Position.h
@@ -1,34 +1,27 @@
//
// Created by Ido Mozes on 02/07/2019.
//
#ifndef SDL_GAME_POSITION_H
#define SDL_GAME_POSITION_H
#include "../Component.h"
class Position : public Component {
- float X, Y;
+
public:
+ Point value;
static constexpr ComponentType type = ComponentType::POSITION;
- Position(float x, float y) : X(x), Y(y) {};
+ Position(float x, float y) : value{x,y} {};
~Position() override = default;
- float getX() { return X; }
-
- float getY() { return Y; }
-
- void setPosition(float x, float y) {
- X = x;
- Y = y;
- }
void changePosition(float deltaX, float deltaY) {
- X += deltaX;
- Y += deltaY;
+ value.X += deltaX;
+ value.Y += deltaY;
}
};
#endif //SDL_GAME_POSITION_H
diff --git a/src/components/Range.h b/src/components/Range.h
index 329b10e..e9067c9 100644
--- a/src/components/Range.h
+++ b/src/components/Range.h
@@ -1,20 +1,20 @@
//
// Created by Ido Mozes on 10/07/2019.
//
#ifndef SDL_GAME_RANGE_H
#define SDL_GAME_RANGE_H
#include "../Component.h"
class Range : public Component {
public:
- float range;
+ float value;
static constexpr ComponentType type = ComponentType::RANGE;
- explicit Range(float range) : range(range) {}
+ explicit Range(float value) : value(value) {}
~Range() override = default;
};
#endif //SDL_GAME_RANGE_H
diff --git a/src/components/Speed.h b/src/components/Speed.h
index 496cdcf..db4ffd7 100644
--- a/src/components/Speed.h
+++ b/src/components/Speed.h
@@ -1,21 +1,21 @@
//
// Created by Ido Mozes on 03/07/2019.
//
#ifndef SDL_GAME_SPEED_H
#define SDL_GAME_SPEED_H
#include "../Component.h"
class Speed : public Component {
public:
- float speed;
+ float value;
static constexpr ComponentType type = ComponentType::SPEED;
- explicit Speed(float speed) :speed(speed) {}
+ explicit Speed(float value) :value(value) {}
~Speed() override = default;
};
#endif //SDL_GAME_SPEED_H
diff --git a/src/components/Type.h b/src/components/Type.h
index 2739684..00e5c0b 100644
--- a/src/components/Type.h
+++ b/src/components/Type.h
@@ -1,17 +1,24 @@
//
// Created by Ido Mozes on 09/07/2019.
//
#ifndef SDL_GAME_TYPE_H
#define SDL_GAME_TYPE_H
+
#include "../Component.h"
-enum Types{
- OBSTACLE, TOWER, BLOON, RADIOS
+
+enum Types {
+ OBSTACLE_T, TOWER_T, BLOON_T, SHOT_T, SEQUENCE_T
};
-class Type: public Component{
+
+class Type : public Component {
public:
+ Types value;
static constexpr ComponentType type = ComponentType::TYPE;
- Type() = default;
+
+ Type(Types value) : value(value) {}
+
~Type() override = default;
};
+
#endif //SDL_GAME_TYPE_H
diff --git a/src/components/Velocity.cpp b/src/components/Velocity.cpp
index 3a4e958..bb0c701 100644
--- a/src/components/Velocity.cpp
+++ b/src/components/Velocity.cpp
@@ -1,34 +1,29 @@
//
// Created by Ido Mozes on 02/07/2019.
//
#include "Velocity.h"
-Velocity::Velocity(float x, float y) : X(x), Y(y) {}
+Velocity::Velocity(float x, float y) : value{x, y} {}
-
-void Velocity::turnDirection(float deltaDeg) {
- float alpha, R;
- getAlphaAndR(alpha, R);
- setXAndY(alpha + deltaDeg, R);
+void Velocity::turnDirection(float deltaRad) {
+ auto[alpha, R] = cartesianToPolar(value.X, value.Y);
+ std::tie(value.X, value.Y) = polarToCartesian(alpha + deltaRad, R);
}
-void Velocity::setDirection(float deg) {
- float alpha, R;
- getAlphaAndR(alpha, R);
- setXAndY(deg, R);
+void Velocity::setDirection(float rad) {
+ auto[_, R] = cartesianToPolar(value.X, value.Y);
+ std::tie(value.X, value.Y) = polarToCartesian(rad, R);
}
void Velocity::changeSpeed(float deltaSpeed) {
- float alpha, R;
- getAlphaAndR(alpha, R);
- setXAndY(alpha, R + deltaSpeed);
+ auto[alpha, R] = cartesianToPolar(value.X, value.Y);
+ std::tie(value.X, value.Y) = polarToCartesian(alpha, R + deltaSpeed);
}
void Velocity::setSpeed(float speed) {
- float alpha, R;
- getAlphaAndR(alpha, R);
- setXAndY(alpha, speed);
+ auto[alpha, _] = cartesianToPolar(value.X, value.Y);
+ std::tie(value.X, value.Y) = polarToCartesian(alpha, speed);
}
diff --git a/src/components/Velocity.h b/src/components/Velocity.h
index 4c802c4..c4e8e7a 100644
--- a/src/components/Velocity.h
+++ b/src/components/Velocity.h
@@ -1,64 +1,50 @@
//
// Created by Ido Mozes on 02/07/2019.
//
#ifndef SDL_GAME_VELOCITY_H
#define SDL_GAME_VELOCITY_H
#include <cmath>
-
+#include "../Physics.h"
#include "../Component.h"
class Velocity : public Component {
- float X, Y;
-
- inline void getAlphaAndR(float &alpha, float &R) {
- alpha = atan2f(Y, X);
- R = X / sinf(alpha);
- }
-
- inline void setXAndY(float alpha, float R) {
- X = R * cosf(alpha);
- Y = R * sinf(alpha);
- }
public:
+ Point value;
static constexpr ComponentType type = ComponentType::VELOCITY;
Velocity(float x, float y);
~Velocity() override = default;
- float getX() { return X; }
-
- float getY() { return Y; }
void setVelocity(float x, float y) {
- X = x;
- Y = y;
+ value={x,y};
}
void changeVelocity(float deltaX, float deltaY) {
- X += deltaX;
- Y += deltaY;
+ value.X += deltaX;
+ value.Y += deltaY;
}
- void turnDirection(float deltaDeg);
+ void turnDirection(float deltaRad);
- void setDirection(float deg);
+ void setDirection(float rad);
void setSpeed(float speed);
void changeSpeed(float deltaSpeed);
};
class Acceleration : public Velocity {
public:
static constexpr ComponentType type = ComponentType::ACCELERATION;
Acceleration(float x, float y) : Velocity(x, y) {}
};
#endif //SDL_GAME_VELOCITY_H
diff --git a/src/systems/EventSystem.cpp b/src/systems/EventSystem.cpp
index 1beffad..4d506d3 100644
--- a/src/systems/EventSystem.cpp
+++ b/src/systems/EventSystem.cpp
@@ -1,122 +1,129 @@
//
// Created by Ido Mozes on 08/07/2019.
//
#include "EventSystem.h"
void EventSystem::update(Entities *layers, GameData &gameData) {
SDL_PumpEvents();
SDL_Event event;
while (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_QUIT: {
gameData.isRunning = false;
break;
}
case SDL_MOUSEBUTTONDOWN: {
if (!gameData.isDragging)
gameData.selected.reset();
int mouseX, mouseY, originalMouseX;
SDL_GetMouseState(&mouseX, &mouseY);
mouseX = originalMouseX = int(mouseX / gameData.mapScale);
mouseY = int(mouseY / gameData.mapScale);
bool entityClicked = false;
Entities newEntities[N_LAYERS];
for (int i = N_LAYERS - 1; i >= 0; --i) {
for (auto &entity: layers[i]) {
if (auto components = entity->getComponents<Action, Visibility>()) {
auto[action, visibility] = components.value();
if (action.disabled or (action.actionType != DROP and gameData.isDragging))
continue;
int entityX, entityY, w, h;
SDL_Rect *dstRect = visibility.getDstRect();
entityX = dstRect->x;
entityY = dstRect->y;
w = dstRect->w;
h = dstRect->h;
if (auto positionP = entity->getComponent<Position>()) {
auto &position = *positionP;
- entityX = int(position.getX() - w / 2.0);
- entityY = int(position.getY() - h / 2.0);
+ entityX = int(position.value.X - w / 2.0);
+ entityY = int(position.value.Y - h / 2.0);
mouseX = originalMouseX - SIDEBAR_WIDTH;
} else
mouseX = originalMouseX;
if (entityX <= mouseX and mouseX <= entityX + w and entityY <= mouseY and
mouseY <= entityY + h) {
switch (action.actionType) {
case DRAG: {
auto &kind = *entity->getComponent<Kind>();
auto &range = *entity->getComponent<Range>();
auto draggable = new Entity();
- SDL_Surface *surface = gameData.assets[kind.kind];
+ SDL_Surface *surface = gameData.assets[kind.value];
draggable->addComponent<Visibility>(gameData.renderer, surface, SDL_Rect{
originalMouseX - int(surface->w / 4.0), mouseY - int(surface->h / 4.0),
int(surface->w / 1.5), int(surface->h / 1.5)});
draggable->addComponent<Draggable>();
draggable->addComponent<Action>(DROP);
draggable->addComponent<Kind>(kind);
draggable->addComponent<Range>(range);
+
std::shared_ptr<Entity> ptr(draggable);
gameData.selected = ptr;
auto rangeShadow = new Entity();
rangeShadow->addComponent<RangeShadow>(ptr);
newEntities[SHADOW_LAYER].emplace_back(rangeShadow);
newEntities[MENU_LAYER].emplace_back(ptr);
gameData.isDragging = true;
goto entityClicked;
}
case CLICK: {
goto entityClicked;
}
case DROP: {
auto &draggable = *entity->getComponent<Draggable>();
if (draggable.isPlaceable) {
entity->removeComponent<Draggable>();
entity->getComponent<Action>()->actionType = SELECT;
gameData.isDragging = false;
for (int x = std::max(mouseX - SIDEBAR_WIDTH - 20, 0);
x < std::min(mouseX - SIDEBAR_WIDTH + 21, MAP_WIDTH); ++x) {
for (int y = std::max(mouseY - 20, 0);
y < std::min(mouseY + 21, MAP_HEIGHT); ++y) {
if (gameData.mapData[x][y] == FREE)
gameData.mapData[x][y] = TOWER;
}
}
- if (i == MENU_LAYER){
+ if (i == MENU_LAYER) {
entity->addComponent<MoveEntityEvent>(GAME_LAYER);
+ entity->addComponent<Type>(TOWER_T);
+ auto &visibility = *entity->getComponent<Visibility>();
+ SDL_Rect *dstRect = entity->getComponent<Visibility>()->getDstRect();
+ entity->addComponent<Position>(
+ dstRect->x - SIDEBAR_WIDTH + dstRect->w / 2,
+ dstRect->y + dstRect->h / 2);
}
}
goto entityClicked;
}
case SELECT: {
gameData.selected = entity;
goto entityClicked;
}
}
}
}
}
}
entityClicked:
for (int i = 0; i < N_LAYERS; ++i) {
if (!newEntities[i].empty())
layers[i] += newEntities[i];
}
break;
}
default:
break;
}
}
}
diff --git a/src/systems/HandleMoveEntitiySystem.cpp b/src/systems/HandleMoveEntitiySystem.cpp
deleted file mode 100644
index 6e398ef..0000000
--- a/src/systems/HandleMoveEntitiySystem.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-//
-// Created by Ido Mozes on 10/07/2019.
-//
-
-#include "HandleMoveEntitiySystem.h"
-void HandleMoveEntitiySystem::update(Entities *layers, GameData &gameData) {
- for (int i = 0; i < N_LAYERS; ++i) {
- for (auto &entity: layers[i]) {
- if(auto moveEntityEventP = entity->getComponent<MoveEntityEvent>()) {
- int newLayer = moveEntityEventP->toLayer;
- entity->removeComponent<MoveEntityEvent>();
- layers[newLayer].emplace_back(std::move(entity));
- }
- }
- }
-}
\ No newline at end of file
diff --git a/src/systems/HandleMoveEntitiySystem.h b/src/systems/HandleMoveEntitiySystem.h
deleted file mode 100644
index 3a78602..0000000
--- a/src/systems/HandleMoveEntitiySystem.h
+++ /dev/null
@@ -1,13 +0,0 @@
-//
-// Created by Ido Mozes on 10/07/2019.
-//
-
-#ifndef SDL_GAME_HANDLEMOVEENTITIYSYSTEM_H
-#define SDL_GAME_HANDLEMOVEENTITIYSYSTEM_H
-#include <algorithm>
-#include "../System.h"
-class HandleMoveEntitiySystem : public System {
-public:
- void update(Entities *layers, GameData &gameData) override;
-};
-#endif //SDL_GAME_HANDLEMOVEENTITIYSYSTEM_H
diff --git a/src/systems/MovementSystem.cpp b/src/systems/MovementSystem.cpp
index bc54442..fd7256a 100644
--- a/src/systems/MovementSystem.cpp
+++ b/src/systems/MovementSystem.cpp
@@ -1,68 +1,68 @@
//
// Created by Ido Mozes on 02/07/2019.
//
#include "MovementSystem.h"
void MovementSystem::update(Entities *layers, GameData &gameData) {
for (int i = 0; i < N_LAYERS; ++i) {
for (auto &entity: layers[i]) {
// Move all entities with Visibility and Position
if (auto components = entity->getComponents<Visibility, Position>()) {
auto[visibility, position]=components.value();
float deltaX = 0, deltaY = 0;
if (auto velocityP = entity->getComponent<Velocity>()) {
auto &velocity = *velocityP;
if (auto accelerationP = entity->getComponent<Acceleration>()) {
auto &acceleration = *accelerationP;
- velocity.changeVelocity(acceleration.getX(), acceleration.getY());
+ velocity.changeVelocity(acceleration.value.X, acceleration.value.Y);
}
- deltaX = velocity.getX();
- deltaY = velocity.getY();
+ deltaX = velocity.value.X;
+ deltaY = velocity.value.Y;
} else if (auto components2 = entity->getComponents<PathIndex, Speed>()) {
auto[pathIndex, speed] =components2.value();
- pathIndex.progress += speed.speed;
+ pathIndex.progress += speed.value;
float deltaIndex = pathIndex.progress - pathIndex.index;
while (deltaIndex >= (gameData.path[pathIndex.index] % 2 == 0 ? 1 : sqrt(2))) {
switch (gameData.path[pathIndex.index]) {
case 0:
deltaX += 1;
break;
case 1:
deltaX += 1;
deltaY += 1;
break;
case 2:
deltaY += 1;
break;
case 3:
deltaX += -1;
deltaY += 1;
break;
case 4:
deltaX += -1;
break;
case 5:
deltaX += -1;
deltaY += -1;
break;
case 6:
deltaY += -1;
break;
case 7:
deltaX += 1;
deltaY += -1;
break;
}
deltaIndex -= (gameData.path[pathIndex.index] % 2 == 0 ? 1 : sqrt(2));
if (pathIndex.index < gameData.path.size() - 1)
pathIndex.index++;
}
}
position.changePosition(deltaX, deltaY);
}
}
}
}
diff --git a/src/systems/RemoveEntitiesSystem.cpp b/src/systems/RemoveEntitiesSystem.cpp
index 0d396fb..4dbdb6f 100644
--- a/src/systems/RemoveEntitiesSystem.cpp
+++ b/src/systems/RemoveEntitiesSystem.cpp
@@ -1,15 +1,20 @@
//
// Created by Ido Mozes on 10/07/2019.
//
#include "RemoveEntitiesSystem.h"
void RemoveEntitiesSystem::update(Entities *layers, GameData &gameData) {
for (int i = 0; i < N_LAYERS; ++i) {
layers[i].erase(
- std::remove_if(layers[i].begin(), layers[i].end(), [](auto &entity) {
+ std::remove_if(layers[i].begin(), layers[i].end(), [layers](auto &entity) {
+ if(auto moveEntityEventP = entity->template getComponent<MoveEntityEvent>()) {
+ int newLayer = moveEntityEventP->toLayer;
+ entity->template removeComponent<MoveEntityEvent>();
+ layers[newLayer].emplace_back(std::move(entity));
+ }
return !entity or entity->template getComponent<RemoveEntityEvent>();
}),
layers[i].end());
}
}
\ No newline at end of file
diff --git a/src/systems/RenderSystem.cpp b/src/systems/RenderSystem.cpp
index e4e9089..4f85066 100644
--- a/src/systems/RenderSystem.cpp
+++ b/src/systems/RenderSystem.cpp
@@ -1,69 +1,70 @@
//
// Created by Ido Mozes on 23/06/2019.
//
#include "RenderSystem.h"
#include "../components/Visibility.h"
#include "../components/Position.h"
void RenderSystem::init(GameData &gameData) {
if (gameData.window != nullptr)
SDL_DestroyWindow(gameData.window);
if (gameData.renderer != nullptr)
SDL_DestroyRenderer(gameData.renderer);
gameData.window = SDL_CreateWindow("BloonsTD", SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED, // NOLINT(hicpp-signed-bitwise)
int((MAP_WIDTH + SIDEBAR_WIDTH + MENU_WIDTH) * gameData.mapScale),
int(MAP_HEIGHT * gameData.mapScale),
gameData.fullscreen ? SDL_WINDOW_FULLSCREEN : 0);
gameData.renderer = SDL_CreateRenderer(gameData.window, -1, 0);
SDL_SetRenderDrawColor(gameData.renderer, 255, 255, 255, 255);
}
void RenderSystem::update(Entities *layers, GameData &gameData) {
SDL_RenderClear(gameData.renderer);
for (int i = 0; i < N_LAYERS; ++i) {
for (auto &entity: layers[i]) {
auto rangeShadowP = entity->getComponent<RangeShadow>();
auto ¤tEntity = (rangeShadowP and rangeShadowP->entity == gameData.selected) ? rangeShadowP->entity
: entity;
if (auto visibilityP = currentEntity->getComponent<Visibility>()) {
auto &visibility = *visibilityP;
auto positionP = currentEntity->getComponent<Position>();
SDL_Rect *dstRect = visibility.getDstRect();
SDL_Rect r = {int(dstRect->x * gameData.mapScale), int(dstRect->y * gameData.mapScale),
int(dstRect->w * gameData.mapScale), int(dstRect->h * gameData.mapScale)};
if (positionP) {
auto &position = *positionP;
- r.x = int((position.getX() + SIDEBAR_WIDTH) * gameData.mapScale - r.w / 2.0);
- r.y = int(position.getY() * gameData.mapScale - r.h / 2.0);
+ r.x = int((position.value.X + SIDEBAR_WIDTH) * gameData.mapScale - r.w / 2.0);
+ r.y = int(position.value.Y * gameData.mapScale - r.h / 2.0);
}
- if (gameData.selected == currentEntity and currentEntity != entity){
+ if (gameData.selected == currentEntity and currentEntity != entity) {
int currentEntityX, currentEntityY;
if (positionP) {
- currentEntityX = r.x;
- currentEntityY = r.y;
+ auto &position = *positionP;
+ currentEntityX = int((position.value.X + SIDEBAR_WIDTH) * gameData.mapScale);
+ currentEntityY = int(position.value.Y * gameData.mapScale);
} else {
- currentEntityX = r.x + int((dstRect->w / 2.0) * gameData.mapScale);
- currentEntityY = r.y + int((dstRect->h / 2.0) * gameData.mapScale);
+ currentEntityX = int((dstRect->x + dstRect->w / 2.0) * gameData.mapScale);
+ currentEntityY = int((dstRect->y + dstRect->h / 2.0) * gameData.mapScale);
}
auto draggableP = currentEntity->getComponent<Draggable>();
bool isRed = draggableP ? !draggableP->isPlaceable : false;
- float range = currentEntity->getComponent<Range>()->range;
+ float range = currentEntity->getComponent<Range>()->value *gameData.mapScale;
filledCircleRGBA(gameData.renderer, currentEntityX, currentEntityY, range, isRed ? 255 : 0, 0, 0,
100);
aacircleRGBA(gameData.renderer, currentEntityX, currentEntityY, range, isRed ? 255 : 0, 0, 0, 150);
}
if (entity == currentEntity)
SDL_RenderCopy(gameData.renderer, visibility.getTexture(), nullptr, &r);
}
}
}
SDL_RenderPresent(gameData.renderer);
}
diff --git a/src/systems/SpawnSystem.cpp b/src/systems/SpawnSystem.cpp
index 7c419eb..3f4c944 100644
--- a/src/systems/SpawnSystem.cpp
+++ b/src/systems/SpawnSystem.cpp
@@ -1,32 +1,74 @@
//
// Created by Ido Mozes on 07/07/2019.
//
#include "SpawnSystem.h"
void SpawnSystem::update(Entities *layers, GameData &gameData) {
for (int i = 0; i < N_LAYERS; ++i) {
Entities newEntities;
for (auto &entity: layers[i]) {
- if (auto components = entity->getComponents<Sequence, Kind, Speed>()) {
- auto[sequence, kind, speed] = components.value();
- int amount = sequence.getAmountReady();
- for (int j = 0; j < amount; ++j) {
- auto *newEntity = new Entity();
- newEntity->addComponent<Kind>(kind);
- newEntity->addComponent<Position>(gameData.startingPoint.X, gameData.startingPoint.Y);
- newEntity->addComponent<PathIndex>(0);
- newEntity->addComponent<Speed>(speed.speed);
- SDL_Surface *surface = gameData.assets[kind.kind];
- newEntity->addComponent<Visibility>(gameData.renderer, surface,
- SDL_Rect{gameData.startingPoint.X, gameData.startingPoint.Y,
- surface->w / 3, surface->h / 3});
- newEntities.emplace_back(newEntity);
+ if (auto typeP = entity->getComponent<Type>()) {
+ switch (typeP->value) {
+ case SEQUENCE_T: {
+ auto[sequence, kind, speed] = entity->getComponents<Sequence, Kind, Speed>().value();
+ int amount = sequence.getAmountReady();
+ for (int j = 0; j < amount; ++j) {
+ auto *bloon = new Entity();
+ bloon->addComponent<Type>(BLOON_T);
+ bloon->addComponent<Kind>(kind);
+ bloon->addComponent<Position>(gameData.startingPoint.X, gameData.startingPoint.Y);
+ bloon->addComponent<PathIndex>(0);
+ bloon->addComponent<Speed>(speed.value);
+
+ SDL_Surface *surface = gameData.assets[kind.value];
+ bloon->addComponent<Visibility>(gameData.renderer, surface,
+ SDL_Rect{int(gameData.startingPoint.X),
+ int(gameData.startingPoint.Y),
+ surface->w / 3, surface->h / 3});
+ bloon->addComponent<Range>(std::max(surface->w / 6, surface->h / 6));
+ newEntities.emplace_back(bloon);
+ }
+ break;
+ }
+ case TOWER_T: {
+ auto[kind, towerRange, towerPosition] = entity->getComponents<Kind, Range, Position>().value();
+ float minDistance = MAP_HEIGHT + MAP_WIDTH;
+ Point closestPosition = {-1, -1};
+ Entity * b;
+ for (auto &gameEntity: layers[GAME_LAYER]) {
+ float distance;
+ if (gameEntity->getComponent<Type>()->value == BLOON_T) {
+ auto[bloonRange, bloonPosition] = gameEntity->getComponents<Range, Position>().value();
+ distance =
+ twoPointsDistance(bloonPosition.value, towerPosition.value) - bloonRange.value;
+ if (distance < minDistance) {
+ minDistance = distance;
+ closestPosition = {bloonPosition.value.X, bloonPosition.value.Y};
+ b=gameEntity.get();
+ }
+ }
+ }
+ if (closestPosition.X != -1 and minDistance <= towerRange.value) {
+ auto shot = new Entity();
+ shot->addComponent<Position>(towerPosition.value.X, towerPosition.value.Y);
+ float angle = twoPointsAngle(towerPosition.value, closestPosition);
+ auto[velocityX, velocityY] = polarToCartesian(angle, 10);
+ shot->addComponent<Velocity>(velocityX, velocityY);
+ shot->addComponent<Type>(SHOT_T);
+ SDL_Surface * surface = gameData.assets["Dart"];
+ shot->addComponent<Visibility>(gameData.renderer, gameData.assets["Dart"],
+ SDL_Rect{0, 0, gameData.assets["Dart"]->w / 2});
+ newEntities.emplace_back(shot);
+ }
+
+ break;
+ }
}
}
}
if (!newEntities.empty())
layers[i] += newEntities;
}
}
diff --git a/src/systems/SpawnSystem.h b/src/systems/SpawnSystem.h
index 43bfc11..94efc41 100644
--- a/src/systems/SpawnSystem.h
+++ b/src/systems/SpawnSystem.h
@@ -1,17 +1,18 @@
//
// Created by Ido Mozes on 07/07/2019.
//
#ifndef SDL_GAME_SPAWNSYSTEM_H
#define SDL_GAME_SPAWNSYSTEM_H
#include <vector>
+#include <limits>
#include <iterator>
#include "../System.h"
class SpawnSystem : public System {
public:
void update(Entities *layers, GameData &gameData) override;
};
#endif //SDL_GAME_SPAWNSYSTEM_H
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Mon, Jun 15, 11:24 PM (2 w, 3 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
71942
Default Alt Text
(43 KB)
Attached To
Mode
R74 BloonsTD
Attached
Detach File
Event Timeline