Advertisement
AaronThomsen

Untitled

Jun 18th, 2018
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.74 KB | None | 0 0
  1. #include <SFML/Graphics.hpp>
  2. #include <cstdlib>
  3. #include <ctime>
  4. #include <string>
  5. #include <vector>
  6. #include <iostream>
  7.  
  8. const unsigned TILE_HEIGHT = 32, TILE_WIDTH = 32,
  9.                WINDOW_X = 30, WINDOW_Y = 20;
  10.  
  11. struct Tile {
  12.     sf::Sprite s;
  13.     float posX, posY;
  14.  
  15.     Tile(float x, float y, const sf::Texture& t) : posX(x), posY(y) {
  16.         s.setTexture(t);
  17.         s.setPosition(posX, posY);
  18.     }
  19. };
  20.  
  21. struct SnakeTile {
  22.     sf::Sprite s;
  23.     int dx, dy;
  24.     float posX, posY;
  25.  
  26.     SnakeTile(sf::Texture& t, int dx, int dy, float posX, float posY) : dx(dx), dy(dy), posX(posX), posY(posY) {
  27.         s.setTexture(t);
  28.         s.setScale(sf::Vector2f(2.f, 2.f)); //original is 16x16
  29.         s.setPosition(posX, posY);
  30.     }
  31. };
  32.  
  33. void freeMem(sf::RenderWindow& w, Tile*& t) { delete t; t = nullptr; }
  34. void draw(sf::RenderWindow& w, Tile*& t) { w.draw(t->s); }
  35. void iterateThroughBG(sf::RenderWindow& w, std::vector<std::vector<Tile*>>& v, void f(sf::RenderWindow& ,Tile*&));
  36. void drawSnake(sf::RenderWindow& w, std::vector<SnakeTile*>& s);
  37. void updateSnake(std::vector<SnakeTile*>& s);
  38. void increaseSize(sf::Texture& t, std::vector<SnakeTile*>& s);
  39. void wrapAround(SnakeTile& tile);
  40.  
  41. int main()
  42. {
  43.     sf::RenderWindow window(sf::VideoMode(TILE_WIDTH * WINDOW_X, TILE_HEIGHT * WINDOW_Y), "Snake!");
  44.     std::srand((unsigned)std::time(0));
  45.  
  46.     //Load Textures
  47.     sf::Texture bgTexture, snakeTexture;
  48.     bgTexture.loadFromFile("tile.png");
  49.     bgTexture.setSmooth(1);
  50.     snakeTexture.loadFromFile("snake_block.png");
  51.     snakeTexture.setSmooth(1);
  52.  
  53.     //Create Window Icon
  54.     sf::Image icon;
  55.     icon.loadFromFile("icon.png");
  56.     window.setIcon(icon.getSize().x, icon.getSize().y, icon.getPixelsPtr());
  57.  
  58.     //Create Background Vector
  59.     std::vector<std::vector<Tile*>> background(WINDOW_Y);
  60.     for (unsigned i = 0; i < WINDOW_Y; i++) {
  61.         background[i].resize(WINDOW_X);
  62.         for (unsigned j = 0; j < WINDOW_X; j++) {
  63.             background[i][j] = new Tile((float)TILE_HEIGHT * j, (float)TILE_WIDTH * i, bgTexture);
  64.         }
  65.     }
  66.  
  67.     //Create Snake Vector
  68.     std::vector<SnakeTile*> snake(1);
  69.     snake[0] = new SnakeTile(snakeTexture, 0, -1, WINDOW_X / 2.f * TILE_WIDTH, WINDOW_Y / 2.f * TILE_HEIGHT);
  70.     increaseSize(snakeTexture, snake);
  71.     increaseSize(snakeTexture, snake);
  72.  
  73.     sf::Clock c;
  74.  
  75.     while (window.isOpen())
  76.     {
  77.  
  78.         sf::Event event;
  79.         while (window.pollEvent(event))
  80.         {
  81.             if (event.type == sf::Event::Closed)
  82.                 window.close();
  83.         }
  84.  
  85.         if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) {
  86.             snake[0]->dx = -1;
  87.             snake[0]->dy = 0;
  88.         }else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) {
  89.             snake[0]->dx = 1;
  90.             snake[0]->dy = 0;
  91.         }else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) {
  92.             snake[0]->dx = 0;
  93.             snake[0]->dy = -1;
  94.         }else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) {
  95.             snake[0]->dx = 0;
  96.             snake[0]->dy = 1;
  97.         }
  98.  
  99.         if (c.getElapsedTime().asSeconds() >= 0.08f) {
  100.             updateSnake(snake);
  101.             c.restart();
  102.         }
  103.        
  104.         window.clear(sf::Color(sf::Color::White));
  105.  
  106.         iterateThroughBG(window, background, draw);
  107.         drawSnake(window, snake);
  108.         window.display();
  109.     }
  110.  
  111.     iterateThroughBG(window, background, freeMem);
  112.  
  113.     for (auto i = snake.begin(); i != snake.end(); ++i)
  114.         delete *i;
  115.  
  116.     return 0;
  117. }
  118.  
  119. void iterateThroughBG(sf::RenderWindow& w, std::vector<std::vector<Tile*>>& v, void f(sf::RenderWindow&, Tile*&)) {
  120.     for (auto row = v.begin(); row != v.end(); ++row) {
  121.         for (auto col = (*row).begin(); col != (*row).end(); ++col) {
  122.             f(w, *col);
  123.         }
  124.     }
  125. }
  126.  
  127. void drawSnake(sf::RenderWindow& w, std::vector<SnakeTile*>& s) {
  128.     for (auto i = s.begin(); i != s.end(); ++i)
  129.         w.draw((*i)->s);
  130. }
  131.  
  132. void updateSnake(std::vector<SnakeTile*>& s) {
  133.     s[0]->posX += s[0]->dx * TILE_WIDTH;
  134.     s[0]->posY += s[0]->dy * TILE_HEIGHT;
  135.     s[0]->s.setPosition(sf::Vector2f(s[0]->posX, s[0]->posY));
  136.     wrapAround(*s[0]);
  137.  
  138.     for (int i = s.size() -1; i > 0; i--) {
  139.         s[i]->dx = s[i - 1]->dx;
  140.         s[i]->dy = s[i - 1]->dy;
  141.         s[i]->posX = s[i - 1]->posX;
  142.         s[i]->posY = s[i - 1]->posY;
  143.         s[i]->s.setPosition(sf::Vector2f(s[i]->posX, s[i]->posY));
  144.     }
  145. }
  146.  
  147. void wrapAround(SnakeTile& tile) {
  148.     sf::FloatRect pos = tile.s.getGlobalBounds();
  149.  
  150.     //Check for out-of-bounds so we can wrap around
  151.     if (pos.left + TILE_WIDTH <= 0.f) {
  152.         tile.posX = (float)WINDOW_X * TILE_WIDTH;
  153.     }
  154.     else if (pos.left >= WINDOW_X * TILE_WIDTH) {
  155.         tile.posX = 0.f - TILE_WIDTH;
  156.     }
  157.     else if (pos.top >= WINDOW_Y * TILE_HEIGHT) {
  158.         tile.posY = 0.f - TILE_HEIGHT;
  159.     }
  160.     else if (pos.top + TILE_HEIGHT <= 0) {
  161.         tile.posY = (float)WINDOW_Y * TILE_HEIGHT;
  162.     }
  163.  
  164.     tile.s.setPosition(sf::Vector2f(tile.posX, tile.posY));
  165. }
  166.  
  167. void increaseSize(sf::Texture& t, std::vector<SnakeTile*>& s) {
  168.     SnakeTile* last = s[s.size() - 1];
  169.     s.push_back(new SnakeTile(t, last->dx, last->dy, last->posX + (TILE_WIDTH * -last->dx), last->posY + (TILE_HEIGHT * -last->dy)));
  170. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement