C++/SFML 显示故障,通过鼠标单击更改精灵成员

2024-04-16

我正在学习 C++/SFML,作为练习,我正在制作一个小程序,在窗口中显示 64x64 像素方形棕色精灵的 10x10 网格。该程序允许您使用键盘选择绿色/黄色/蓝色/灰色/棕色方形精灵,并用该选定的精灵替换所述网格上的任何图块。游戏循环如下:

while (window.isOpen())
{
    window.clear(sf::Color(sf::Color::Black));
    sf::Event event;
    while (window.pollEvent(event))
    {
        if (event.type == sf::Event::Closed)
            window.close();
    }

    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Num1)) s_paintBrush = s_sand;
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Num2)) s_paintBrush = s_grass;
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Num3)) s_paintBrush = s_dirt;
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Num4)) s_paintBrush = s_water;
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Num5)) s_paintBrush = s_rock;

    if (sf::Mouse::isButtonPressed(sf::Mouse::Left))
    {
        sf::Vector2i localPosition = sf::Mouse::getPosition(window);
        int i = localPosition.x / x;
        int j = localPosition.y / y;
        if (i < columns && j < rows && i >= 0 && j >=0) grid[j][i].m_terrain = s_paintBrush;;
    }

    for (int i = 0; i < rows; ++i)
    { 
        for (int j = 0; j < columns; ++j)
        {           
                window.draw(grid[i][j].m_terrain);
                grid[i][j].m_terrain.setPosition(x * j, y * i);
        }
    }
    window.display();
}   

“grid”是“tile”类的一个2D向量,它包含sf::Sprite成员变量“m_terrain”,该变量存储要在相应网格位置显示的精灵。整数 x & y = 64 用于确定与窗口上鼠标单击位置相对应的“网格”坐标。任何带有前缀 s_ 的东西都是 sf::Sprite。

该程序工作正常,但有一个例外,当我在要更改的图块上按鼠标左键时,前一个精灵会消失,留下空白的正方形区域,并且替换精灵会显示在窗口的左上角,直到鼠标按下按钮被释放。然后替换精灵会正确显示在鼠标单击位置。

对我来说,这表明新的精灵是在鼠标单击时生成的,但在释放鼠标按钮之前不会接收 setPosition 坐标。我不确定如何解决这个问题,并且无法找到答案(这对我来说很简单,至少可以理解,我只是在学习!)。

感谢您的关注。


发生这种情况的原因是你绘制了精灵before你设置位置。然后,当下一个事件发生(按钮弹起事件)时,将再次绘制精灵,但这次使用正确的坐标。

切换绘制和设置位置的线条将使其起作用:

grid[i][j].m_terrain.setPosition(x * j, y * i);
window.draw(grid[i][j].m_terrain);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++/SFML 显示故障,通过鼠标单击更改精灵成员 的相关文章

随机推荐

  • 通过代码在LinearLayout中对齐Imageview

    问题很简单 我正在使用代码动态创建一个图像视图 ImageView btnSend new ImageView this 并将其添加到 LinearLayout 中 问题是我想保持右对齐 怎么做 提前致谢 尝试使用 LayoutParams
  • 使用每行的列索引向量提取矩阵元素

    我有一个MxN矩阵 我想要一个列向量v 使用向量s它告诉我对于矩阵中的每一行我将采用哪一列 这是一个例子 Matrix 4 13 93 20 42 31 18 94 64 02 7 44 24 91 15 11 20 43 38 31 21
  • 指数代码,我不理解代码行为

    这是指数计算的代码 var exponent function a n if n 0 return 1 else return a exponent a n 1 console log exponent 5 3 我不明白这一行 return
  • 预订表中仅允许工作时间

    PostgreSql 9 2 保留表定义为 CREATE EXTENSION btree gist CREATE TABLE schedule id serial primary key during tsrange not null EX
  • 如何根据选择条件将节点集存储在变量中

    我有以下 XML 结构
  • 如何让 NSIS 安装并执行临时目录中的文件?

    我正在使用以下 NSIS 脚本 Name My app wrapper Outfile MyAppSetup exe InstallDir TEMP MyApp Install Function onInit SetSilent silen
  • angularJS如何避免重复http请求

    Angular 有没有办法避免重复 http 请求 正如您在上面的代码中看到的 我正在拨打电话以检索产品的详细信息 事实上 这个调用与一个按钮相关联 我会避免重复打电话 如果我点击了详细产品按钮 显然我不需要再次调用我的服务 正确的方法是加
  • 仅检查新添加的文件

    我使用 lint staged 和 husky 在提交之前对所有暂存文件运行 linter 但我的代码库很旧 所以暂时不想对现有 修改后的 文件运行 linter 有没有办法只针对新创建 添加 的文件运行 linter None
  • 如何为 SQL CLR 存储过程提供 sql_variant 参数?

    如何向 SQL CLR 存储过程添加 sql variant 参数 使用 System Object 不起作用 并且我没有看到任何可以使用的属性 Microsoft SqlServer Server SqlProcedure public
  • 如何使库与调用者脚本 PropertiesService 一起工作?

    直到谷歌将导入 导出 API 扩展到容器绑定的 Apps 脚本项目 https code google com p google apps script issues issues detail id 2922 我已将项目的大部分内容移至可
  • 设置 MKUserTrackingModeFollowWithHeading

    我尝试在 viewDidLoad 方法 和 viewWillAppear 中 设置用户跟踪模式 如果我将其设置为MKUserTrackingModeFollowWithHeading 值为2 则不会生效 实际上 在将其值设置为2后 如果我打
  • 在两个表中使用 OR 条件进行计算

    为了对蓝色产品或属于鞋子类别的产品的销售额求和 我使用以下 DAX 表达式 CALCULATE SUM Table SalesAmount FILTER Table Table Color Blue Table Category Shoes
  • 获取绑定到“value”属性的托管 bean 和类型

    假设我有以下结构 1 托管Bean ViewScoped ManagedBean public class TestBean private Test test getters setters 2 测试类 public class Test
  • Android Room 不接受通用字段类型

    我试图拥有一个基类 其中 id 字段属于通用类型 例如 class BaseEntity
  • 添加使用 javascript 选择的选项

    我希望这个 javascript 在 id mainSelect 的选择中创建 12 到 100 个选项 因为我不想手动创建所有选项标签 你能给我一些指点吗 谢谢 function selectOptionCreate var age 88
  • iOS13更改状态栏背景颜色

    在 iOS13 中 我无法再更改状态栏的背景颜色 因为无法再使用 键的值 访问状态栏 有人知道这是怎么可能的吗 或者是否知道这将在 iOS13 的最终版本中实现 我已经遇到了不同的建议 例如使用 UIApplications StatusB
  • 是否可以在 C++11 之前创建函数局部闭包?

    借助 C 11 我们获得了 lambda 并且可以在我们真正需要的地方 而不是在它们不真正属于的地方 即时创建函数 函子 闭包 在 C 98 03 中 创建函数局部函子 闭包的好方法如下 struct void operator int i
  • Firefox 中的 Html 5 日期选择器

    有什么方法可以设置在带有 HTML 5 的 firefox 版本 21 中启用日期选择器 我不想使用基于 jQuery 的日期选择器 因为将在使用该网站的浏览器中禁用 javascript 日期选择器在 Chrome 上运行良好 因此 如果
  • 删除命名管道.NET

    我使用以下代码列出我的命名管道 private IEnumerable
  • C++/SFML 显示故障,通过鼠标单击更改精灵成员

    我正在学习 C SFML 作为练习 我正在制作一个小程序 在窗口中显示 64x64 像素方形棕色精灵的 10x10 网格 该程序允许您使用键盘选择绿色 黄色 蓝色 灰色 棕色方形精灵 并用该选定的精灵替换所述网格上的任何图块 游戏循环如下