我最近在 Game Maker 中制作了一个简单的光线投射器,仅使用 2D 游戏,您可以在其中行走并与墙壁碰撞,然后我向其中添加了光线投射器:
function cast_ray(sx, sy, sdir) {
var rayx=sx
var rayy=sy
while true {
if collision_point(rayx, rayy, obj_wall, false, true) or rayx<0 or rayx>room_width or rayy<0 or rayy>room_height {
break
}
rayx+=lengthdir_x(1, sdir)
rayy+=lengthdir_y(1, sdir)
}
return [point_distance(sx, sy, rayx, rayy), [rayx, rayy]]
}
这会发射一条射线并持续下去,直到它碰到墙壁或退出游戏室。当发生这种情况时,该函数返回射线的长度及其碰撞点。然后,我添加了一个
draw_rays()
函数,该函数发射与变量 resolution
相对应的光线数量,获取它们的长度,最后计算它们在屏幕上应具有的高度(rotation
对应于玩家旋转):
function draw_rays() {
var rot_start=rotation-resolution/2
var ray_width=room_width/resolution
for (var r=0;r<resolution;r++) {
var ray=cast_ray(x, y, rot_start)
var rayd=ray[0]
//show_debug_message(rot_start)
var rayh=clamp(50000/rayd, 0, room_height)
var col=make_color_rgb(clamp(rayh, 0, 255), clamp(rayh, 0, 255), clamp(rayh, 0, 255))
draw_set_color(col)
draw_rectangle(r*ray_width, height-rayh/2, r*ray_width+ray_width, height+rayh/2, false)
rot_start+=1
}
}
我尝试更改代码的一部分,就像每个人都在做的那样来抵消这种影响(第二个代码的第 6 行):
var rayd=ray[0]
到 var rayd=ray[0]*cos(degtorad(rotation-rot_start))
。
它只适用于
但变得更糟