c++ - Snake pop() : it disappear -
since last topic full of edited versions , not clear @ all, , since changed lot of things , understood how make it, i'm asking new question snake : why snake disappear since when call advancestep(), yes pop 1 element right after push_back one? help, have better attitude. (through @jason c, asking give up, or him stole somebody's code, or homework, should better attitude). in advance.
#include <sfml/window.hpp> #include <sfml/graphics.hpp> #include <sfml/system.hpp> #include <sfml/audio.hpp> #include <deque> void advancestep(); sf::event event; /*sf::clock clocksnake; sf::time elapse;*/ sf::vector2i direction(0, 0); class snakeblock { public: sf::texture texture; sf::sprite snakeblock; int dir; int lastx, lasty; }; std::deque<snakeblock> snake; int main() { //elapse = clocksnake.getelapsedtime(); sf::music epicmusic; epicmusic.openfromfile("epicmusic.wav"); epicmusic.play(); snakeblock snakehead; snakehead.texture.loadfromfile("spritesheetsnake.png", sf::intrect(0,0,20,22)); snakehead.snakeblock.settexture(snakehead.texture); snakeblock snakebody1; snakebody1.snakeblock.settexture(*(snakehead.snakeblock.gettexture())); snakeblock snakebody2; snakebody2.snakeblock.settexture(*(snakehead.snakeblock.gettexture())); snake.push_back(snakehead); snake.push_back(snakebody1); snake.push_back(snakebody2); snake[2].snakeblock.setposition(500,350); snake[1].snakeblock.setposition(475, 338); snake[0].snakeblock.setposition(450, 316); sf::renderwindow window(sf::videomode(1028,768), "sfml snake"); window.setframeratelimit(20); while(window.isopen()) { while(window.pollevent(event)) { switch(event.type) { case sf::event::closed: epicmusic.stop(); window.close(); break; default: break; } } if(sf::keyboard::iskeypressed(sf::keyboard::left)) { direction.x = -1; advancestep(); for(int = 1; < snake.size(); i++) { snake[i].snakeblock.setposition(snake[i+1].snakeblock.getposition().x-20, snake[i+1].snakeblock.getposition().y); } } if(sf::keyboard::iskeypressed(sf::keyboard::right)) { direction.x = 1; advancestep(); for(int j = 1; j < snake.size(); j++) { snake[j].snakeblock.setposition(snake[j+1].snakeblock.getposition().x+20, snake[j+1].snakeblock.getposition().y); } } if(sf::keyboard::iskeypressed(sf::keyboard::down)) { direction.y = -1; advancestep(); for(int l = 1; l < snake.size(); l++) { snake[l].snakeblock.setposition(snake[l+1].snakeblock.getposition().x, snake[l+1].snakeblock.getposition().y-22); } } if(sf::keyboard::iskeypressed(sf::keyboard::up)) { direction.y = 1; advancestep(); for(int o = 1; o < snake.size(); o++) { snake[o].snakeblock.setposition(snake[o+1].snakeblock.getposition().x, snake[o+1].snakeblock.getposition().y+22); } } window.clear(sf::color::red); for(unsigned int m = 0; m < snake.size(); m++) { window.draw(snake[m].snakeblock); } window.display(); } return 0; } void advancestep() { sf::vector2f headpos; headpos.x = snake[0].snakeblock.getposition().x; headpos.y = snake[0].snakeblock.getposition().y; headpos.x += 22 * direction.x; headpos.y += 22 * direction.y; snakeblock element; element.snakeblock.setposition(headpos); snake.push_front(element); snake.pop_back(); }
looks if you're accessing snake out of bounds:
for(int = 1; < snake.size(); i++) { ...setposition(snake[i+1]....
Comments
Post a Comment