咨询GameMaker中像素艺术游戏无模糊缩放的实现方案
咨询GameMaker中像素艺术游戏无模糊缩放的实现方案
嘿,我之前做像素风游戏的时候也被这个模糊缩放的问题折腾过好一阵,太懂那种精心画的像素块变糊、毁了复古感的糟心了!针对你320x180的原生分辨率,给你整理几个GameMaker里亲测有效的方案,从全局配置到手动渲染都有,总有一个适合你:
一、先搞定全局基础配置(零代码快速生效)
这是最省心的第一步,直接在项目设置里改几个关键选项,大部分模糊问题就能解决:
- 打开
Game Options→Graphics面板,把「Interpolation(插值)」直接关掉!这是模糊的重灾区,开着的话GameMaker会自动给像素补间柔化,关了就不会有那种发虚的效果。 - 把窗口缩放模式设为
Keep Aspect Ratio(保持宽高比),再把Scaling改成Integer Scale(整数倍缩放)——这太关键了!你要的960x540正好是3倍整数缩放,整数倍缩放不会把单个像素拆成半块,完美保留每个像素的方块感。 - 同样在
Graphics的Surface Settings里,把Surface Sampling设为Point(点采样),而不是默认的Linear,点采样就是硬边缘渲染,完全贴合像素风的需求。
二、手动用Surface控制渲染(灵活适配复杂场景)
如果全局配置满足不了你的需求(比如要做自定义黑边、动态缩放逻辑),可以手动用Surface来接管渲染:
- 先在游戏入口对象的
Create事件里,创建一个和原生分辨率一致的Surface:render_surface = surface_create(320, 180); - 然后在
Draw事件里,先把所有游戏内容画到这个Surface上,再把它缩放到窗口:// 切换渲染目标到我们的自定义Surface surface_set_target(render_surface); draw_clear(c_black); // 先清掉Surface上的旧内容 // 这里放你原来的所有绘制代码,比如draw_sprite、draw_room、绘制UI之类的 surface_reset_target(); // 切回默认渲染目标 // 计算当前窗口能支持的最大整数倍缩放 var scale = min(window_get_width() / 320, window_get_height() / 180); scale = floor(scale); // 取整数,避免非整数倍导致的模糊 // 计算居中绘制的坐标,避免画面偏一边 var draw_x = (window_get_width() - 320 * scale) / 2; var draw_y = (window_get_height() - 180 * scale) / 2; // 把Surface以整数倍画到窗口,最后一个false是禁用插值 draw_surface_stretched_ext(render_surface, draw_x, draw_y, 320*scale, 180*scale, c_white, 1, false);
三、用视图(View)系统控制渲染(适合关卡类游戏)
如果你的游戏用了Room的视图系统,也可以在视图设置里锁定像素风格:
- 打开
Room Settings→Views面板,勾选Enable Views,然后给View Port 0设置Width=320、Height=180(和原生分辨率一致)。 - 把视图的
Scaling设为Integer Scale,确保视图只会以整数倍放大到窗口。 - 同样在视图的采样设置里,把
Sampling设为Point,和全局设置呼应,避免视图渲染时的模糊。
最后补个小细节检查
如果做完上面的设置还是有个别精灵模糊,记得去精灵的Texture Settings里,把Filtering设为Point,Wrap设为Clamp——有些精灵导入时默认是线性过滤,会导致单个精灵本身就发虚。
备注:内容来源于stack exchange,提问作者GigaaaChaaad




