以前,我启动了一小笔激情项目(出于 spite),希望能够创作一款 2D 游戏,但玩家看到的却是从 2D 场景中以一条线的视角。为了实现这个想法,我从头开始编写一个实时射线追踪器-ray marcher。有一个称为 viewables[] 的数组,告诉代码射线追踪器应该与哪些对象进行交互,但它目前只在其中的一个对象上工作。

与 obj_grass 一起,它完美地生效,直到它的遮罩盒中止。但是,与 obj_wood 一起,它停在 obj_wood 距离其最近一个角落的半径相等的距离,而不是它的遮罩盒边缘。我通过使 obj_grass 成为 obj_wood 的父级来解决这个问题,但这仍然很奇怪,我想通过发表此文来提醒大家。

任何路过的人想看看具体代码的,可以看看以下代码块:

if (counter = 0) {
    instance_destroy(obj_ray)
    for (var n = 0; n < rays; n++) {
        xstepprevious = 0
        ystepprevious = 0
        step = 0
        for (var i = 0; i < 100; i++) {
            xstepprevious = x + ((sin((pi * (rotation + n - (rays / 2))) / 180)) * (step))
            ystepprevious = y + (-1 * cos((pi * (rotation + n - (rays / 2)) / 180)) * (step))
            var nearest_dist = infinity
            var nearest
            for (var v = 0; v < array_length(viewables); v++) {
                var contender = instance_nearest(xstepprevious, ystepprevious, viewables[v])
                with contender {
                    global.bb = point_distance(x, y, xstepprevious, ystepprevious) - distance_to_point(xstepprevious, ystepprevious)
                }
                xprevious = x
                yprevious = y
                var imageangleprevious = image_angle
                image_angle = 0
                x = xstepprevious
                y = ystepprevious
                global.bb = distance_to_object(contender) - point_distance(x, y, contender.x, contender.y)
                image_angle = imageangleprevious
                x = xprevious
                y = yprevious
                var contender_dist = point_distance(xstepprevious, ystepprevious, contender.x, contender.y)
                if (contender_dist < nearest_dist) {
                    nearest = contender
                    nearest_dist = contender_dist
                }
            }
            instance_create_depth(xstepprevious - 0.5, ystepprevious - 0.5, 0, obj_ray)
            if (collision_point(xstepprevious, ystepprevious, viewables, false, true)) {
                global.dist = point_distance(xstepprevious, ystepprevious, x, y)
                global.viewport[n] = nearest.my_color
                global.viewportdist[n] = global.dist
                break
            }
            step += point_distance(xstepprevious, ystepprevious, nearest.x, nearest.y) + global.bb
            if (step > 1000) {
                global.viewport[n] = c_aqua
                break
            }
        }
    }
    counter = 2
}