#include "doorkeeper/doorkeeper.hpp" #include "doorkeepertestConfig.h" #include "platform.h" #include "platformstrings.h" #include "doorkeeper/helpers/asciimapsource.hpp" #include "doorkeeper/mapreaders/mapstreamraw.hpp" #include #include #include #include #include #include #include #include #include template struct LayerWithData { std::unique_ptr> tilemap; std::unique_ptr device; dk::Layer* layer; std::string path; }; namespace { typedef std::unique_ptr SDLRendererUPtr; typedef std::unique_ptr SDLWindowUPtr; typedef std::unique_ptr SDLTextureUPtr; struct SDLSimple { SDLSimple ( void ); ~SDLSimple ( void ) noexcept; bool initialized; }; template void createLayer ( dk::Tyler<2>& parTiler, LayerWithData& parOut ); void printWelcome ( void ); void addLayer ( dk::Tyler<2>& parTiler, LayerWithData& parLayerInfo, const char* parPath ); void printViewport ( const dk::Viewport<2>& parView, const dk::Layer& parLayer ); std::pair GetRenderingDriver ( void ); } //unnamed namespace int main() { typedef dk::Tyler<2>::coords coords2; using dk::TileMapData; using dkh::AsciiMapSource; SDLSimple sdl_init; if (not sdl_init.initialized) return 1; printWelcome(); SDLWindowUPtr sdl_window( SDL_CreateWindow("DoorKeeper test", 100, 100, 320, 240, SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE), &SDL_DestroyWindow ); const auto rendererDriver = GetRenderingDriver(); SDLRendererUPtr sdl_renderer( SDL_CreateRenderer(sdl_window.get(), rendererDriver.first, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC), &SDL_DestroyRenderer ); dk::Tyler<2> tiler(coords2(10, 6), coords2(64)); LayerWithData bottomLayer; addLayer(tiler, bottomLayer, DATA_PATH"/test.map"); LayerWithData topLayer; addLayer(tiler, topLayer, DATA_PATH"/test_2.map"); printViewport(dk::Viewport<2>(tiler, coords2(10, 6), coords2(0)), *bottomLayer.layer); printViewport(dk::Viewport<2>(tiler, coords2(4, 4), coords2(0)), *bottomLayer.layer); #if !defined(NDEBUG) std::cout << "Map size: " << tiler.map_size() << '\n'; #endif std::cout << "Total tiles: " << tiler.tiles_count() << '\n'; //Load resources SDLTextureUPtr tile_0(nullptr, &SDL_DestroyTexture), tile_1(nullptr, &SDL_DestroyTexture); { tile_0 = SDLTextureUPtr(IMG_LoadTexture(sdl_renderer.get(), "tile_0.png"), &SDL_DestroyTexture); tile_1 = SDLTextureUPtr(IMG_LoadTexture(sdl_renderer.get(), "tile_1.png"), &SDL_DestroyTexture); } //Main loop bool running = true; do { SDL_Event eve; while (SDL_PollEvent(&eve)) { switch (eve.type) { case SDL_KEYDOWN: ////eve.key.keysym.sym //parInput.NotifyKeyAction(InputDevice_Keyboard, eve.key.keysym.scancode, true); break; case SDL_KEYUP: //parInput.NotifyKeyAction(InputDevice_Keyboard, eve.key.keysym.scancode, false); break; case SDL_QUIT: running = false; case SDL_WINDOWEVENT: if (SDL_WINDOWEVENT_RESIZED == eve.window.event) { //parSdlMain->SetResolution(ushort2(static_cast(eve.window.data1), static_cast(eve.window.data2))); } else if (SDL_WINDOWEVENT_CLOSE == eve.window.event) { running = false; } break; } } } while(running); return 0; } namespace { template void createLayer (dk::Tyler<2>& parTiler, LayerWithData& parOut) { } void printWelcome() { std::cout << "Welcome to " << APP_NAME << ' ' << DK_DEVICE_STRING << " version for " << DK_OS_STRING << ' ' << DK_ARCH_STRING << ' ' << DK_BIT_STRING; #if defined(DK_ARM) std::cout << ' ' << DK_ARM_FAMILY_STRING << ' ' << DK_ARM_ARCH_STRING; #endif std::cout << '\n'; } void addLayer (dk::Tyler<2>& parTiler, LayerWithData& parLayerInfo, const char* parPath) { parLayerInfo.path = parPath; parLayerInfo.device = std::unique_ptr(new dkh::AsciiMapSource(parLayerInfo.path, dkh::AsciiMapSource::coords(10, 6))); std::unique_ptr> stream(new dk::MapStreamRaw(*parLayerInfo.device)); parLayerInfo.tilemap = std::unique_ptr>(new dk::TileMapData(std::move(stream))); parLayerInfo.layer = &parTiler.push_layer(*parLayerInfo.tilemap); } void printViewport (const dk::Viewport<2>& parView, const dk::Layer& parLayer) { int col = 0; const auto tilecount = parView.count(); for (auto itTile = parView.begin(parLayer), itTileEND = parView.end(parLayer); itTile != itTileEND; ++itTile) { std::cout << *itTile; ++col; if (col == tilecount.x()) { col = 0; std::cout << '\n'; } } } SDLSimple::SDLSimple() { if (SDL_Init(SDL_INIT_EVERYTHING) == -1) { std::cerr << "Error initializing SDL" << std::endl; initialized = false; } else { initialized = true; } } SDLSimple::~SDLSimple() { if (initialized) { initialized = false; SDL_Quit(); } } std::pair GetRenderingDriver() { typedef std::pair RetPairType; const int count = SDL_GetNumRenderDrivers(); int opengles = -1; int opengles2 = -1; int opengl = -1; SDL_RendererInfo info; for (int z = 0; z < count; ++z) { const int ret = SDL_GetRenderDriverInfo(z, &info); if (0 == ret) { if (std::strcmp("opengles", info.name) == 0) opengles = z; else if (std::strcmp("opengles2", info.name) == 0) opengles2 = z; else if (std::strcmp("opengl", info.name) == 0) opengl = z; } } if (opengl > -1) return RetPairType(opengl, "opengl"); if (opengles2 > -1) return RetPairType(opengles2, "opengles2"); if (opengles > -1) return RetPairType(opengles, "opengles"); return RetPairType(-1, "default"); } } //unnamed namespace