我第一次用画布做实验,有一个小游戏,障碍物从右边随机飞到左边,左边的玩家可以上下移动来躲避它们,每一次躲避都会得分,它会存储高分.

我需要使用for循环手动将障碍物添加到数组中,以将它们添加到画布中的任意x,y位置:

function ChooseRandom(min, max) { // random generator function
  return Math.random() * (max - min) + min;
}

const obstacles = [ // array of obstacles to create using randomly generated positions
  {
    x: ChooseRandom(500, 2500),
    y: ChooseRandom(0, 500),
    width: 50,
    height: 50
  },
  {
    x: ChooseRandom(500, 2500),
    y: ChooseRandom(0, 500),
    width: 50,
    height: 50
  },
  {
    x: ChooseRandom(500, 2500),
    y: ChooseRandom(0, 500),
    width: 50,
    height: 50
  }
]

for (let i = 0; i < obstacles.length; i++) { // loop creating the obstacles using array
    const obstacle = obstacles[i];

    ctx.fillRect( // create obstacle
      obstacle.x,
      obstacle.y,
      obstacle.width,
      obstacle.height
    );
}

数组中的项越多,它就变得越困难(因为需要避免更多的派生).因为每一项都使用相同的代码,有没有一种方法只需输入/设置一个数字,然后它就可以用这么多障碍项填充数组?

显然,这将节省代码大小,但我也在考虑添加一个难度 Select 字段,所以如果 Select 了Easy,它在任何时候只会在屏幕上添加6个障碍(数组中的6个项)、Medium 12、Hard 24等.所以如果有办法用从不同集合编号生成的大量重复项填充数组,在这种情况下会有所帮助.

推荐答案

我会这样做:

n = 6;
const obstacles = [];

for (let i = 0; i < n; i++) {
  const x = ChooseRandom(500, 2500);
  const y = ChooseRandom(0, 500);
  const obstacle = {
      x: x,
      y: y,
      width: 50,
      height: 50
  }
  obstacles.push(obstacle);
}

您可以将n设置为您想要生成的任意数量的障碍,创建一个空的obstacles数组,然后通过在循环的每次迭代中生成一个新障碍来填充该array.然而,这并不能防止重叠.

Javascript相关问答推荐

深嵌套的ng-container元素仍然可以在Angular 布局组件中正确渲染内容吗?

在React中获取数据后,如何避免不必要的组件闪现1秒?

Google Apps脚本中的discord邀请API响应的日期解析问题

在JavaScript中声明自定义内置元素不起作用

在react JS中映射数组对象的嵌套数据

在Three JS中看不到补间不透明度更改效果

使用ThreeJ渲染的形状具有抖动/模糊的边缘

如何强制Sphinx中的自定义js/css文件始终加载更改而不缓存?

为什么这个.add.group({})在教程中运行得很好,但在我的游戏中就不行了?

Reaction组件在本应被设置隐藏时仍显示

在验证和提交表单后使用useNavigate()进行react 重定向,使用带有加载器和操作的路由

将嵌套数组的元素乘以其深度,输出一个和

JavaScript:如果字符串不是A或B,则

将范围 Select 器添加到HighChart面积图

FileReader()不能处理Firefox和GiB文件

不同表的条件API端点Reaction-redux

在ChartJS中使用spanGaps时,是否获取空值的坐标?

在将元素追加到DOM之前,createElement()是否会触发回流?混淆abt DocumentFragment行为

Promise.race()返回已解析的promise ,而不是第一个被拒绝的promise

如何在加载页面时使锚定标记成为焦点