首页 > 解决方案 > 本来应该带走2的为什么还要拼接很多元素

问题描述

目标是每当您的玩家进入青色圆圈时,它会变大并且圆圈会消失,但是现在当您获得圆圈时,很多圆圈都会消失(因为我认为正在拼接太多数据)。拉动的整个事情是不同的,因为我在解决这个问题后添加了一个不同的功能。现在,在检查你是否吃了一个圆圈的函数中,它返回你吃的圆圈的 Y+1(为了避免以某种方式返回 0)位置的索引值。然后我得到这个值并从所有圆的 x 和 y 的数组中拼接它。包含所有圆坐标的大数组是一个一维数组,以使我更容易。

- 这是基于在线游戏 agar.io。

var playerX;
var playerY;
var playerSize = 10;
var playerSpeed = (playerSize / Math.pow(playerSize, 1.44)) * 20;
var Newcelltimer = 0;
var cell = []
var cellEaten = 0;
var eaten = false;
//var pull = 1;

function setup() {

  frameRate(50)
  createCanvas(600, 450);
  playerX = random(30, width - 30);
  playerY = random(30, height - 30);


}

function draw() {


  playerSpeed = (playerSize / Math.pow(playerSize, 1.44)) * 10


  Newcelltimer++;

  background(220);

  if (keyIsDown(UP_ARROW) && playerY - playerSize / 2 >= 0) {
    playerY -= playerSpeed;
  }
  if (keyIsDown(RIGHT_ARROW) && playerX + playerSize / 2 <= width) {
    playerX += playerSpeed;
  }
  if (keyIsDown(DOWN_ARROW) && playerY + playerSize / 2 <= height) {
    playerY += playerSpeed;
  }
  if (keyIsDown(LEFT_ARROW) && playerX - playerSize / 2 >= 0) {
    playerX -= playerSpeed;
  }

  if (Newcelltimer % 100 === 0) {
    cell.push(random(10, width - 10), random(10, height - 10))

  }

  for (var i = 0; i < cell.length / 2; i++) {

    fill(0, 255, 255, 100)
    circle(cell[i * 2], cell[i * 2 - 1], 7)
  }



  fill(255, 255, 0)
  circle(playerX, playerY, playerSize)
  fill(0)
  ellipse(playerX - playerSize / 5, playerY - playerSize / 10, playerSize / 5, playerSize / 3)
  ellipse(playerX + playerSize / 5, playerY - playerSize / 10, playerSize / 5, playerSize / 3)
  arc(playerX, playerY + playerSize / 5, playerSize / 2, playerSize / 5, 0, 3.2, PIE)
  fill(255, 255, 0)
  noStroke()
  arc(playerX, (playerY + playerSize / 5) - 1, playerSize / 2, playerSize / 5, 0, 3.2, PIE)
  stroke(0)

  var Xindices = [...cell.keys()].filter(i => cell[i] >= playerX /*-pull*/ - playerSize / 2 && cell[i] <= playerX /*pull*/ + playerSize / 2);

  var Yindices = [...cell.keys()].filter(i => cell[i] >= playerY /**-pull*/ - (playerSize / 2) && cell[i] <= playerY /*+pull*/ + (playerSize / 2));

  function eatCheck(arr1, arr2) {

    for (let i = 0; i < arr1.length; i++) {
      for (let j = 0; j < arr2.length; j++) {
        if (Math.abs(Xindices[i] - Yindices[j]) === 1) {
          return j+1;
        }
      }


    }
    return false;
  }







  for (var j = 0; j < Yindices.length; j++) {
    if (Yindices[j] % 2 === 0 | Yindices[j] == 0) {
      Yindices.splice(j, 1)
    }
  }


  for (var j = 0; j < Xindices.length; j++) {
    if (Xindices[j] % 2 === 1) {
      Xindices.splice(j, 1)
    }
  }

  
  if (eatCheck(Xindices,Yindices)!=false)
    {
    playerSize += 7;
    cell.splice(Xindices[j-2])
    cell.splice(Yindices[j-1])
    cellEaten++;}
  if (playerSize >= width | playerSize >= height) {
    if (width > height) {
      playerSize = height;
    } else {
      playerSize = width;
    }




  }
  if (Newcelltimer % 500 === 0) {
    cell.splice(0, 2)
  }
  // if(pull>=75)
  //   {
  //     pull = 75;
  //   }


  fill(0)
  text("Your Size is: " + playerSize, 30, 30)
  // text("Your pull is: "+pull,30,60)
  // text("Upgrade your pull for "+pull*5+" size",430,45)
  // fill(0,0,0,0)
  // rect(410,20,187,50)


  // if(mouseClicked&&mouseX>410&&mouseX<600&&mouseY>20&&mouseY<50&&playerSize-10>pull*5)
  //   {
  //     playerSize-=pull*5
  //     pull++;
  //   }
}

标签: javascriptarraysp5.js

解决方案


当玩家的圆圈移过其中一个时,导致所有青色圆圈被移除的草图的具体问题如下:

if (eatCheck(Xindices,Yindices)!=false)
{
  playerSize += 7;
  cell.splice(Xindices[j-2])
  cell.splice(Yindices[j-1])
  cellEaten++;
}

调用splice需要指定要删除的数量。此代码更改将导致正在被吃掉的一个圆圈被删除:

if (eatCheck(Xindices,Yindices)!=false)
{
  playerSize += 7;
  cell.splice(Xindices[j-2],1); // remove 1 item from the list
  cell.splice(Yindices[j-1],1); // remove 1 item from the list
  cellEaten++;
}

这是拼接的一些信息

如果 deleteCount 被省略,或者它的值等于或大于 array.length - start (即如果等于或大于数组中剩余的元素个数,则从 start 开始),则所有元素从开始到结束的数组将被删除。


推荐阅读