我正在用SFML做一个游戏项目,我遇到了一个小问题,
这是我的代码:
#include <SFML/Graphics.hpp>
#include <string>
#include <iostream>
using namespace std;
using namespace sf;
int main() {
sf::RenderWindow Window;
Window.create(sf::VideoMode(490, 485), "My First Sfml Game");
sf::Texture pTexture1;
sf::Sprite playerImage;
if (!pTexture1.loadFromFile("Data/dots.png"))
std::cout << "error could not load player image" << std::endl;
playerImage.setTexture(pTexture1);
sf::Texture pTexture2;
sf::Sprite lineImage;
if (!pTexture2.loadFromFile("Data/line.png"))
std::cout << "error could not load player image" << std::endl;
lineImage.setTexture(pTexture2);
int v;
while (Window.isOpen()) {
sf::Event event;
while (Window.pollEvent(event)) {
switch (event.type) {
case sf::Event::Closed:
Window.close();
break;
case Event::KeyPressed:
if (event.key.code == Keyboard::Right)
lineImage.move(5, 0);
else if (event.key.code == Keyboard::Left)
lineImage.move(-5, 0);
else if (event.key.code == Keyboard::Up)
lineImage.move(0, -5);
else if (event.key.code == Keyboard::Down)
lineImage.move(0, 5);
else if (event.key.code == Keyboard::Space)
lineImage.setRotation(90);
break;
case Event::KeyReleased:
if (event.key.code == Keyboard::Right)
lineImage.move(0, 0);
else if (event.key.code == Keyboard::Left)
lineImage.move(-0, 0);
else if (event.key.code == Keyboard::Up)
lineImage.move(0, -0);
else if (event.key.code == Keyboard::Down)
lineImage.move(0, 0);
else if (event.key.code == Keyboard::Space)
lineImage.setRotation(90);
break;
}
if (event.type == Event::KeyReleased && event.key.code == Keyboard::Space)
lineImage.setRotation(180);
}
Window.draw(playerImage);
Window.draw(lineImage);
Window.display();
}
return 0;
}
此处代码中的图片:postimg.org/gallery/71ufmoi/da508bc3 /
问题是当我点击空格键时我需要旋转lineImage
但是当我点击空格时它会旋转90然后再返回90!当我点击空格键旋转90时我需要让它稳定然后当我再次点击空格时它旋转90到原始!我遇到的另一个问题是我正在进行点式游戏,所以我如何制作线条的逻辑,这样当我按下回车键时我可以让它在两点之间?
答案 0 :(得分:3)
当我点击空格键旋转90时我需要保持稳定然后当我再次单击空格时它会旋转90到原始位置!
您可以使用rotate
而不是使用setRotation
,并将角度保存在变量中,以便您的程序:
angle = -angle;
只有在释放钥匙时才会进行轮换。
另外,请考虑使用switch
而不是一堆if-else
。它将减少event.key.code ==
的代码重复并使您的代码更具可读性。
请注意,您的Window
变量名称不一致:所有其他变量都以小写字母开头,但这个变量不是。这对于如此小的代码来说并不是什么大问题,但在整个程序中保持相同的命名约定始终是一个好习惯。
总而言之,您的代码可能如下所示:
// includes...
int main(int, char**) {
// window and texture loading...
float rotationAngle = 90;
while (window.isOpen()) {
sf::Event event;
while (window.pollEvent(event)) {
switch (event.type) {
case Event::KeyReleased:
switch (event.key.code) {
case Keyboard::Space:
lineSprite.rotate(rotationAngle);
rotationAngle = - rotationAngle;
break;
// other cases...
}
break;
// other cases...
}
}
// drawing...
}
}
注意:我还将lineImage
重命名为lineSprite
,以防止与sf::Image
和sf::Sprite
混淆。
编辑:
我遇到的另一个问题是我正在进行点式游戏,所以如何制作线条的逻辑,这样当我按下回车键时我可以让它在两点之间?
我宁愿使用顶点而不是使用纹理。见the corresponding tutorial here
您通常会有一个(动态)顶点数组来绘制线条。
编辑2:
让我们更加具体,并编写几行代码。
您可以像这样声明顶点数组:
sf::VertexArray lines(sf::Lines);
首先它是空的,但您可以在需要时轻松添加新行:
// the player connects dots d1 and d2
lines.append(sf::Vertex(d1.position));
lines.append(sf::Vertex(d2.position));
而且,和往常一样,你想要画线到窗口。你可以这样做:
window.draw(lines);
您可以在此处找到相关文档: