#include "Tileset_engine.h" void SDL_RenderDrawGrid(SDL_Renderer* r, int w, int h, int gps) { SDL_SetRenderDrawColor(r, 50, 50, 50, 255); SDL_Rect Grid{ 0, 0, w, h }; SDL_RenderDrawRect(r, &Grid); for (int horz = 0; horz < h; horz += gps) SDL_RenderDrawLine(r, 0, horz, w, horz); for (int vert = 0; vert < w; vert += gps) SDL_RenderDrawLine(r, vert, 0, vert, h); } void MovePlayer(SDL_Renderer* r, SDL_Rect& LastPos, std::vector& Additionals, const int gps, int direction, int win_w, int win_h, int score) { switch (direction) { case 1: if (Additionals[0].y > 0) { if (Additionals.size() > 0) { for (unsigned int p = 0; p < Additionals.size(); p++) Additionals[p].y -= gps; } } break; // up case 2: if (Additionals[0].y < (win_h - gps)) { if (Additionals.size() > 0) { for (unsigned int p = 0; p < Additionals.size(); p++) { Additionals[p].y += gps; } } } break; // down case 3: if (Additionals[0].x > 0) { if (Additionals.size() > 0) { for (unsigned int p = 0; p < Additionals.size(); p++) { Additionals[p].x -= gps; } } } break; // left case 4: if (Additionals[0].x < (win_w - gps)) { if (Additionals.size() > 0) { for (unsigned int p = 0; p < Additionals.size(); p++) Additionals[p].x += gps; } } break; // right } } int main(int args, char* argc[]) { std::cout << "this code can be updated into a snake game!\n"; begin: std::cout << SDL_GetError() << "\n"; // before SDL init const int WinW{ 700 }; const int WinH{ 700 }; // SDL init Init(); SDL_Window* win{ SDL_CreateWindow("SDL TRON-STYLE 2D COLLISION DEMO", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WinW, WinH, SDL_WINDOW_SHOWN) }; SDL_Renderer* ren{ SDL_CreateRenderer(win, -1, SDL_RENDERER_INIT) }; const int GridPointSize{ 5 }; int Score{ 0 }; // player variables SDL_Rect Player{ randomWithinRange(WinW / GridPointSize) * GridPointSize, randomWithinRange(WinH / GridPointSize) * GridPointSize, GridPointSize, GridPointSize }; std::vector PlayerPlacements{}; uint32_t pSteps = 0; int dir{}; SDL_Rect PlayerLastPos{}; PlayerPlacements.push_back(Player); // object variables SDL_Rect Object{ randomWithinRange(WinW / GridPointSize) * GridPointSize, randomWithinRange(WinH / GridPointSize) * GridPointSize, GridPointSize, GridPointSize }; // other variables SDL_Event e; bool q{ false }; bool restart{ false }; // main loop while (!q) { SDL_SetRenderDrawColor(ren, 0, 0, 0, 255); SDL_RenderClear(ren); SDL_RenderDrawGrid(ren, WinW, WinH, GridPointSize); // draw grid // draw player SDL_SetRenderDrawColor(ren, 20, 0, 255, 255); SDL_RenderFillRects(ren, PlayerPlacements.data(), PlayerPlacements.size()); // draw object SDL_SetRenderDrawColor(ren, 255, 50, 0, 255); SDL_RenderFillRect(ren, &Object); SDL_RenderPresent(ren); while (SDL_PollEvent(&e)) { if (e.type == SDL_QUIT) q = true; else if (e.type == SDL_KEYDOWN) { switch (e.key.keysym.sym) { case SDLK_w: if (dir != 2) dir = 1; break; // move up if not moving down case SDLK_s: if (dir != 1) dir = 2; break; // move down if not moving up case SDLK_a: if (dir != 4) dir = 3; break; // move left if not moving right case SDLK_d: if (dir != 3) dir = 4; break; // move right if not moving left case SDLK_p: restart = true; q = true; break; // force restart case SDLKES: q = true; break; // quit } } } for (unsigned int pp = 0; pp < PlayerPlacements.size(); pp++) { if (pp > 0) if (SDL_HasIntersection(&PlayerPlacements[0], &PlayerPlacements[pp])) { restart = true; q = true; } } // self eat if (SDL_HasIntersection(&PlayerPlacements[0], &Object)) { Score += 1; PlayerPlacements.push_back(PlayerPlacements.back()); if (dir == 1) PlayerPlacements.back().y += GridPointSize; if (dir == 2) PlayerPlacements.back().y -= GridPointSize; if (dir == 3) PlayerPlacements.back().x += GridPointSize; if (dir == 4) PlayerPlacements.back().x -= GridPointSize; Object.x = (randomWithinRange(WinW / GridPointSize) * GridPointSize); Object.y = (randomWithinRange(WinH / GridPointSize) * GridPointSize); } MovePlayer(ren, PlayerLastPos, PlayerPlacements, GridPointSize, dir, WinW, WinH, Score); SDL_Delay(50); } // exit code SDL_Window* windows[]{ win }; int numwin{ std::size(windows) }; SDL_Renderer* renderers[]{ ren }; int numren{ std::size(renderers) }; QuitSDL(windows, numwin, renderers, numren); if (restart) goto begin; return 0; }