forked from botanegg/pseudo3DEngine
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Object2D.h
100 lines (76 loc) · 3.19 KB
/
Object2D.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
//
// Created by ivan- on 18.01.2020.
//
#ifndef PSEUDO3DENGINE_OBJECT2D_H
#define PSEUDO3DENGINE_OBJECT2D_H
#include <utility>
#include <vector>
#include <cmath>
#include "Idrawable.h"
#include "settings.h"
struct Point2D {
double x = 0;
double y = 0;
Point2D& operator+=(const Point2D& point2D) { this->x += point2D.x; this->y += point2D.y; }
Point2D& operator=(const Point2D& point2D) { this->x = point2D.x; this->y = point2D.y; return *this; }
Point2D& operator*(double number) { this->x *= number; this->y *= number; }
double operator*(const Point2D& point2D) { return x*point2D.x + y*point2D.y; }
Point2D operator-(const Point2D& point2D) const { return {this->x - point2D.x, this->y - point2D.y}; }
Point2D operator+(const Point2D& point2D) const { return {this->x + point2D.x, this->y + point2D.y}; }
Point2D normalize() { return Point2D{this->x/abs(), this->y/abs()};}
double abs() {return sqrt(x*x + y*y); }
};
class Object2D : virtual public Idrawable {
protected:
std::vector<Point2D> v_points2D;
Point2D p_position;
Point2D p_velocity;
std::string s_name;
double d_height = 1;
bool b_isMirror = false;
sf::Texture T_texture;
std::string s_texture;
bool texture_loaded = false;
public:
Object2D(Point2D position = {0, 0}, std::vector<Point2D> points = {}, double height = 1, std::string texture = WALL_TEXTURE, Point2D velocity = {0, 0})
: p_position(position), v_points2D(points), p_velocity(velocity), s_texture(std::move(texture)), d_height(height) {}
Object2D(const Object2D& object2D) { // copy constructor
v_points2D = object2D.v_points2D;
p_position = object2D.p_position;
p_velocity = object2D.p_velocity;
s_name = object2D.s_name;
d_height = object2D.d_height;
b_isMirror = object2D.b_isMirror;
T_texture = object2D.T_texture;
s_texture = object2D.s_texture;
texture_loaded = object2D.texture_loaded;
}
const double x() { return p_position.x; }
const double y() { return p_position.y; }
void setPosition(Point2D position) { p_position = position; };
void shift(Point2D vector) { p_position += vector; }
std::vector<Point2D>& nodes() { return v_points2D; }
static bool segments_crossing(std::pair<Point2D, Point2D> segment1, std::pair<Point2D, Point2D> segment2, Point2D& point);
void setName(std::string name) {s_name = name;}
std::string getName() const { return s_name; }
Point2D position() const { return p_position; }
bool isMirror () const { return b_isMirror; }
void makeMirror() { b_isMirror = true; }
void makeItNotMirror() {b_isMirror = false; }
void draw(sf::RenderWindow& window) override;
double height() const { return d_height; }
sf::Texture& loadTexture() {
if(texture_loaded) return T_texture;
texture_loaded = true;
if (!T_texture.loadFromFile(s_texture)) {
texture_loaded = false;
}
T_texture.setRepeated(true);
return T_texture;
}
virtual int type() { return 0; }
void setPoints2D (std::vector<Point2D> points2D) {
v_points2D = std::move(points2D);
}
};
#endif //PSEUDO3DENGINE_OBJECT2D_H