什么方法从SFML中的spritesheet绘制随机精灵?

我有一个spritesheet(900×100)与不同颜色的形状,每个尺寸100×100。 我正在尝试编写一个程序,每隔2秒钟后,屏幕上出现一个随机精灵。 如果我点击,它应该消失,2秒后应该出现另一个随机的形状。 如果我不这样做,它应该继续显示那个形象。

使用IntRect,我可以从Spritesheet中删除单个的形状并显示它们。 我认为在IntRect参数中:

Shape.setTextureRect(sf::IntRect(0, 0, 100, 100)); 

我可以replace第一个0,像这样:

 Shape.setTextureRect(sf::IntRect(((rand() % 8) * 100), 0, 100, 100)); 

2秒钟后,它会显示一个新的随机精灵。 然而,在2秒钟后,窗口显示出看起来像是一堆一个接一个地快速打出的随机形状,没有什么,然后2秒钟后重复。

如果我不能让随机图像正常工作,我不认为我可以做鼠标事件。

这是我的代码到目前为止:main.cpp

 #include <SFML/Graphics.hpp> #include <iostream> #include <stdlib.h> #include <time.h> int main() { sf::RenderWindow window(sf::VideoMode(640, 480), "Tile Game"); sf::Clock clock; sf::Time timer; sf::Texture shapeSpriteSheet; sf::Texture Background; sf::Sprite bg; sf::Sprite Shape; srand(time(NULL)); Background.loadFromFile("bg.png"); bg.setTexture(Background); shapeSpriteSheet.loadFromFile("shapes.png"); shapeSpriteSheet.setSmooth(true); Shape.setTexture(shapeSpriteSheet); Shape.setPosition(sf::Vector2f(192, 146)); while (window.isOpen()) { sf::Event event; window.draw(bg); while (window.pollEvent(event)) { if (event.type == sf::Event::Closed) window.close(); } timer = clock.getElapsedTime(); if (timer.asSeconds() >= 2) { Shape.setTextureRect(sf::IntRect(((rand() % 8) * 100), 0, 100, 100)); window.draw(Shape); if (timer.asSeconds() > 2.1) clock.restart(); } window.display(); } return 0; } 

更新:

我终于做到了,每隔2秒就会出现一个精灵,点击它就会消失。 现在我正在努力使每个精灵随机select

新代码:

 if (clock.getElapsedTime().asSeconds() >= 2) { shapeVisible = true; Shape[0].setPosition(sf::Vector2f(192, 146)); window.draw(Shape[0]); if (sf::Mouse::isButtonPressed(sf::Mouse::Left)) { if (Shape[0].getGlobalBounds().contains(window.mapPixelToCoords(sf::Mouse::getPosition(window)))) { clock.restart(); } } } 

 if (timer.asSeconds() >= 2) { // { code here to choose a new sprite and draw it to the screen } if (timer.asSeconds() > 2.1) clock.restart(); } 

(这是你提供的代码片段)

这个代码在时间2和时间2.1之间的行为是什么?

请记住,在60fps的时候,每帧之间有0.016秒,所以在那个时间间隔里大约有六帧。 如果你的运行速度超过60fps,可能还会更多。

所以想想通过你的代码的一点点, 如果程序在这两个时间段之间的六个帧中到达这个“if”语句时执行程序主循环的这个部分,那么程序要做什么?