C++ Snake pop():它消失了
因为我的上一个主题充满了编辑过的版本,一点也不清楚,因为我改变了很多东西,现在我明白了如何做到这一点,所以我要问一个关于我的蛇的新问题:为什么我的蛇消失了,因为当我调用advanceStep时,是的,它弹出一个元素,但就在它推回另一个元素之后? 谢谢你的帮助,我会有更好的态度。通过@Jason C,要求某人放弃,或者对他说我偷了别人的代码,或者说这是一个家庭作业,也应该得到更好的态度。 提前谢谢C++ Snake pop():它消失了,c++,C++,因为我的上一个主题充满了编辑过的版本,一点也不清楚,因为我改变了很多东西,现在我明白了如何做到这一点,所以我要问一个关于我的蛇的新问题:为什么我的蛇消失了,因为当我调用advanceStep时,是的,它弹出一个元素,但就在它推回另一个元素之后? 谢谢你的帮助,我会有更好的态度。通过@Jason C,要求某人放弃,或者对他说我偷了别人的代码,或者说这是一个家庭作业,也应该得到更好的态度。 提前谢谢 #include <SFML/Window.hpp> #include <SFML
#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 i = 1; i < 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();
}
看起来您正在访问Snake out bounds:
for(int i = 1; i < Snake.size(); i++)
{
...setPosition(Snake[i+1]....
你忘了格式化你的代码。看,这类问题需要花太多时间去挖掘别人的代码;实际上,你需要在逻辑上发现与C++无关的错误,为什么你的实际绘制的for循环从1开始而不是0?对于无符号整数m=1;m<1.5;m++没什么大不了的,说真的,另一方面,人们帮了我很多博士洛夫,谢谢,我刚发完帖子就看到了这一点,所以在你发帖子之前我编辑了它:pThanks,固定大小为大小减1,通过问题更多地位于advanceStep函数中的pop,正如我所说的,因为蛇仍然会消失