You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

咨询GameMaker中像素艺术游戏无模糊缩放的实现方案

咨询GameMaker中像素艺术游戏无模糊缩放的实现方案

嘿,我之前做像素风游戏的时候也被这个模糊缩放的问题折腾过好一阵,太懂那种精心画的像素块变糊、毁了复古感的糟心了!针对你320x180的原生分辨率,给你整理几个GameMaker里亲测有效的方案,从全局配置到手动渲染都有,总有一个适合你:

一、先搞定全局基础配置(零代码快速生效)

这是最省心的第一步,直接在项目设置里改几个关键选项,大部分模糊问题就能解决:

  • 打开Game OptionsGraphics面板,把「Interpolation(插值)」直接关掉!这是模糊的重灾区,开着的话GameMaker会自动给像素补间柔化,关了就不会有那种发虚的效果。
  • 把窗口缩放模式设为Keep Aspect Ratio(保持宽高比),再把Scaling改成Integer Scale(整数倍缩放)——这太关键了!你要的960x540正好是3倍整数缩放,整数倍缩放不会把单个像素拆成半块,完美保留每个像素的方块感。
  • 同样在GraphicsSurface 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 SettingsViews面板,勾选Enable Views,然后给View Port 0设置Width=320Height=180(和原生分辨率一致)。
  • 把视图的Scaling设为Integer Scale,确保视图只会以整数倍放大到窗口。
  • 同样在视图的采样设置里,把Sampling设为Point,和全局设置呼应,避免视图渲染时的模糊。

最后补个小细节检查

如果做完上面的设置还是有个别精灵模糊,记得去精灵的Texture Settings里,把Filtering设为PointWrap设为Clamp——有些精灵导入时默认是线性过滤,会导致单个精灵本身就发虚。

备注:内容来源于stack exchange,提问作者GigaaaChaaad

火山引擎 最新活动