0

我看了 TheCherno 的游戏编程教程:
http ://www.youtube.com/watch?v=RKPEQfkhbAY

在这一集中,他编写了这段代码来制作 3d 世界。

package game.display.graphics;

public class Render3D extends Render {

    public Render3D(int width, int height) {
        super(width, height);
    }

    public void floor() {
        for(int y = 0; y < height; y++) {
            double ydepth = y - height / 2;
            double z = 100.0 / ydepth;

            for(int x = 0; x < width; x++) {
                double xdepth = x - width / 2;
                xdepth *= z;
                int xx = (int) (xdepth) & 5;

                pixels[x+y*width] = xx * 128;
            }
        }
    }
}

我真的不明白代码..所以有人可以向我解释吗?

4

1 回答 1

1

我仍然认为计算本身无关紧要,这似乎只是一些实验(尤其是考虑到视频中的屏幕)。

但是,我将尝试解释我认为代码的作用(没有更多信息,这并不容易):

首先,他遍历所有屏幕像素并计算它们的颜色。

  • double ydepth = y - height / 2;会导致屏幕上半部分的所有像素的深度为负
  • double xdepth = x - width / 2;会导致屏幕左半部分的深度为负

这似乎是为了使生成的图案在屏幕内居中。有这 2 个黑色部分(左下角和右上角),但是您发布的代码没有解释这里做了什么。

int xx = (int) (xdepth) & 5;xx只要第 1 位和第 3 位(5 为二进制 101)均未设置,则将 的值设置为 0(即黑色)。因此xx只能具有值 0、1、4 和 5,这会导致那些黑色条纹。

xx * 128会将值提升到 0、128、512 和 640,这将根据pixels使用方式产生不同的结果。(如果pixels以 ARGB 格式表示颜色,0 为黑色,128 为深蓝色,512 为深绿色(几乎是黑色),640 也为深蓝色,带有一些轻微的绿色成分。

话虽如此,我只是浏览了代码并在必要时进行了一些示例计算。有关更多信息,请遵循该路径。

于 2013-09-18T07:39:01.700 回答