Page MenuHomePhabricator (Chris)

No OneTemporary

Authored By
Unknown
Size
43 KB
Referenced Files
None
Subscribers
None
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 &currentEntity = (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

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)

Event Timeline