You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SFML纹理缩放异常:如何将纹理缩至20*20适配400*400网格?

问题分析与解决方案

你的核心问题是对SFML中sf::Sprite::setScale的用法理解有误:这个函数接收的是缩放比例(相对于纹理原始尺寸),而非目标像素尺寸。你传入CELL_SIZE(20)会让纹理被放大20倍,远超出400×400的窗口范围,因此只能看到左上角极小的一部分。

正确的缩放逻辑

需要先获取纹理的原始尺寸,计算出将纹理缩放到CELL_SIZE × CELL_SIZE所需的比例:

  • 横向缩放比例 = 目标宽度(CELL_SIZE) / 纹理原始宽度
  • 纵向缩放比例 = 目标高度(CELL_SIZE) / 纹理原始高度

同时你的位置设置存在小问题:i是行索引,对应Y轴坐标;j是列索引,对应X轴坐标,当前的位置赋值会导致网格行列颠倒,需要一并修正。

修改后的代码片段

// Set the position and scale of each sprite
float textureWidth = unrevealedEmptyTexture.getSize().x;
float textureHeight = unrevealedEmptyTexture.getSize().y;
float scaleX = CELL_SIZE / textureWidth;
float scaleY = CELL_SIZE / textureHeight;

for (int i = 0; i < DEFAULT_ROWS_NUM; i++)
{
    for (int j = 0; j < DEFAULT_COLS_NUM; j++)
    {
        grid[i][j].setTexture(unrevealedEmptyTexture);
        // 修正位置:列索引j对应X轴,行索引i对应Y轴
        grid[i][j].setPosition(j * CELL_SIZE, i * CELL_SIZE);
        grid[i][j].setScale(scaleX, scaleY);
    }
}

额外优化建议

如果你的纹理原始尺寸固定,也可以提前计算好缩放比例(比如原始纹理是400×400的话,比例就是20/400=0.05),直接传入setScale(0.05, 0.05),避免每次循环重复计算尺寸。另外,也可以在加载纹理后直接创建一个缩放到目标尺寸的纹理副本,减少运行时的缩放计算开销:

sf::Texture scaledTexture;
scaledTexture.create(CELL_SIZE, CELL_SIZE);
scaledTexture.update(sf::Sprite(unrevealedEmptyTexture));
// 之后直接使用scaledTexture创建精灵,无需再设置缩放

内容的提问来源于stack exchange,提问作者nortain32

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 18:40:22