以下是翻译后的简体中文内容:

(对gif质量表示歉意)

我创建了一个简单的函数,可以用来使图形根据深度进行透视渲染。有用在你想让卡片在3D中旋转或者用来使所有图形在2.5D中渲染,如同《黑暗之光》/《绢之歌》那样。函数如下:

/// @desc 将透视应用到从现在开始绘制的所有东西。使得深度更大的物体看起来更小/更远,反之亦然。
/// @param {real} fov 视野角度。
/// @param {real} [depth] 透视效果与平行投影效果相同的深度。默认值为0。

function perspective_apply(_fov, _depth = 0){     
    var _w, _h, _x, _y;  
    if(event_number == ev_gui or event_number == ev_gui_begin or event_number == ev_gui_end){
        _w = display_get_gui_width();
        _h = display_get_gui_height();
        _x = _w/2;
        _y = _h/2;
    }else
    if(not view_enabled){
        _w = room_width ;
        _h = room_height;
        _x = _w/2;
        _y = _h/2;
    }else{
        var _cam = view_get_camera(view_current)
        _w = camera_get_view_width(_cam);
        _h = camera_get_view_height(_cam);
        _x = camera_get_view_x(_cam) + _w/2;
        _y = camera_get_view_y(_cam) + _h/2;
    }

    matrix_set( matrix_view, matrix_build_lookat(_x, _y, _depth - dtan(90-_fov/2) * _h/2, _x, _y, _depth, 0, 1, 0))
    matrix_set( matrix_projection, matrix_build_projection_perspective_fov( -_fov,  -_w/_h, 1, 32000))
}

你只需要在绘制事件中调用这个函数,所有从现在开始绘制的东西将会在当前视图中以透视方式渲染。唯一需要的参数是视野角度,这决定了透视效果的强度。它应该是一个大于0的值,越接近0,透视效果越小。

另一个参数是可选的。depth是指透视效果不受影响的深度,在这种深度下,物体会像在房间编辑器中一样显示。默认值为0,但你应该将其设置为游戏中发生事件的层次的深度。

一个使用例子是这样的:假设你有一个渲染控制器实例,其深度最大,所有其他实例的绘制事件都在其之后。只需要在绘制事件中添加perspective_apply(30),所有东西都会以透视方式渲染,深度小于0的物体为前景,深度大于0的物体为背景。即使有视图激活在房间中!

注意,这个函数只设置了相机的透视投影。如果你想让图形旋转(例如卡片),你应该使用matrix_build()matrix_set()。例如:

var _mat = matrix_build(x,y,0, rot_x, rot_y, rot_z,1,1,1);
matrix_set(matrix_world, _mat);

draw_sprite_ext(sprite_index, image_index, 0,0, image_xscale, image_yscale, image_angle, image_blend, image_alpha);

matrix_set(matrix_world, matrix_build_identity());

相机设置会在当前视图绘制完成后自动重置。但如果你想在此之前手动重置它(例如,你只想让一个图形有透视效果),你可以调用这个函数:

/// @desc 重置之前应用的透视效果。
function perspective_reset(){
    camera_apply(camera_get_active());
}