【问题标题】:make blue balls follow red balls without colliding with other blue balls in javascript game在javascript游戏中使蓝球跟随红球而不与其他蓝球碰撞
【发布时间】:2020-05-17 18:35:35
【问题描述】:

所以我是 javascript 的新手,并试图让游戏有点像游戏......在这个游戏中,红球可以移动,蓝球应该跟随红球,就像蓝球应该向红球移动一样

现在他们正在跟随,但是蓝色的球相互重叠,最后只交了一个球......

我不希望这种重叠...怎么办?

这是我的代码

const canvas = document.getElementById("game");
const context = canvas.getContext("2d");

canvas.width = window.innerWidth-20;
canvas.height = window.innerHeight-20;

let gameover = false;
let x = canvas.width / 2;
let y = canvas.height / 2;
let dx = 0;
let dy = 0;

x3=y3=0;
virx = new Array();
viry = new Array();

for (i=0; i<25; i++)
{
    virx.push(Math.floor((Math.random() * window.innerWidth-20) + 1));
    viry.push(Math.floor((Math.random() * window.innerHeight-20) + 1));
}

const state = {
  "ArrowRight": false,
  "ArrowLeft": false,
  "ArrowUp": false,
  "ArrowDown": false
}



function draw() {
  context.clearRect(0, 0, canvas.width, canvas.height);
  context.beginPath();
  context.arc(x, y, 10, 0, Math.PI * 2, false);
  context.fillStyle = "red";
  context.fill();
  context.closePath();

  for (i=0; i<25; i++)
  {
    newpoint();
    context.beginPath();
    context.arc(virx[i], viry[i], 10, 0, Math.PI * 2, false);
    context.fillStyle = "blue";
    context.fill();
    context.closePath();
  }
}

function logic() {

  const direction = determineDirection();

  if (direction.dx) {
    dx = dx + direction.dx;
  }

  if (direction.dy) {
    dy = dy + direction.dy;
  }

  x = x + dx;
  y = y + dy;

  if (dx > 0) {
    dx -= 0.02;
  }
  if (dx < 0) {
    dx += 0.02;
  }
  if (dy > 0) {
    dy -= 0.02;
  }
  if (dy < 0) {
    dy += 0.02;
  }

}

function play() {
  draw();
  logic();
}









document.addEventListener("keydown", keyDownHandler, false);
document.addEventListener("keyup", keyUpHandler, false);

function newpoint()
{
    flag=0;
    vx= x - virx[i];
    vy= y - viry[i];
    vsize = Math.sqrt((vx*vx) + (vy*vy));
    vn_x = vx / vsize;
    vn_y = vy / vsize;

    newx = virx[i] + 0.5 * vn_x;
    newy = viry[i] + 0.5 * vn_y;
    // virx[i] = newx;
    // viry[i] = newy;

    // for (j=0; j<25; j++)
    // {
        // c = Math.sqrt(Math.pow((virx[j]-newx), 2)+Math.pow((viry[j]-newy), 2));

        // if (c<20)
        // {
            // flag=1;
        // }
    // }

    if (flag==0)
    {
        virx[i] = newx;
        viry[i] = newy;
    }
}

function determineDirection() {
  const {
    ArrowRight,
    ArrowLeft,
    ArrowUp,
    ArrowDown
  } = state
  if (ArrowRight && ArrowUp) {
    return {
      dx: .040,
      dy: -.040
    };
  }
  if (ArrowRight && ArrowDown) {
    return {
      dx: .040,
      dy: .040
    };
  }
  if (ArrowLeft && ArrowUp) {
    return {
      dx: -.040,
      dy: -.040
    };
  }
  if (ArrowLeft && ArrowDown) {
    return {
      dx: -.040,
      dy: .040
    };
  }
  if (ArrowLeft) {
    return {
      dx: -.040,
      dy: 0
    }
  }
  if (ArrowRight) {
    return {
      dx: .040,
      dy: 0
    }
  }
  if (ArrowUp) {
    return {
      dx: 0,
      dy: -.040
    }
  }
  if (ArrowDown) {
    return {
      dx: 0,
      dy: .040
    }
  }
  return {
    dx: 0,
    dy: 0
  }
}

function keyDownHandler({
  key
}) {
  state[key] = true;
}

function keyUpHandler({
  key
}) {
  state[key] = false;
}
setInterval(play, 10);

【问题讨论】:

  • 您的问题与 Python 或 C++ 有什么关系?
  • @Yksisarvinen 实际上是一个数学问题......所以任何编码人员都可以处理......这是我的想法......但我仍然删除了标签......对不起

标签: javascript canvas collision-detection


【解决方案1】:

在比赛的任何时刻,您都知道红球和蓝球的位置。我们称“向量”为球之间xy 的增量。

vx= red_x - blue_x
vy= red_y - blue_y

为了使用一些力大小f,最好使用大小为 1 的向量:

vsize = sqrt(vx*vx + vy*vy)
vn_x = vx / vsize
vn_y = vy / vsize

现在必须将蓝球移向红球:

newblue_x = blue_x + f * vn_x
newblue_y = blue_y + f * vn_y

【讨论】:

  • 这完全有效...但它有一个小错误...所有蓝色的atlast都变成了一个,一直跟随红色的...你能不能让它像这样蓝色的球不会重叠?
  • @fgh “不要重叠”值得提出自己的问题。本质上,当两个球相遇时,两者的半径之和等于它们中心之间的距离。检查此距离并做出您希望的决定。
  • 我试过了,代码中的注释区域显示了距离部分,但我认为在每 1/10 秒内进行如此多的计算只是挂起游戏,没有任何动作......你能帮忙吗解决这个问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多