← index
Mutatris/source/main.cpp
Source: Mutatris/source/main.cpp
#include<iostream>

#include<string>

#include<cstdlib>

#include<sstream>

#include"SDL.h"

#include"SDL_ttf.h"

#include"quadtris.hpp"

#include"argz.hpp"

#include"util.hpp"

#include"intro.hpp"

#include"game_object.hpp"

#include<memory>

#ifdef FOR_WASM

#include<emscripten/emscripten.h>

#endif

#include"version_info.hpp"

#ifdef HAS_SOUND

#include"sound.hpp"

#endif

#include"startup.hpp"


SDL_Texture *main_texture;
bool running = true;
SDL_Event event;
SDL_Renderer *renderer;

void eventProc() {
    while (SDL_PollEvent(&event)) {
        if (event.type == SDL_QUIT || (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_ESCAPE)) {
            running = false;
        }
        obj::object->event(renderer, event);
    }
    SDL_SetRenderTarget(renderer, main_texture);
    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
    SDL_RenderClear(renderer);
    obj::object->draw(renderer);
    SDL_SetRenderTarget(renderer, nullptr);
    SDL_RenderCopy(renderer, main_texture, nullptr, nullptr);
    SDL_RenderPresent(renderer);

}

int main(int argc, char **argv) {
    int width = 1280, height = 720;
    const int TEX_WIDTH = 1280, TEX_HEIGHT = 720;

    Argz<std::string> argz(argc, argv);
    argz.addOptionSingleValue('p', "path")
    .addOptionSingleValue('r', "Resolution")
    .addOptionSingle('f', "fullscreen mode")
    .addOptionDoubleValue('P', "path", "path to assets")
    .addOptionDoubleValue('R', "resolution", "window resolution")
    .addOptionDouble('F', "fullscreen", "Full screen mode");


    int value = 0;
    Argument<std::string> arg;
    bool full = false;
    std::cout << "Mutatris v" << version_info << ": written by Jared Bruni\n";

    try {
        while((value = argz.proc(arg)) != -1) {
            switch(value) {
                case 'f':
                case 'F':
                full = true;
                break;
                case 'p':
                case 'P':
                    util::path = arg.arg_value;
                    break;
                
                case 'R':
                case 'r': {
                    std::string resolution = arg.arg_value;
                    auto pos = resolution.find("x");
                    if(pos != std::string::npos) {
                        width = std::stoi(resolution.substr(0, pos));
                        height = std::stoi(resolution.substr(pos+1));
                        if(width == 0 || height == 0) {
                            std::cerr << "Mutatris: Invalid resolution.\n";
                        }
                        std::cout << "Mutatris: Setting resolution: " << width << "x" << height << "\n";
                    }
                }
                    break;
           }
        }
    } catch(const ArgException<std::string> &e) {
        std::cerr << "Mutatris: Syntax Error: " << e.text() << "\n";
    }

#ifdef HAS_SOUND

    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK | SDL_INIT_EVENTS | SDL_INIT_GAMECONTROLLER) != 0) {
#else

    if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK | SDL_INIT_EVENTS | SDL_INIT_GAMECONTROLLER) != 0) {
#endif

        return EXIT_FAILURE;
    }

    if(TTF_Init() < 0) {
        std::cerr << "Mutatris: Error could not initalize SDL_ttf...\n";
        std::cerr.flush();
        return EXIT_FAILURE;
    }

    TTF_Font *fnt = TTF_OpenFont(util::getFilePath("font.ttf").c_str(), 18);
    if(!fnt) {
        std::cerr << "Mutatris: Error initalizing font..\n";
        std::cerr.flush();
        TTF_Quit();
        SDL_Quit();
        return EXIT_FAILURE;
    }

#ifdef HAS_SOUND

    snd::init();
#endif

    full = true;
    SDL_Window* window = SDL_CreateWindow("Mutatris", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, full == true ? SDL_WINDOW_FULLSCREEN : SDL_WINDOW_SHOWN);
    if (!window) {
        SDL_Quit();
        return EXIT_FAILURE;
    }

    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    if (!renderer) {
        SDL_DestroyWindow(window);
        SDL_Quit();
        return EXIT_FAILURE;
    }

    SDL_Surface *icon = util::loadSurface("block_red.png");

    SDL_SetWindowIcon(window, icon);

    main_texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, TEX_WIDTH, TEX_HEIGHT);
    running = true;

    util::initJoystick();
    
    obj::setObject(new obj::StartupObject());
    obj::object->load(renderer);

#ifdef FOR_WASM

    emscripten_set_main_loop(eventProc, 0, 1);
#else    

    while (running) {
        eventProc(); 
    }
#endif

 
    obj::object.reset();
#ifdef HAS_SOUND

    snd::release();
#endif

    util::closeJoystick();
    SDL_DestroyTexture(main_texture);
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_FreeSurface(icon);
    TTF_CloseFont(fnt);
    TTF_Quit();
    SDL_Quit();

    return EXIT_SUCCESS;
}