c++ - 生成多个相同的 Sprite 被破坏

标签 c++ sfml

我刚刚开始制作我的 2d 游戏。我目前遇到了一个问题,我试图通过使用相同的草纹理多次生成相同的 Sprite 来制作一些带有草 block 纹理的土地。但是,由于某种原因,我没有得到相同纹理的行,而是使行被拉伸(stretch)。
让我演示给你看:
普通草纹理:

normal grass

当前草输出:

current grass

这是代码:

#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;
}

如果有人知道如何做到这一点,那就太好了!

最佳答案

虽然我没有尝试运行代码,但在我看来一切正常。您的问题是,您只是将 Sprite 移动一个像素:

grassBlock.setPosition(Vector2f(i + 1, 690));

由于都显示具有相同来源的相同纹理,这将导致所有 Sprite 基本上显示纹理的第一列(因为其余部分与下一个图 block 重叠)。

虽然我认为你应该重新设计你的整个代码结构(感觉真的很乱,如果你遇到错误我不建议创建新的 SFML 窗口,因为这也可能失败),你所要做的就是将你的 Sprite 分开将用于坐标的索引乘以所需的平铺宽度:
grassBlock.setPosition(Vector2f(i * tile_width, 690));

关于c++ - 生成多个相同的 Sprite 被破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57514284/

相关文章:

c++ - 跟踪放置删除与放置新

java - Java/C++算法配置框架

c++ - 将 vector<int> 转换为定界字符串

C++ 开普勒和牛顿定律

c++ - 静态常量 : why does it need to be templated?

c++ - 在C++中,是否为派生类创建了一组新的私有(private)变量?

c++ - 我需要缓冲吗?

c++ - SFML 2.4.2 在绘制 sf::Text 对象之前获取 localBounds

c++ - SFML Audio getSample使用sf::Music实时

c++ - 仅通过从其他类继承来定义类型