Raycaster правильно рендерится только когда на краю карты - PullRequest
0 голосов
/ 22 мая 2019

Я работал над движком лучевого вещания, но не могу понять, почему он правильно рендерится только тогда, когда находится на краях карты

float px = 16/2;
float py = 16/2;
float pa = 0;
float fov = 3.14159 / 4.0f;
float depth = 16;
int mx = 16, my = 16;
std::wstring m_map;



void Start() override
{
    m_map += L"################";
    m_map += L"#..............#";
    m_map += L"#..............#";
    m_map += L"#..............#";
    m_map += L"#..............#";
    m_map += L"#..............#";
    m_map += L"#..............#";
    m_map += L"#..............#";
    m_map += L"#..............#";
    m_map += L"#..............#";
    m_map += L"#..............#";
    m_map += L"#..............#";
    m_map += L"#..............#";
    m_map += L"#..............#";
    m_map += L"#..............#";
    m_map += L"################";
}
void Update() override
{
    for (int x = 0;x < width;x++)
    {
        float rayAngle = (pa - fov / 2.0f) + ((float)x / (float)width)*fov;

        float distToWall = 0.0f;
        bool bhitwall = false;

        float eyex = sinf(rayAngle);
        float eyey = cosf(rayAngle);

        if (!bhitwall && distToWall <= depth)
        {
            distToWall += 0.1f;

            int ntestx = (int)(px + eyex * distToWall);
            int ntesty = (int)(py + eyey * distToWall);

            if (ntestx < 0 || ntestx >= mx || ntesty < 0 || ntesty >= my)
            {
                bhitwall = false;
                distToWall = depth;
            }
            else
            {
                if (m_map[ntestx + ntesty] == L'#')
                {
                    bhitwall = true;
                }

            }
        }
        float ceiling = (float)(height / 2.0f) -height / (float)distToWall;
        float floor = height - ceiling;

        int shade = 128;
        if (distToWall < depth / 4.0) { shade = 128; }
        else if (distToWall < depth / 3.0) { shade = 64; }
        else if (distToWall < depth / 2.0f) { shade = 32; }
        else if (distToWall < depth) { shade = 16; }
        else { shade = 0; }
        for (int y = 0;y < height;y++)
        {
            int gc = Color3(165, 42, 42);
            int sc = Color3(0, 255, 0);
            int wc = Color3(shade);
            if (y <= ceiling)
            {
                pixels[y * width + x] = (int)sc;
            }
            else if (y > ceiling && y <= floor)
            {
                pixels[y * width + x] = (int)wc;
            }
            else
            {
                pixels[y * width + x] = (int)gc;
            }
        }
    }
    pa++;

то, что происходит, если не установить для игрока положение x или y равным 16, оно будет отображаться в основном как стандартный движок лучевого вещания, если я не установлю положение игрока на 16, экран просто заполняется цветом стены, но он должен отображаться правильно в любом месте на карте

...