SFML 3 - Raycasting 3D - Текстура пола и спрайт из работы с изображения, а затем сбойC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 SFML 3 - Raycasting 3D - Текстура пола и спрайт из работы с изображения, а затем сбой

Сообщение Anonymous »

c ++ 20 / sfml 3.0 / visual Studio 2022 / Windows 10 < / p>
Моя сборка. Пропустить именно то, как я хочу, чтобы она ... в течение пяти секунд. Если я снижу максимальную частоту кадров до 60, он будет работать примерно вдвое больше. После этого я получаю некоторую версию проблемы "белого квадрата". Я знаю, что пол - это то, что вызывает проблему, потому что у меня не было проблем, прежде чем кодировать пол. Кроме того, когда экран становится белым, стены все еще видны (с на самом деле белым экраном), потому что стены нарисованы поверх пола. Как только это произойдет, он сбой, а консоль отладки указывается в программе, выходящей с кодом (0xc0000409) .
main.cpp
#include "libraries.h"

int main()
{
sf::RenderWindow window(sf::VideoMode({ (size_t)SCREEN_W, (size_t)SCREEN_H }), "Raycaster", sf::Style::Close | sf::Style::Titlebar);

window.setFramerateLimit(60);

Map map(48.0f, "map.png");

Player player;
player.position = sf::Vector2f(50, 50);

Renderer renderer;

sf::Clock gameClock;

while (window.isOpen())
{
float deltaTime = gameClock.restart().asSeconds();
while (const std::optional event = window.pollEvent())
{
if (event->is())
{
window.close();
}

}

player.update(deltaTime);

window.clear();

renderer.draw3dView(window, player, map);

window.display();

window.setTitle("Garbage Ass Raycasting [FrameRate: " + std::to_string((int)(1.0f / deltaTime)) + "]");
}
}
< /code>
renderer.h
#pragma once
#ifndef _RENDERER_H
#define _RENDERER_H

#include "libraries.h"

class Renderer
{
public:
Renderer();

void draw3dView(sf::RenderTarget& target, const Player& player, const Map& map);

private:
sf::Texture wallTexture;
sf::Image floorImage;
};

#endif // !_RENDERER_H
< /code>
renderer.cpp
#include "libraries.h"

struct Ray
{
sf::Vector2f hitPosition;
sf::Vector2u mapPosition;
float distance;
bool hit;
bool isHitVertical;
};

Renderer::Renderer() : wallTexture("wall_texture.png"), floorImage("floor_texture.png")
{
if (!wallTexture.loadFromFile("wall_texture.png"))
{
std::cerr = 0 && x < grid[y].size() && grid[y][x] != sf::Color::Black)
{
didHit = true;
}

depth++;
}

if (didHit)
{
float perpWallDist = isHitVertical ? sideDist.y - deltaDist.y : sideDist.x - deltaDist.x;
float wallHeight = SCREEN_H / perpWallDist;

float wallStart = (-wallHeight + SCREEN_H) / 2.0f;
float wallEnd = (wallHeight + SCREEN_H) / 2.0f;

float textureSize = wallTexture.getSize().x;

float wallX = isHitVertical ? rayPos.x + perpWallDist * rayDir.x : rayPos.y + perpWallDist * rayDir.y;

wallX -= std::floor(wallX);

float textureX = wallX * textureSize;

float brightness = 1.0f - (perpWallDist / (float)MAX_RAYCAST_DEPTH);

if (isHitVertical)
{
brightness *= 0.75f;
}

sf::Color color = sf::Color(255 * brightness, 255 * brightness, 255 * brightness);

sf::Vertex wallStruct[] =
{
wallStruct[0] = {sf::Vector2f((float)i, wallStart), color, sf::Vector2f(textureX, 0.0f)},
wallStruct[1] = {sf::Vector2f((float)i, wallEnd), color, sf::Vector2f(textureX, textureSize)},
};

walls.append(wallStruct[0]);
walls.append(wallStruct[1]);
}
}

sf::RenderStates wallState{ &wallTexture };
target.draw(walls, wallState);
}
< /code>
Я писал и переписываю код снова и снова в течение последних семи часов, и, кроме продления времени перед сбоем, ограничивая частоту кадров, у меня есть те же результаты. Сначала все работает нормально, тогда все внутри окна становится белым, за исключением стен, непосредственно перед тем, как сбой. У меня нет ошибок и никаких предупреждений.

Подробнее здесь: https://stackoverflow.com/questions/797 ... then-crash
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • SFML Sprite чертеж пустой текстура текстура
    Anonymous » » в форуме C++
    0 Ответы
    43 Просмотры
    Последнее сообщение Anonymous
  • Рендеринг с использованием raycasting - текстура стены искажается при ограничении определенного размера [дубликат]
    Anonymous » » в форуме Python
    0 Ответы
    51 Просмотры
    Последнее сообщение Anonymous
  • SFML и C++. setPosition не работает, пока спрайт придерживается верха или низа [закрыто]
    Anonymous » » в форуме C++
    0 Ответы
    30 Просмотры
    Последнее сообщение Anonymous
  • SFML, как инициализировать спрайт с TextuRustEranager
    Гость » » в форуме C++
    0 Ответы
    8 Просмотры
    Последнее сообщение Гость
  • SFML, как инициализировать спрайт с TextuRustEranager
    Anonymous » » в форуме C++
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»