Keyboard in SFML
Keyboard in SFML
我正在用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度到原来的位置!我遇到的另一个问题是,我在做点游戏那么,我怎么才能使这条线的逻辑在我按回车键的时候让它在两点之间呢?
我需要使它稳定,当我点击空格键旋转90,然后当我再次点击空格键旋转90到原来的!
代替使用setRotation
,你可以使用rotate
并保持角度在一个变量中,这样你的程序:
- 有更少的神奇数字!参见(什么是神奇的数字,为什么它不好?)
- 可以按空格键反转旋转:
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
混淆。
我遇到的另一个问题是,我正在做点游戏那么,我如何使线的逻辑,以便我可以让它在两个点之间,当我按回车键?
我宁愿使用顶点而不是纹理。在这里查看相应的教程
你通常会有一个(动态)顶点数组来绘制线条。
编辑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);
您可以在这里找到相关文档:
- VertexArray
- 顶点
- netcat command in c++
- Difference in displaying cv2 Mat
- SFML纹理像播放器
- 如何使用AngelScript注册SFML Vector2运算符
- C++ MFC Libraries in Travis CI
- 如何修复sfml c++代码编译错误
- 如何在OpenSSL中从configuration.h.in获取configuration.h
- SFML library: http request
- 落砂模拟碰撞检测C++和SFML
- 使用 SFML 和 C++ 将 Pixel 打印到屏幕上
- 创建具有 new in 函数和"this is nullptr"异常的对象
- IN, OUT, INOUT Parameters
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- SFML RenderWindow打开窗口需要很长时间
- 有人安装"IITB Simplecpp in mac"吗?
- 矢量下标超出SFML游戏中的范围
- 从 C 样式字符串中删除子字符串 "in place" 在C++代码中
- Segfault in SFML
- SFML C++ getSize() and sprite.move() in SFML.net
- Keyboard in SFML