javascript - 如何使用 p5.js 在画布上绘制图块
问题描述
我正在尝试使用 p5.js 制作一个 html5 游戏,我尝试实现的第一件事是绘制一个 tilemap,但我的代码不起作用。
我使用嵌套循环来绘制瓷砖,但我需要更快的东西,我发现了另一种使用一维数组绘制瓷砖的算法我尝试了该算法但它不起作用,我不知道为什么?
let tileset;
let map = [
0, 0, 0,
0, 0, 0,
1, 1, 1
];
function preload() {
tileset = loadImage("./tileset.png");
}
function setup() {
createCanvas(500, 500);
}
function draw() {
background(0);
drawTiles(map, 3, 11);
}
function drawTiles(map, cols, tilesize) {
for (let i = map.length - 1; i > -1; --i) {
let value = map[i];
// source x , y
let sx = (value % cols) * tilesize;
let sy = Math.floor(value / cols) * tilesize;
// distenation x , y
let dx = (i % cols) * tilesize;
let dy = Math.floor(i / cols) * tilesize;
// render image
image(tileset, sx, sy, tilesize, tilesize, dx, dy, tilesize, tilesize);
}
}
解决方案
您已经交换了源和目标。在image
第一个矩形区域(参数 2 -5)中定义窗口中的目标,第二个矩形区域(参数 6 - 9)定义图像中的源矩形 ( tileset
):
image(tileset, sx, sy, tilesize, tilesize, dx, dy, tilesize, tilesize);
image(tileset, dx, dy, tilesize, tilesize, sx, sy, tilesize, tilesize);
由于目标网格 an 和源网格tileset
具有不同的列数,因此函数drawTiles
需要 2 个列参数 ( d_cols
, c_cols
):
function draw() {
background(0);
drawTiles(map, 3, 2, 11);
}
function drawTiles(map, d_cols, s_cols, tilesize) {
for (let i = map.length - 1; i > -1; --i) {
let value = map[i];
// source x , y
let sx = (value % s_cols) * tilesize;
let sy = Math.floor(value / s_cols) * tilesize;
// distenation x , y
let dx = (i % d_cols) * tilesize;
let dy = Math.floor(i / d_cols) * tilesize;
// render image
image(tileset, dx, dy, tilesize, tilesize, sx, sy, tilesize, tilesize);
}
}
推荐阅读
- json - 我怎样才能知道 Django 查询集的下一个值而不必循环和存储值?
- java - 我的程序停止打印到控制台,但继续在后台运行。没有抛出异常
- java - 找不到类。当我想将 .Jar 更改为 .exe 时出现空指针异常
- django - 结合DetailView和UpdateView?
- mysql - 如何创建外键?
- javascript - WebGL - 如何在 Typescript 中正确地将程序参数传递给 gl.attachShader?
- c++ - Why is template name available in derived class (the base class is an instance of the template)?
- c - 我应该为 FreeRTOS 系统上的程序选择什么调度?
- hadoop - Hadoop 3.2.0 中的链映射器
- php - 从不同的页面 PHP 获取 JSON 数据