【问题】为什么gm8中同时调整窗口大小、视野大小和视野输出大小,画面缩放比例却不是1:1 未解决
摸魔抹莫 发表于 2020-04-16 01:11:10 323

问题描述如下: 假设开始房间的房间宽高、0号视野宽高、视野输出宽高都是800x600,并且启动0号视野。然后有一个物体会在(32, 32)处和(800, 600)处分别绘制一个32x32的红色实心矩形,并在(32, 100)处绘制文字"Hello GameMaker."。(字体和颜色不重要)开始游戏之后只能看见(32, 32)处的矩形和文字,不能看见(800, 600)处的矩形,因为它在房间之外。 我希望在玩家调整窗口大小至1000x800等更大尺寸后,0号视野宽高、视野输出宽高以及窗口上图像的宽高都会变成该尺寸,这样两个矩形以及文字的位置和大小都不变,而玩家能看见(800, 600)处的矩形。代码如下:

///object0-Create Event
window_width = 800;
window_height = 600;
///object0-Step Event
var _window_width_prev, _window_height_prev;
_window_width_prev = window_width;
_window_height_prev = window_height;
window_width = window_get_width();
window_height = window_get_height();
if (window_width != _window_width_prev || window_height != _window_height_prev) {
    view_wview[0] = window_width;
    view_hview[0] = window_height;
    view_wport[0] = window_width;
    view_hport[0] = window_height;
    window_set_region_size(window_width, window_height, 0);
}
///object0-Draw Event
draw_set_color(c_red);
draw_rectangle(32, 32, 64, 64, 0);
draw_rectangle(800, 600, 832, 632, 0);
draw_text(32, 100, "Hello GameMaker");

实际运行的窗口缩放前后效果如下,并不符合预期: 后来我把object0-Step Event的代码作了修改,改成如下代码:

///object0-Step Event
var _window_width_prev, _window_height_prev;
_window_width_prev = window_width;
_window_height_prev = window_height;
window_width = window_get_width();
window_height = window_get_height();
if (window_width != _window_width_prev || window_height != _window_height_prev) {
    view_wview[0] = window_width;
    view_hview[0] = window_height;
    //view_wport[0] = window_width;
    //view_hport[0] = window_height;
    window_set_region_size(window_width, window_height, 0);
}

也就是不修改view_wport[0]和view_hport[0],其它不变。这时运行的拉伸之后效果如下: 可以看见(800, 600)处的矩形,矩形和文字的大小也基本没有发生变化。但两矩形的大小还是发生了一点微小的变化,且矩形和文字都发生了严重的模糊。

请问: 为什么在第一次实验中设置了view_wview[0]和view_hview[0],视野的大小却没有发生变化? 为什么在第二次实验中不设置view_wport[0]和view_hport[0],视野输出的大小反而发生了变化? view_wview[0], view_hview[0], view_wport[0], view_hport[0], window_set_region_size()这几个东西的含义和用法究竟是什么?(读了F1,没有完全理解) 为什么第二次实验中出现了尺寸略微变化和严重的模糊现象?如何消除这种现象?

问题附件已上传。

上传的附件:
最新回复 (5)
  • 摸魔抹莫 发表于 2020-04-16 05:56:38
    0 2
    我经过了一些调查,发现缩放视野输出会引发模糊变形属于GameMaker8本身的bug。请问这种bug能否避免?如何避免?
  • POSI2 发表于 2020-04-17 11:39:27
    0 3
    图像缩放本来就会失真,是原理问题,不是GM8本身的问题

    view是房间中视野的大小,port是显示区的大小,游戏从view获取视野并缩放显示到port
    如果两者尺寸一致就不会缩放(例一),尺寸不一致就会缩放(例二)

    window_set_region_size 调整的是游戏窗口中的绘图区域尺寸
  • 摸魔抹莫 发表于 2020-04-17 12:34:04
    0 4
    POSI2 图像缩放本来就会失真,是原理问题,不是GM8本身的问题 view是房间中视野的大小,port是显示区的大小,游戏从view获取视野并缩放显示到port 如果两者尺寸一致就不会缩放(例一),尺寸 ...
    回复3楼:
    我的目的不是让图像缩放,而是随着窗口大小的改变,把视野尺寸和视野输出尺寸改变到相同的值,这样理论上图像的缩放比例仍然是1:1。
    另外这确实是GM8本身的问题,因为我已经在GMS1中做了相同实验(window_set_region_size()改成surface_resize()),证实GMS1没有这种问题。
  • 摸魔抹莫 发表于 2020-04-17 12:39:26
    0 5
    回复3楼:
    您说的view和port的含义与我以前认为的一致,但两次实验的实际结果是例一会进行显著的缩放,例二会出现轻微缩放,并不是您所说的“例一不会缩放,例二会缩放”,请您仔细阅读。
    另外我在GMS的手册中还找到这样的说明:在游戏开始后修改view_h(w)port[]没有意义,只有在房间编辑时设置这些值才能决定游戏的视野输出尺寸的初始值。如果要在游戏进行中修改视野输出尺寸,方法是使用surface_resize()修改application_surface的尺寸,我猜测在GM8中就是使用window_set_region_size()。
  • POSI2 发表于 2020-04-17 07:17:51
    0 6

    是我一开始理解错了,应该是“拉伸游戏窗口时能看到更多的视野而不是拉伸的原视野”,理想情况下画面不应缩放。

    除了拉伸与GMS不同以外,GM8里窗口缩小时会出现黑色的边,好像绘图区域没有充满窗口,GMS里就不会出现。这两个软件底层差别很大,GM8可能需要更多的处理来防止失真,只用window_set_region_size修改尺寸不够。