GameMaker Ray Casting 中的鱼眼效果

问题描述 投票:0回答:1

我最近在 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
    }
}

Everything works fine untill you approach a wall:

我尝试更改代码的一部分,就像每个人都在做的那样来抵消这种影响(第二个代码的第 6 行):

var rayd=ray[0]
var rayd=ray[0]*cos(degtorad(rotation-rot_start))
。 它只适用于the walls you are facingwalls on your side变得更糟

raycasting game-maker fisheye game-maker-studio-2
1个回答
0
投票

这是光线投射的一个经典问题,如此处所述。

应该可以通过做类似的事情来解决

rayd *= dcos(rotation - rot_start);

rayh
计算之前。

© www.soinside.com 2019 - 2024. All rights reserved.