Как я могу исправить бесконечную стену? - PullRequest
0 голосов
/ 10 июля 2019

Я хочу сделать игру 3D Ray Caster на Java.Я уже сделал пол и потолок, но когда я попытался сделать стену, стена была почти бесконечной с правой стороны.Я даже посмотрел некоторые учебные пособия, но все еще не мог найти проблему, из-за которой стена была почти бесконечной.

render.floor(game);
render.renderWall(0, 0.5, 5, 5, 0);
render.renderDistanceLimiter();
draw(render, 0, 0);

--------------------------------------------------------------------

public void renderWall(double xLeft, double xRight, double zDistLeft, double zDistRight, double yHeight){

        double xcLeft = ((xLeft) - right) * 2;
        double zcLeft = ((zDistLeft) - forward) * 2;

        double xcRight = ((xRight) - right) * 2;
        double zcRight = ((zDistRight) - forward) * 2;

        double rotLeftSideX = xcLeft * cos  - zcLeft * sin;
        double yCornerTL = ((-yHeight) - (-up * 0.05)) * 2;
        double yCornerBL = ((0.5 - yHeight) - (-up * 0.05)) * 2;
        double rotLeftSideZ = zcLeft * cos + xcLeft * sin;

        double rotRightSideX = xcRight * cos  - zcRight * sin;
        double yCornerTR = ((-yHeight) - (-up * 0.05)) * 2;
        double yCornerBR = ((0.5 - yHeight) - (-up * 0.05)) * 2;
        double rotRightSideZ = zcRight * cos * xcRight * sin;

        double xPixelLeft = (rotLeftSideX / rotLeftSideZ * height + width / 2);

        double xPixelRight = (rotRightSideX / rotRightSideZ * height + width / 2);

        if(xPixelLeft >= xPixelRight){

            return;

        }

        int xPixelLeftInt = (int) xPixelLeft;

        int xPixelRightInt = (int) xPixelRight;

        if(xPixelLeftInt < 0){

            xPixelLeftInt = 0;

        }

        if(xPixelRightInt > width){

            xPixelRightInt = width;

        }

        double yPixelLeftTop = (int) (yCornerTL / rotLeftSideZ * height + height / 2);
        double yPixelLeftBottom = (int) (yCornerBL / rotLeftSideZ * height + height / 2);

        double yPixelRightTop = (int) (yCornerTR / rotRightSideZ * height + height / 2);
        double yPixelRightBottom = (int) (yCornerBR / rotRightSideZ * height + height / 2);

        for(int x = xPixelLeftInt; x < xPixelRightInt; x++){

            System.out.println(xPixelRightInt);

            double pixelRot = (x - xPixelLeft) / (xPixelRight - xPixelLeft);

            double yPixelTop = yPixelLeftTop + (yPixelRightTop - yPixelLeftTop) * pixelRot;
            double yPixelBottom = yPixelLeftBottom + (yPixelRightBottom - yPixelLeftBottom) * pixelRot;

            int yPixelTopInt = (int) (yPixelTop);
            int yPixelBottomInt = (int) (yPixelBottom);

            if(yPixelTopInt < 0){

                yPixelTopInt = 0;

            }

            else if(yPixelTopInt > height){

                yPixelTopInt = height;

            }

            for(int y = yPixelTopInt; y < yPixelBottomInt; y++){

                pixels[x + y * width] = 0x1B91E0;
                zBuffer[x + y * width] = 0;

            }

        }

    }

Кто-нибудь знает, почему стена почти бесконечна с правой стороны?

глюк стены:

img

...