Загрузка данных


#include <SDL.h>
#include <fstream>

const int W = 800;
const int H = 600;
const int TILE = 32;

const int GW = W / TILE;
const int GH = H / TILE;

int grid[100][100];

bool playMode = false;

// сохранение
void saveLevel()
{
    std::ofstream f("level.lvl");

    for (int y = 0; y < GH; y++)
    {
        for (int x = 0; x < GW; x++)
        {
            f << grid[x][y] << " ";
        }
        f << "\n";
    }

    f.close();
}

// загрузка
void loadLevel()
{
    std::ifstream f("level.lvl");

    for (int y = 0; y < GH; y++)
    {
        for (int x = 0; x < GW; x++)
        {
            f >> grid[x][y];
        }
    }

    f.close();
}

int main(int argc, char* argv[])
{
    SDL_Init(SDL_INIT_VIDEO);

    SDL_Window* window = SDL_CreateWindow(
        "2D Hammer++",
        SDL_WINDOWPOS_CENTERED,
        SDL_WINDOWPOS_CENTERED,
        W, H,
        0
    );

    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0);

    bool running = true;

    while (running)
    {
        SDL_Event e;

        while (SDL_PollEvent(&e))
        {
            if (e.type == SDL_QUIT)
                running = false;

            // клавиши
            if (e.type == SDL_KEYDOWN)
            {
                if (e.key.keysym.sym == SDLK_p)
                    playMode = !playMode;

                if (e.key.keysym.sym == SDLK_s)
                    saveLevel();

                if (e.key.keysym.sym == SDLK_l)
                    loadLevel();
            }

            // мышь (только в редакторе)
            if (!playMode && e.type == SDL_MOUSEBUTTONDOWN)
            {
                int x = e.button.x / TILE;
                int y = e.button.y / TILE;

                if (e.button.button == SDL_BUTTON_LEFT)
                    grid[x][y] = 1;

                if (e.button.button == SDL_BUTTON_RIGHT)
                    grid[x][y] = 0;

                if (e.button.button == SDL_BUTTON_MIDDLE)
                    grid[x][y] = 2; // шип
            }
        }

        SDL_SetRenderDrawColor(renderer, 30, 30, 30, 255);
        SDL_RenderClear(renderer);

        // рендер сетки
        for (int y = 0; y < GH; y++)
        for (int x = 0; x < GW; x++)
        {
            SDL_Rect r = { x*TILE, y*TILE, TILE, TILE };

            if (grid[x][y] == 1)
                SDL_SetRenderDrawColor(renderer, 200, 200, 200, 255);

            else if (grid[x][y] == 2)
                SDL_SetRenderDrawColor(renderer, 255, 50, 50, 255);

            else
                SDL_SetRenderDrawColor(renderer, 50, 50, 50, 255);

            SDL_RenderFillRect(renderer, &r);

            SDL_SetRenderDrawColor(renderer, 70, 70, 70, 255);
            SDL_RenderDrawRect(renderer, &r);
        }

        SDL_RenderPresent(renderer);
    }

    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();

    return 0;
}