/* * Copyright (C) 2016 Google, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef GAME_H #define GAME_H #include <chrono> #include <iostream> #include <string> #include <vector> class Shell; class Game { public: Game(const Game &game) = delete; Game &operator=(const Game &game) = delete; virtual ~Game() {} struct Settings { std::string name; int initial_width; int initial_height; int queue_count; int back_buffer_count; int ticks_per_second; bool vsync; bool animate; bool validate; bool validate_verbose; bool no_tick; bool no_render; bool no_present; // Whether or not to use VkFlushMappedMemoryRanges bool flush_buffers; int max_frame_count; }; const Settings &settings() const { return settings_; } virtual void attach_shell(Shell &shell) { shell_ = &shell; } virtual void detach_shell() { shell_ = nullptr; } virtual void attach_swapchain() {} virtual void detach_swapchain() {} enum Key { // virtual keys KEY_SHUTDOWN, // physical keys KEY_UNKNOWN, KEY_ESC, KEY_UP, KEY_DOWN, KEY_SPACE, }; virtual void on_key(Key key) {} virtual void on_tick() {} virtual void on_frame(float frame_pred) {} void print_stats(); void quit(); protected: int frame_count; std::chrono::time_point<std::chrono::system_clock> start_time; Game(const std::string &name, const std::vector<std::string> &args) : settings_(), shell_(nullptr) { settings_.name = name; settings_.initial_width = 1280; settings_.initial_height = 1024; settings_.queue_count = 1; settings_.back_buffer_count = 1; settings_.ticks_per_second = 30; settings_.vsync = true; settings_.animate = true; settings_.validate = false; settings_.validate_verbose = false; settings_.no_tick = false; settings_.no_render = false; settings_.no_present = false; settings_.flush_buffers = false; settings_.max_frame_count = -1; parse_args(args); frame_count = 0; // Record start time for printing stats later start_time = std::chrono::system_clock::now(); } Settings settings_; Shell *shell_; private: void parse_args(const std::vector<std::string> &args) { for (auto it = args.begin(); it != args.end(); ++it) { if (*it == "--b") { settings_.vsync = false; } else if (*it == "--w") { ++it; settings_.initial_width = std::stoi(*it); } else if (*it == "--h") { ++it; settings_.initial_height = std::stoi(*it); } else if (*it == "--v") { settings_.validate = true; } else if (*it == "--validate") { settings_.validate = true; } else if (*it == "--vv") { settings_.validate = true; settings_.validate_verbose = true; } else if (*it == "--nt") { settings_.no_tick = true; } else if (*it == "--nr") { settings_.no_render = true; } else if (*it == "--np") { settings_.no_present = true; } else if (*it == "--flush") { settings_.flush_buffers = true; } else if (*it == "--c") { ++it; settings_.max_frame_count = std::stoi(*it); } } } }; #endif // GAME_H