DEBUG_FLAGS, PROFILE_FLAGS, RELEASE_FLAGS:
flags for building binaries in debug, profile, and release mode
+
+
+Running
+=======
+
+blank
+ normal execution
+
+blank <n>
+ terminate after <n> frames
+
+blank -t <t>
+ terminate after <t> milliseconds
+
+blank <n> -t <t>
+ terminate after n frames, assume <t> milliseconds pass each frame
}
+void Application::RunN(size_t n) {
+ Uint32 last = SDL_GetTicks();
+ for (size_t i = 0; i < n; ++i) {
+ Uint32 now = SDL_GetTicks();
+ int delta = now - last;
+ Loop(delta);
+ last = now;
+ }
+}
+
+void Application::RunT(size_t t) {
+ Uint32 last = SDL_GetTicks();
+ Uint32 finish = last + t;
+ while (last < finish) {
+ Uint32 now = SDL_GetTicks();
+ int delta = now - last;
+ Loop(delta);
+ last = now;
+ }
+}
+
+void Application::RunS(size_t n, size_t t) {
+ for (size_t i = 0; i < n; ++i) {
+ Loop(t);
+ }
+}
+
+
void Application::Run() {
running = true;
Uint32 last = SDL_GetTicks();
Application(const Application &) = delete;
Application &operator =(const Application &) = delete;
+ /// run until user quits
void Run();
void Loop(int dt);
+ /// run for n frames
+ void RunN(size_t n);
+ /// run for t milliseconds
+ void RunT(size_t t);
+ /// run for n frames, assuming t milliseconds for each
+ void RunS(size_t n, size_t t);
+
void HandleEvents();
void Update(int dt);
void Render();
#include "app.hpp"
+#include <cctype>
+#include <cstdlib>
+#include <iostream>
+
using namespace blank;
+namespace {
+
+enum Mode {
+ NORMAL,
+ FRAME_LIMIT,
+ TIME_LIMIT,
+ FIXED_FRAME_LIMIT,
+};
+
+}
+
+
int main(int argc, char *argv[]) {
+ Mode mode = NORMAL;
+ size_t n = 0, t = 0;
+
+ bool error = false;
+ for (int i = 1; i < argc; ++i) {
+ if (argv[i] == nullptr || argv[i][0] == '\0') continue;
+ if (argv[i][0] == '-') {
+ if (argv[i][1] == 't' && argv[i][2] == '\0') {
+ ++i;
+ if (i >= argc) {
+ std::cerr << "missing argument to -t" << std::endl;
+ error = true;
+ } else {
+ t = std::strtoul(argv[i], nullptr, 10);
+ }
+ } else {
+ std::cerr << "unable to interpret argument "
+ << i << " (" << argv[i] << ")" << std::endl;
+ error = true;
+ }
+ } else if (std::isdigit(*argv[i])) {
+ n = std::strtoul(argv[i], nullptr, 10);
+ } else {
+ std::cerr << "unable to interpret argument "
+ << i << " (" << argv[i] << ")" << std::endl;
+ error = true;
+ }
+ }
+
+ if (error) {
+ return 1;
+ }
+
+ if (n > 0) {
+ if (t > 0) {
+ mode = FIXED_FRAME_LIMIT;
+ } else {
+ mode = FRAME_LIMIT;
+ }
+ } else if (t > 0) {
+ mode = TIME_LIMIT;
+ }
+
Application app;
- app.Run();
+ switch (mode) {
+ default:
+ case NORMAL:
+ app.Run();
+ break;
+ case FRAME_LIMIT:
+ app.RunN(n);
+ break;
+ case TIME_LIMIT:
+ app.RunT(t);
+ break;
+ case FIXED_FRAME_LIMIT:
+ app.RunS(n, t);
+ break;
+ }
return 0;