sprite - 在 p5.js 中放大时 Sprite 模糊

标签 sprite scale p5.js

我试图将 p5.js 中 Sprite 的大小放大一点(系数 2),但渲染时它们看起来很模糊。显然,放大通常不是一个好主意,但是我已经成功地在原始 JavaScript 中使像素化 Sprite 看起来清晰(基于本文:https://nluqo.github.io/broughlike-tutorial/stage1.html)。

在 JS 中我会做这样的事情:

let canvas = document.querySelector("canvas");
let ctx = canvas.getContext("2d");
ctx.imageSmoothingEnabled = false;

像这样画:

let tileSize = 32;
ctx.drawImage(
  spritesheet,
  sprite*16,
  0,
  16,
  16,
  x*tileSize,
  y*tileSize,
  tileSize,
  tileSize
);

当向上缩放 Sprite 时,我得到了一个很好的干净效果(类似于我上面链接的文章中显示的效果)。

现在,我正在尝试将一些代码移植到 P5.js 以进行演示,并一直在尝试复制上述升级(spritesheet 为 16x16,希望渲染为 32x32),并且一直在尝试 em> 来复制典型的 ctx 调用,但它们的工作方式似乎并不相同。另外值得注意的是,我尝试从 createCanvas 获取 canvas 元素并获取 2D 上下文,但该方法不存在。

这是我迄今为止尝试过的:

createCanvas(1024, 800);
noSmooth();
...
const spriteSize = 16;
const spriteScaled = 32;

let _c = 0; // col lookup into spritesheet
let _r = 0; // row lookup into spritesheet
test_image = createImage(spriteScaled, spriteScaled);
test_image.copy(
  tileMap,
  _c * spriteSize,
  _r * spriteSize,
  spriteSize,
  spriteSize,
  0,
  0,
  spriteScaled,
  spriteScaled
);
// also tried this:
// test_image.resize(spriteScaled, 0);

此外,我在 style.css 中添加了此内容,但没有效果:

canvas {
  display: block;
  image-rendering: -moz-crisp-edges;
  image-rendering: -webkit-crisp-edges;
  image-rendering: pixelated;
  image-rendering: crisp-edges;
}

最佳答案

noSmooth()函数确实会影响使用 image() 函数绘制的图像,但不会影响 copy() 函数的行为。

let imgUrl = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QAAAAAAAD5Q7t/AAAAh0lEQVQ4y92TMQ6AIAxFX40bB3HyIE4ex00jm+dj8iDOdRGDWhMim39seeWT8gVbatSEjKIC6DY+DzpvMnUKR3AN/mnp6Inzmg6RFLbAu5p2jG4EoIqNHNhSBegy5QNr8PE5enHwVT8YcK5xmaDv+L7GUgek63xzcr/9NQvWvxhmOz9SmsZi7UmSK41htVcqAAAAAElFTkSuQmCC";

const spriteSize = 16;
const spriteScaled = 32;

let tileMap;
let test_image;

function preload() {
  tileMap = loadImage(imgUrl);
}

function setup() {
  createCanvas(1024, 800);
  noSmooth();

  let _c = 0; // col lookup into spritesheet
  let _r = 0; // row lookup into spritesheet
  test_image = createImage(spriteSize, spriteSize);
  // Don't resize when copying. This will cause interpolation to happen.
  test_image.copy(
    tileMap,
    _c * spriteSize,
    _r * spriteSize,
    spriteSize,
    spriteSize,
    0,
    0,
    spriteSize,
    spriteSize
  );
}

function draw() {
  // Only resize when you actually draw the sprite
  image(test_image, 0, 0, spriteScaled, spriteScaled);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.4.0/p5.js"></script>

关于sprite - 在 p5.js 中放大时 Sprite 模糊,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71783745/

相关文章:

c# - 滚动时图表控件 Y 轴自动缩放

javascript - p5.j​​s:当我的鼠标悬停在正在处理的草图中的不同元素上时,如何使文本出现?

javascript - 使用 p5.js 在图像上摆动形状

c - 尝试在随机 x 位置创建 Sprite 而不在 c 中重叠

swift - 如何在一定范围内用操纵杆 move Sprite ?

html - CSS:两个 Logo 左右对齐,应通过窗口调整大小自动缩放

docker - 能够在 docker 中使用全局模式扩展容器?

javascript - p5.j​​s 中的弹跳球未激活条件语句

javascript - 借助 :hover rule instead of a class selector 的 gulp-spritesmith 属性生成

c# - 有色 Sprite 实际上是在较新版本的 Unity 中进行批处理吗?