我正在使用 SFML 2.0 将入侵者精灵列表绘制到我的游戏中。目前,我必须不断复制并粘贴我的代码才能在以下位置绘制更多精灵:
//load the invaders images
sf::Texture invaders;
sf::Texture invaders2;
sf::Texture invaders3;
sf::Texture invaders4;
sf::Texture invaders5;
sf::Texture invaders6;
invaders.loadFromFile("images/invaders.png");
invaders2.loadFromFile("images/invaders.png");
invaders3.loadFromFile("images/invaders.png");
invaders4.loadFromFile("images/invaders.png");
invaders5.loadFromFile("images/invaders.png");
invaders6.loadFromFile("images/invaders.png");
//Sprites
sf::Sprite invadersSprite(invaders);
sf::Sprite invadersSprite2(invaders2);
sf::Sprite invadersSprite3(invaders3);
sf::Sprite invadersSprite4(invaders4);
sf::Sprite invadersSprite5(invaders5);
sf::Sprite invadersSprite6(invaders6);
invadersSprite2.setPosition(30,NULL);
invadersSprite3.setPosition(60,NULL);
invadersSprite4.setPosition(90,NULL);
invadersSprite5.setPosition(120,NULL);
invadersSprite6.setPosition(150,NULL);
if(Clock.getElapsedTime().asSeconds()>REFRESH_RATE)
{
//carry out updating tasks
static float spriteTimer=0.0; //keep track of sprite time
spriteTimer+=Clock.getElapsedTime().asSeconds();
static int count=0; //keep track of where the sub rect is
if(spriteTimer>delay)
{
invadersSprite.setTextureRect(area);
invadersSprite2.setTextureRect(area);
invadersSprite3.setTextureRect(area);
invadersSprite4.setTextureRect(area);
invadersSprite5.setTextureRect(area);
invadersSprite6.setTextureRect(area);
++count;
invadersSprite.move(xVelocity, …Run Code Online (Sandbox Code Playgroud) 我有一个使用 SFML 编写的应用程序,其顶部有一个菜单栏,还有一个小框,可以让您在其下方移动内容。我需要将框中使用的视图中的坐标转换为窗口坐标,以便我可以检查它们是否在框内。我知道 Convertcoords 将窗口坐标转换为视图坐标,但是有没有办法反向执行此操作?
class Graphics
public static Image[] ImageArray = new Image[16];
Run Code Online (Sandbox Code Playgroud)
而在不同的班级里,
//Copy original Array
tempArray = Graphics.ImageArray;
Run Code Online (Sandbox Code Playgroud)
我正在尝试制作tempArray静态变量的精确副本,它永远不会改变,但tempArray需要改变。它似乎不是复制静态变量,而是向其中添加另一个变量名。
因为如果我改变了tempArray,就好像我改变了一样ImageArray。如何ImageArray通过制作tempArray非静态副本来简单地复制?
当我遇到一行我从未见过的代码时,我正在使用 SFML 开发一个游戏,并且正在阅读一些教程。完整内容在SFML 游戏开发,但特定符号是 [=],这里是代码的简化形式。
template <typename data_type, typename Function>
std::function<void(data_type1&)> foo(Function x)
{
return [=] (data_type1 y)
{
DoSomething(y);
};
}
Run Code Online (Sandbox Code Playgroud)
我想我明白了代码的意思,但是等号周围的括号有什么意义?我没有在任何网站上找到提及它,除非我只是使用了糟糕的搜索词。
嗯,我一直在看一个关于如何使用 SFML 的教程。我目前正在学习在屏幕上移动精灵。添加 window.clear() 之前;每次我移动精灵时,它都会像一条轨迹一样离开,就像精灵是刷子一样。然后教程人说在 window.draw(player); 之前添加 window.clear
你能解释一下这背后的逻辑吗?就像,窗口被清除,然后绘制角色并显示它。这是代码:
#include <SFML/Graphics.hpp>
#include <iostream>
int main() {
sf::RenderWindow window(sf::VideoMode(1920, 1080), "Screen", sf::Style::Default);
sf::RectangleShape player(sf::Vector2f(100.0f, 100.0f));
player.setFillColor(sf::Color::Green);
//run as long as the window is open
while (window.isOpen()) {
// check all the window's events that were triggered since the last iteration of the loop
sf::Event evnt;
while (window.pollEvent(evnt)) {
switch (evnt.type) {
case sf::Event::Closed:
window.close();
break;
case sf::Event::Resized:
printf("New window width: %i New window height: %i\n", evnt.size.width, evnt.size.height);
break;
case sf::Event::TextEntered:
if …Run Code Online (Sandbox Code Playgroud) 我有一个在 Ubuntu 上创建的 CMake 项目,我现在正在 Visual Studio 上加载它(用于双引导开发)。
该项目可以在这里看到:http : //github.com/KiloMikeCodesStuff/Gravity
下图显示了问题: 
注意左边我是如何清楚地在第 5 行设置断点的。当我运行它时,断点移动并在第 8 行停止。
我试过了:
在所有情况下,结果都是一样的。我在想可能有一些代码优化(因为我选择为 x64 版本构建,因为这些是我为 SFML 拥有的唯一 DLL)。
这会是罪魁祸首吗?如果是这样,我如何禁用优化(记住它是一个 CMake 项目,而不是一个典型的 VS 项目)?
有什么方法可以更改窗口中单个像素的大小,因为我宁愿处理 8x8 像素而不是 1x1 的单个控制台字符。
当我调整 sfml 窗口的大小时,当我剪切调整大小以使其更小并调整大小以使其更大时,它会给您带来非常奇怪的效果。

如何使调整大小更漂亮?该代码来自 code::blocks 的安装教程。代码(与sfml网站上code::blocks安装教程中的代码相同):
#include <SFML/Graphics.hpp>
int main()
{
sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
sf::CircleShape shape(100.f);
shape.setFillColor(sf::Color::Green);
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
window.draw(shape);
window.display();
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在使用 C++ 中的 SFML 开发一个简单的 2D 网格可视化游戏引擎。我有一个带有 std::vector<sf::Vertex> 的 Grid 类,其中网格中的每个单元格由 6 个顶点表示。当我根据每个单元格的状态更新其颜色时,我观察到两个循环之间存在巨大的性能差异:一个循环使用向量的迭代器,另一个循环使用基于索引的方法。
这是差异所在:
inline void ChangeCellColor(Cell& cell, sf::Color color)
{
// index-based loop
auto index = cell.grid_y * width_ + cell.grid_x;
for (int i = 0; i < 6; ++i)
{
vertices_[index * 6 + i].color = color;
}
// iterator-based loop (commented out for now)
/*
auto index = cell.grid_y * width_ + cell.grid_x;
for (auto it = vertices_.begin() + index * 6; it != vertices_.begin() + index …Run Code Online (Sandbox Code Playgroud) 我的while循环没有退出.在调试期间,它非常明确地说stateID等于3.但是,当我添加时,无论调试器告诉我什么,总是std::cout << stateID;将值1写入控制台.
在代码中,我在输入循环后渲染屏幕.这表明毫无疑问,输入循环正如预期的那样正确退出.此外,如果这还不够,则必须退出以使stateID首先更改.请不要再讨论嵌套循环了.而且我在循环之后也使用了断点,这些断点被正确击中.
int main()
{
stateID = 1;
GameState* state = new GameStateTitle();
sf::RenderWindow window(sf::VideoMode(1000, 600), "RPG");
//GAME LOOP//
while (stateID != 3)
{//INPUT//
sf::Event event;
while (window.pollEvent(event))
{
switch (event.type)
{
//Window closed
case sf::Event::Closed:
set_next_state(3);
break;
}
}
change_state(state);
//RENDERING//
window.clear(sf::Color::Black);
state->render(window);
window.display();
}
/////////////
window.close();
return 0;
}
void set_next_state(int new_state)
{
//Set the next state to take place
next_state = new_state;
}
void change_state(GameState …Run Code Online (Sandbox Code Playgroud)