使用p5.js,我构造了一个函数,该函数读取一个二维数组,并使用与每个位置的colors对象的字符串对应的 colored颜色 将其绘制到画布上.这是我的代码:

let colors = {
  r: "red",
  g: "green",
  b: "blue",
  y: "yellow",
  o: "orange",
  bl: "black",
  w: "white",
  t: "transparent",
  i: "indigo",
  v: "violet",
  c: "cyan",
};

let myMap = [
  ["r", "o", "y", "g"],
  ["b", "i", "o", "v"],
  ["o", "y", "g", "b"],
  ["i", "v", "r", "o"],
];

function setup() {
  createCanvas(400, 400);
}

function draw() {
  background(0);
  rectMode(CENTER)
  readMap(myMap, 50, 50, 150, 150);
}

function readMap(bitmap, x = 0, y = 0, w = null, h = null) {
  for (let block of bitmap) {
    for (let block2 of block) {
      fill(colors[block2]);
      noStroke();
      push();
      translate(x, y);
      // If a width and height are specified, render it as a rectangle with that size.
      if (w && h) scale(w/width, h/height);
      rect(
        block.indexOf(block2) * (width / block.length),
        bitmap.indexOf(block) * (height / bitmap.length),
        width / block.length,
        height / bitmap.length
      );
      pop();
    }
  }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.6.0/p5.js"></script>

如果您运行这段代码,它将运行得非常好.它绘制大小和 colored颜色 正确的矩形,但当一行中有两个或两个以上相同 colored颜色 的矩形时-

let myMap = [
  // ...
  ["r", "o", "v", "v"],
];

-第一个副本可以正确渲染,但第二个副本和它后面的所有副本只会渲染为黑色.如果有人能帮上忙,那就是救命稻草了.请注意,我对JavaScript相对比较陌生.

推荐答案

问题是,当一行中有多个 colored颜色 时,indexOf总是找到第一个--这是一种线性搜索,从数组的第一个元素到最后一个元素按索引遍历,直到找到匹配项. Select 错误的索引意味着它将在现有的正方形上重新绘制,而不是将其放在新的位置.

解决方法是在循环中使用实际的计数器索引,或者使用传统的C风格的for循环forEach,或者使用手动索引变量:

const colors = {
  r: "red",
  g: "green",
  b: "blue",
  y: "yellow",
  o: "orange",
  bl: "black",
  w: "white",
  t: "transparent",
  i: "indigo",
  v: "violet",
  c: "cyan",
};

const map = [
  ["r", "o", "r", "g"],
  ["b", "i", "o", "v"],
  ["o", "y", "g", "b"],
  ["i", "v", "r", "o"],
];

function setup() {
  createCanvas(400, 400);
}

function draw() {
  background(0);
  rectMode(CENTER);
  drawMap(map, 50, 50, 150, 150);
}

function drawMap(bitmap, x = 0, y = 0, w, h) {
  bitmap.forEach((row, i) => {
    row.forEach((block, j) => {
      push();
      fill(colors[block]);
      noStroke();
      translate(x, y);

      // If a width and height are specified,
      // render it as a rectangle with that size.
      if (w && h) {
        scale(w / width, h / height);
      }

      rect(
        j * (width / bitmap.length),
        i * (height / row.length),
        width / row.length,
        height / bitmap.length
      );
      pop();
    });
  });
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.6.0/p5.js"></script>

Javascript相关问答推荐

如何修复内容安全策略指令脚本-SRC自身错误?

根据总价格对航班优惠数组进行排序并检索前五个结果- Angular HTTP请求

如何在RTK上设置轮询,每24小时

从mat—country—select获取整个Country数组

使用JavaScript重新排序行

JS—删除对象数组中对象的子对象

如何将数组用作复合函数参数?

当我try 将值更改为True时,按钮不会锁定

使用类型:assets资源 /资源&时,webpack的配置对象&无效

更改agGRID/Reaction中的单元格格式

如何在FiRestore中的事务中使用getCountFromServer

表单数据中未定义的数组键

如何设置时间选取器的起始值,仅当它获得焦点时?

是否有静态版本的`instanceof`?

使用静态函数保存 node 前的钩子

使用Java脚本在div中创建新的span标记

如何从Reaction-Redux中来自API调用的数据中筛选值

验证Java脚本函数中的两个变量

单击子按钮时将活动切换类添加到父分区

JS:inline date子串.