2 #include "graphics/Camera.h"
3 #include "graphics/Canvas.h"
4 #include "graphics/Color.h"
5 #include "graphics/Vector.h"
6 #include "graphics/Window.h"
7 #include "world/AABB.h"
28 vector<AABB> stationary;
35 vector<Collision> coll;
40 , cam(Vector<int>(), focus)
47 void key_down(const SDL_KeyboardEvent &e, World &world) {
48 switch (e.keysym.sym) {
66 void key_up(const SDL_KeyboardEvent &e, World &world) {
67 switch (e.keysym.sym) {
85 void handle(World &world) {
87 while (SDL_PollEvent(&event)) {
93 if (event.window.event == SDL_WINDOWEVENT_RESIZED) {
94 world.cam.Resize(event.window.data1, event.window.data2);
98 if (!event.key.repeat) {
99 key_down(event.key, world);
103 if (!event.key.repeat) {
104 key_up(event.key, world);
111 void update(int dt, World &world) {
112 const Vector<float> speed { 5, 5 };
114 const float delta = dt / 1e3;
116 world.controlled.Move(Vector<float>(world.move) * speed * delta);
117 world.focus = world.controlled.Center();
120 for (const AABB &e : world.stationary) {
121 World::Collision coll;
122 if (world.controlled.Intersects(
127 world.coll.push_back(coll);
132 void render(Canvas &canvas, const World &world) {
133 constexpr Color background(0x00, 0x00, 0x00);
134 constexpr Color outlineColor(0x00, 0x00, 0xFA);
135 constexpr Color controlledColor(0xFA, 0xFA, 0x00);
136 constexpr Color entityColor(0x00, 0xFA, 0x00);
137 constexpr Color collisionColor(0xFA, 0x00, 0x00);
138 constexpr Color normalColor(0xFA, 0x00, 0x00);
140 canvas.SetColor(background);
143 canvas.SetColor(outlineColor);
145 world.cam.ToScreen(Vector<int>(0, 0)),
146 world.cam.ToScale(Vector<float>(10, 10)),
147 world.cam.ToScale(Vector<float>(1, 1)));
149 canvas.SetColor(entityColor);
150 for (const AABB &e : world.stationary) {
152 world.cam.ToScreen(Vector<float>(e.Left(), e.Top())),
153 world.cam.ToScale(e.Size()));
156 canvas.SetColor(controlledColor);
158 world.cam.ToScreen(Vector<float>(world.controlled.Left(), world.controlled.Top())),
159 world.cam.ToScale(world.controlled.Size()));
161 if (world.coll.empty()) return;
163 for (const World::Collision &c : world.coll) {
164 canvas.SetColor(collisionColor);
166 world.cam.ToScreen(c.pos),
167 world.cam.ToScreen(c.pos + c.depth));
168 canvas.SetColor(normalColor);
170 world.cam.ToScreen(c.pos),
171 world.cam.ToScreen(c.pos) + Vector<int>(c.norm * 25.0f));
175 void run(Canvas &canvas) {
177 world.cam.SetScale(Vector<float>(32, 32));
178 world.controlled.Resize(Vector<float>(2, 3));
179 world.controlled.Move(Vector<float>(1, 1.5));
182 e.Resize(Vector<float>(2, 2));
183 e.Move(Vector<float>(5, 5));
184 world.stationary.push_back(e);
185 e.Move(Vector<float>(0, 2));
186 world.stationary.push_back(e);
187 e.Move(Vector<float>(-2, 0));
188 world.stationary.push_back(e);
190 Uint32 last = SDL_GetTicks();
191 while (world.alive) {
193 Uint32 now = SDL_GetTicks();
195 int delta = now - last;
199 } else if (delta > 30) {
203 update(delta, world);
204 render(canvas, world);
214 int main(int argc, const char *argv[]) {
215 SDL sdl(SDL_INIT_VIDEO);
218 "orbi collision test",
220 Vector<int>(800, 600),
223 Canvas canv(win.CreateCanvas(