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
相关产品推荐
相关产品推荐

