以前,我启动了一小笔激情项目(出于 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
}
评论 (0)