gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:23:37 25 4
gpt4 key购买 nike

我刚刚开始制作我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com