summaryrefslogtreecommitdiff
path: root/src/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp124
1 files changed, 124 insertions, 0 deletions
diff --git a/src/main.cpp b/src/main.cpp
new file mode 100644
index 0000000..d96441f
--- /dev/null
+++ b/src/main.cpp
@@ -0,0 +1,124 @@
+#include <iostream>
+#include <vector>
+
+#include "SDL.h"
+#include "Qualum.h"
+#include "Rendering.h"
+#include "Color.h"
+
+SDL_Window* window;
+
+float TIME_SCALE = 4.0f;
+
+void quit()
+{
+ SDL_DestroyWindow(window);
+ SDL_Quit();
+}
+
+void read_file(char* filename, int x, int y, int speedx, int speedy)
+{
+ // Create the qualums from the given file
+ // Increasing their positions by (x,y) and their speeds by (speedx, speedy)
+ FILE* input_file = fopen(filename, "r"); // Skip first line
+ if (!input_file)
+ {
+ fprintf(stderr, "File not found: %s\n", filename);
+ exit(1);
+ }
+ char* buffer = (char*)malloc(4096);
+ fgets(buffer, 4096, input_file);
+
+ int xrel, yrel, speedxrel, speedyrel; // Read input file
+ char* color_str = (char*) malloc(4096);
+ char* include_filename = (char*) malloc(4096); // File name for includes
+
+ while (fgets(buffer, 4096, input_file))
+ {
+ int i;
+ for (i = 0; i < strlen(buffer); i++)
+ if (buffer[i] == '#')
+ break;
+ buffer[i] = 0;
+ if (sscanf(buffer, "%d %d %d %d %s", &xrel, &yrel, &speedxrel, &speedyrel, color_str) > 0)
+ {
+ if (color_str[0] == '!') // Include
+ {
+ int c;
+ for (c = 0; color_str[c+1]; c++) // Remove !
+ include_filename[c] = color_str[c+1];
+ include_filename[c] = 0;
+ read_file(include_filename, x + xrel, y + yrel, speedx + speedxrel, speedy + speedyrel);
+ }
+ else // Color
+ {
+ Color color = Colors::read_color(color_str);
+ Qualum::create_qualum(x + xrel, y + yrel, color, speedx + speedxrel, speedy + speedyrel);
+ }
+ }
+ }
+}
+
+int main(int argc, char** argv)
+{
+ if (argc < 2)
+ {
+ fprintf(stderr, "Error: No input file provided.\n");
+ return 1;
+ }
+
+ Qualum::initialize();
+ window = SDL_CreateWindow("Qualums", SDL_WINDOWPOS_UNDEFINED,
+ SDL_WINDOWPOS_UNDEFINED, Rendering::WIDTH, Rendering::HEIGHT,
+ SDL_WINDOW_SHOWN);
+ SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
+
+ SDL_Event event;
+ bool will_quit = false;
+
+ read_file(argv[1], 0, 0, 0, 0);
+
+ int i = 0, last_printed = -1;
+ while (!will_quit)
+ {
+ i++;
+ if (Qualum::iterations != last_printed)
+ {
+ printf("%d\n", Qualum::iterations);
+ last_printed = Qualum::iterations;
+ }
+ SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
+ SDL_RenderClear(renderer);
+ Qualum::update_all(i % ((int)(300/TIME_SCALE)) == 0);
+ Qualum::render_all(renderer);
+ SDL_RenderPresent(renderer);
+ while (SDL_PollEvent(&event))
+ {
+ switch (event.type)
+ {
+ case SDL_QUIT:
+ will_quit = true;
+ break;
+ case SDL_KEYDOWN:
+ if (event.key.keysym.sym >= SDLK_0 && event.key.keysym.sym <= SDLK_9)
+ {
+ TIME_SCALE = (float)(event.key.keysym.sym - SDLK_0);
+ break;
+ }
+ switch (event.key.keysym.sym)
+ {
+ case SDLK_SPACE:
+ Qualum::update_all(true);
+ break;
+ case SDLK_ESCAPE:
+ will_quit = true;
+ break;
+ }
+ break;
+ }
+ }
+ }
+
+ return 0;
+}
+