C++ 生成多个数量的同一精灵已损坏

C++ 生成多个数量的同一精灵已损坏,c++,sfml,C++,Sfml,我刚刚开始制作我的2d游戏。我目前遇到了一个问题,我正试图通过多次使用相同的草纹理生成相同的精灵,从而使一些土地具有草块纹理。但是,我没有得到一行相同的纹理,而是因为某种原因使该行被拉伸。 让我告诉你: 正常草纹理: 当前草产量: 代码如下: #include <iostream> #include <vector> #include <random> #include <SFML/Graphics.hpp> using namespace

我刚刚开始制作我的2d游戏。我目前遇到了一个问题,我正试图通过多次使用相同的草纹理生成相同的精灵,从而使一些土地具有草块纹理。但是,我没有得到一行相同的纹理,而是因为某种原因使该行被拉伸。 让我告诉你: 正常草纹理:

当前草产量:

代码如下:

#include <iostream>
#include <vector>
#include <random>
#include <SFML/Graphics.hpp>

using namespace std;
using namespace sf;

int main() {
    RenderWindow window(VideoMode(1920, 1080), "Treko");
    Color bg(0, 205, 255);
    Font errorFont;
    Texture grass;
    Texture dirt;
    if (!errorFont.loadFromFile("font/Arial/Arial.ttf")) {
        RenderWindow error(VideoMode(600, 500), "Error!");
        Text errorText;
        errorText.setFont(errorFont);
        errorText.setString("Unfortunaetly, we are unable to find Arial.ttf.\nPlease reinstall the application and report the error. Thank you.");
        errorText.setCharacterSize(18);
        errorText.setFillColor(Color::White);
        while (error.isOpen()) {
            Event errorEvent;
            while (error.pollEvent(errorEvent)) {
                if (errorEvent.type == Event::Closed) {
                    error.close();
                }
            }
            error.clear();
            error.draw(errorText);
            error.display();
        }
    }
    if (!dirt.loadFromFile("img/Dirt.png")) {
        RenderWindow error(VideoMode(600, 500), "Error!");
        Text errorText;
        errorText.setFont(errorFont);
        errorText.setString("Unfortunaetly, we are unable to find Dirt.png.\nPlease reinstall the application and report the error. Thank you.");
        errorText.setCharacterSize(18);
        while (error.isOpen()) {
            Event errorEvent;
            while (error.pollEvent(errorEvent)) {
                if (errorEvent.type == Event::Closed) {
                    error.close();
                }
            }
            error.clear();
            error.draw(errorText);
            error.display();
        }
    }
    if (!grass.loadFromFile("img/Grass.png")) {
        RenderWindow error(VideoMode(600, 500), "Error!");
        Text errorText;
        errorText.setFont(errorFont);
        errorText.setString("Unfortunaetly, we are unable to find Grass.png.\nPlease reinstall the application and report the error. Thank you.");
        errorText.setCharacterSize(18);
        errorText.setFillColor(Color::White);
        while (error.isOpen()) {
            Event errorEvent;
            while (error.pollEvent(errorEvent)) {
                if (errorEvent.type == Event::Closed) {
                    error.close();
                }
            }
            error.clear();
            error.draw(errorText);
            error.display();
        }
    }
    Sprite grassBlock;
    grassBlock.setTexture(grass);
    Sprite dirtBlock;
    dirtBlock.setTexture(dirt);
    vector<Sprite> grassM;
    /* This is a work in progress. I'm trying to add height to the land using random y axis generation. Any of you know how to do this it would be great to let me know!
    std::uniform_int_distribution<int> randomColorRange(680, 720);
    std::random_device rd;
    std::mt19937 RandYPos(rd());
    */
//THE PROBLEM PART 1
    for (int i = 0; i <= 1918; i++) {
        grassBlock.setPosition(Vector2f(i + 1, 690));
        grassBlock.setScale(Vector2f(0.5f, 0.5f));
        grassM.push_back(Sprite(grassBlock));
    }
    while (window.isOpen()) {
        Event event;
        while (window.pollEvent(event)) {
            if (event.type == Event::Closed) {
                window.close();
            }
        }
        window.clear(bg);
//THE PROBLEM PART 2
        for (int i = 0; i < grassM.size(); i++) {
            window.draw(grassM[i]);
        }
        window.display();
    }
    return 0;
}
#包括
#包括
#包括
#包括
使用名称空间std;
使用名称空间sf;
int main(){
RenderWindow窗口(视频模式(19201080),“Treko”);
彩色背景(0,205,255);
字体错误字体;
纹理草;
质地污垢;
如果(!errorFont.loadFromFile(“font/Arial/Arial.ttf”)){
渲染窗口错误(视频模式(600500),“错误!”);
文本错误文本;
errorText.setFont(errorFont);
errorText.setString(“不幸的是,我们找不到Arial.ttf。\n请重新安装应用程序并报告错误。谢谢。”);
errorText.setCharacterSize(18);
errorText.setFillColor(颜色:白色);
while(error.isOpen()){
事件错误事件;
while(error.pollEvent(errorEvent)){
如果(errorEvent.type==事件::已关闭){
错误。关闭();
}
}
error.clear();
错误。绘制(错误文本);
错误。显示();
}
}
如果(!dirt.loadFromFile(“img/dirt.png”)){
渲染窗口错误(视频模式(600500),“错误!”);
文本错误文本;
errorText.setFont(errorFont);
errorText.setString(“不幸的是,我们无法找到Dirt.png。\n请重新安装应用程序并报告错误。谢谢。”);
errorText.setCharacterSize(18);
while(error.isOpen()){
事件错误事件;
while(error.pollEvent(errorEvent)){
如果(errorEvent.type==事件::已关闭){
错误。关闭();
}
}
error.clear();
错误。绘制(错误文本);
错误。显示();
}
}
如果(!grass.loadFromFile(“img/grass.png”)){
渲染窗口错误(视频模式(600500),“错误!”);
文本错误文本;
errorText.setFont(errorFont);
errorText.setString(“不幸的是,我们找不到Grass.png。\n请重新安装应用程序并报告错误。谢谢。”);
errorText.setCharacterSize(18);
errorText.setFillColor(颜色:白色);
while(error.isOpen()){
事件错误事件;
while(error.pollEvent(errorEvent)){
如果(errorEvent.type==事件::已关闭){
错误。关闭();
}
}
error.clear();
错误。绘制(错误文本);
错误。显示();
}
}
雪碧草块;
草块,草块(草);
雪碧污垢;
dirtBlock.settxture(污垢);
媒介草;
/*这是一项正在进行的工作。我正在尝试使用随机y轴生成来增加土地的高度。你们中的任何人都知道如何做到这一点,让我知道会很好!
标准:均匀分布范围(680720);
std::随机_装置rd;
std::mt19937 RandYPos(rd());
*/
//问题第一部分

对于(int i=0;i虽然我没有尝试运行代码,但在我看来一切都正常。您的问题是,您只是将精灵移动了一个像素:

grassBlock.setPosition(Vector2f(i + 1, 690));
由于所有显示相同原点的相同纹理,这将导致所有精灵基本上显示纹理的第一列(因为其余部分与下一个瓷砖重叠)

虽然我认为您应该重新编写整个代码结构(感觉非常混乱,如果遇到错误,我不建议创建新的SFML窗口,因为这可能也会失败),但您所要做的只是将坐标所用的索引乘以所需的平铺宽度,将精灵分开:

grassBlock.setPosition(Vector2f(i * tile_width, 690));

我没有读你的代码,虽然图像看起来像是它唯一的一列和同一列,而不仅仅是拉伸的图像。你如何获得精灵/瓷砖的宽度?@HarveyGray如果在指定后不更改精灵,你可以查询纹理的大小。