#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_Rect& Player, std::vector& Additionals, const int gps, int direction, int win_w, int win_h) { SDL_Rect PlayerLastPos = Player; std::vectorNewPos; NewPos.resize(Additionals.size()); switch (direction) { case 1: if (Player.y > 0) { if (Additionals.size() > 0) { for (unsigned int p = 0; p < Additionals.size(); p++) NewPos[p] = Additionals[p]; // put the tail in newpos for (unsigned int p = 0; p < Additionals.size(); p++) Additionals[p] = NewPos[p + 1]; // every element of the tail is put 1 next Additionals[0] = PlayerLastPos; // the part before the head is the last position of the player } Player.y -= gps; } break; // up case 2: if (Player.y < (win_h - gps)) { if (Additionals.size() > 0) { for (unsigned int p = 0; p < Additionals.size(); p++) NewPos[p] = Additionals[p]; // put the tail in newpos for (unsigned int p = 0; p < Additionals.size(); p++) Additionals[p] = NewPos[p + 1]; // every element of the tail is put 1 next Additionals[0] = PlayerLastPos; // the part before the head is the last position of the player } Player.y += gps; } break; // down case 3: if (Player.x > 0) { if (Additionals.size() > 0) { for (unsigned int p = 0; p < Additionals.size(); p++) NewPos[p] = Additionals[p]; // put the tail in newpos for (unsigned int p = 0; p < Additionals.size(); p++) Additionals[p] = NewPos[p + 1]; // every element of the tail is put 1 next Additionals[0] = PlayerLastPos; // the part before the head is the last position of the player } Player.x -= gps; } break; // left case 4: if (Player.x < (win_w - gps)) { if (Additionals.size() > 0) { for (unsigned int p = 0; p < Additionals.size(); p++) NewPos[p] = Additionals[p]; // put the tail in newpos for (unsigned int p = 0; p < Additionals.size(); p++) Additionals[p] = NewPos[p + 1]; // every element of the tail is put 1 next Additionals[0] = PlayerLastPos; // the part before the head is the last position of the player } Player.x += gps; } break; // right } } int main(int args, char* argc[]) { std::cout << "this code can be updated into a snake game!\n"; begin: // 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{}; // 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_RenderFillRect(ren, &Player); if (PlayerPlacements.size() > 0) 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 (SDL_HasIntersection(&Player, &PlayerPlacements[pp])) { restart = true; q = true; } } // self eat if (SDL_HasIntersection(&Player, &Object)) { Score += 1; pSteps += 1; PlayerPlacements.resize(pSteps); Object.x = (randomWithinRange(WinW / GridPointSize) * GridPointSize); Object.y = (randomWithinRange(WinH / GridPointSize) * GridPointSize); } MovePlayer(Player, PlayerPlacements, GridPointSize, dir, WinW, WinH); 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; }