-
Notifications
You must be signed in to change notification settings - Fork 0
/
level_handler.cpp
126 lines (89 loc) · 3.26 KB
/
level_handler.cpp
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include "level_handler.h"
#include "game_defs.h"
#include <time.h>
#include <math.h>
void LevelHandler::Create(b2World* world, std::set<b2Body*>* bodies_tbd, std::set<b2Joint*>* joints_tbd) {
LOG("LevelHandler::Create");
GameObject::Create(b2Vec2(0, 0));
m_world = world;
groundFixtureDef.friction = 1.0f;
groundFixtureDef.filter.categoryBits = 0x0004;
}
void LevelHandler::GenerateLevel(const int width, const int height) {
srand(time(NULL));
groundDef.type = b2_staticBody;
groundDef.userData = (void*)GROUND;
cur_level = m_world->CreateBody(&groundDef);
int x = 0;
int slope = 1;
int dx, dy;
int last_height = rand() % height + MIN_HEIGHT;
int next_goal = rand() % 100 + 300;
int slope_width = rand() % 600 + 300;
while (x <= width) {
if (next_goal < 0) {
next_goal = rand() % 100 + 300;
dx = rand() % (GOAL_MAX_WIDTH - GOAL_MIN_WIDTH) + GOAL_MIN_WIDTH;
dy = 0;
}
else {
dx = rand() % (SLICE_MAX_WIDTH - SLICE_MIN_WIDTH) + SLICE_MIN_WIDTH;
dy = rand() % (SLICE_MAX_HEIGHT - SLICE_MIN_HEIGHT) + SLICE_MIN_HEIGHT;
if (slope_width < 0 || last_height + (slope * dy) > height || last_height + (slope * dy) < MIN_HEIGHT) {
slope_width = rand() % 600 + 300;
slope *= -1;
}
}
b2Vec2 verts[4];
verts[0] = b2Vec2(x, last_height);
verts[1] = b2Vec2(x + dx, last_height + (slope * dy));
verts[2] = b2Vec2(x + dx, 0);
verts[3] = b2Vec2(x, 0);
b2PolygonShape* shape = new b2PolygonShape();
shape->Set(verts, 4);
groundFixtureDef.shape = shape;
cur_level->CreateFixture(&groundFixtureDef);
x += dx;
slope_width -= dx;
next_goal -= dx;
last_height += (slope*dy);
}
}
void LevelHandler::ClearWorld() {
b2Body* b = m_world->GetBodyList();
b2Body* next;
while (b != NULL) { // Destroy all Box2D bodies
next = b->GetNext();
m_world->DestroyBody(b);
b = next;
}
}
void LevelComponent::Create(AvancezLib* system, LevelHandler* go, std::set<GameObject*>* game_objects, Camera* camera) {
Component::Create(system, go, game_objects);
m_camera = camera;
m_level = go->GetLevel();
sprite = system->createSprite("data/ground_slice.bmp");
}
void LevelComponent::Update(float dt) {
b2Fixture* fixture = m_level->GetFixtureList();
while (fixture) {
b2PolygonShape* shape = (b2PolygonShape *)fixture->GetShape();
b2EdgeShape* edge = new b2EdgeShape();
edge->Set(shape->m_vertices[2], shape->m_vertices[1]);
b2Vec2 vert1 = edge->m_vertex1;
b2Vec2 vert2 = edge->m_vertex2;
float zoom = m_camera->GetZoom();
float32 width = vert2.x - vert1.x;
float32 height = abs(vert1.y - vert2.y);
float32 length = sqrt(pow(width, 2) + pow(height, 2)) * zoom;
//SDL_Log("Data: %f, %f, %f", width, height, length);
float32 center_x = vert2.x - (width/2.f);
float32 center_y = std::max(vert1.y, vert2.y) - (height/2.f);
m_camera->WorldToScreen(¢er_x, ¢er_y);
//SDL_Log("Center: %f, %f", center_x, center_y);
float angle = atan((vert2.y - vert1.y) / abs(vert2.x - vert1.x)) * -RADTODEG;
sprite->draw(center_x - (length/2), center_y , angle, length, 1);
//SDL_Log("y-value %f, %f",center_y - (height*zoom) / 2, center_y + (height*zoom)/2);
fixture = fixture->GetNext();
}
}