Страницы

Поиск по вопросам

четверг, 26 декабря 2019 г.

JavaScript/Canvas Приятствие

#javascript #canvas


подскажите, как сделать чтобы черный квадрат не смог проходить сквозь зеленый квадрат.



var canvas = document.getElementById("d1");
var ctx = canvas.getContext("2d");

var pressedRight = false;
var pressedLeft = false;
var pressedUp = false;
var pressedDown = false;

document.addEventListener("keydown", keyDown, false);
document.addEventListener("keyup", keyUp, false);

function keyDown(e) {
  if(e.keyCode == 37) {
    pressedRight = true;
  } else if(e.keyCode == 38) {
    pressedUp = true;
  }else if(e.keyCode == 39) {
    pressedLeft = true;
  }else if(e.keyCode == 40) {
    pressedDown = true;
  }
}

function keyUp(e) {
  if(e.keyCode == 37) {
    pressedRight = false;
  } else if(e.keyCode == 38) {
    pressedUp = false;
  }else if(e.keyCode == 39) {
    pressedLeft = false;
  }else if(e.keyCode == 40) {
    pressedDown = false;
  }
}

var player = {
  x: 10,
  y: 10,
  pW: 50,
  pH: 50,
  draw: function() {
    ctx.beginPath();
    ctx.rect(this.x, this.y, this.pW, this.pH);
    ctx.fillStyle = "black";
    ctx.fill();
    ctx.closePath();
  }
}

var block = {
  x: 200,
  y: 100,
  pW: 50,
  pH: 50,
  draw: function() {
    ctx.beginPath();
    ctx.rect(this.x, this.y, this.pW, this.pH);
    ctx.fillStyle = "green";
    ctx.fill();
    ctx.closePath();
  }
}

function draw() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  player.draw();
  block.draw();
  
  if(pressedRight && 0 < player.x) {
    player.x -= 3;
  }
  if(pressedLeft && player.x < canvas.height - player.pW) {
    player.x += 3;
  }
  if(pressedUp && 0 < player.y) {
    player.y -= 3;
  }
  if(pressedDown && player.y < canvas.height - player.pH) {
    player.y += 3;
  }

}

setInterval(draw, 10);
#d1 {
  border: 1px solid black;
}




    


Ответы

Ответ 1



var canvas = document.getElementById("d1"); var ctx = canvas.getContext("2d"); var pressedRight = false; var pressedLeft = false; var pressedUp = false; var pressedDown = false; document.addEventListener("keydown", keyDown, false); document.addEventListener("keyup", keyUp, false); function keyDown(e) { if(e.keyCode == 37) { pressedRight = true; } else if(e.keyCode == 38) { pressedUp = true; }else if(e.keyCode == 39) { pressedLeft = true; }else if(e.keyCode == 40) { pressedDown = true; } } function keyUp(e) { if(e.keyCode == 37) { pressedRight = false; } else if(e.keyCode == 38) { pressedUp = false; }else if(e.keyCode == 39) { pressedLeft = false; }else if(e.keyCode == 40) { pressedDown = false; } } var player = { x: 10, y: 10, pW: 50, pH: 50, draw: function() { ctx.beginPath(); ctx.rect(this.x, this.y, this.pW, this.pH); ctx.fillStyle = "black"; ctx.fill(); ctx.closePath(); } } var block = { x: 200, y: 100, pW: 50, pH: 50, draw: function() { ctx.beginPath(); ctx.rect(this.x, this.y, this.pW, this.pH); ctx.fillStyle = "green"; ctx.fill(); ctx.closePath(); } } function draw() { if(pressedRight && 0 < player.x) { player.x -= 3; //добавлена проверка на принадлежность углов Игрока к текущему контексту, //которым, в данном коде, является блок. Углы выбираются в зависимости от направления движения if(checkCrash(player.x, player.y) || checkCrash(player.x, player.y+player.pH) ){ gameOver(); return; } } if(pressedLeft && player.x < canvas.height - player.pW) { player.x += 3; if(checkCrash(player.x+player.pW, player.y) || checkCrash(player.x+player.pW, player.y+player.pH) ){ gameOver(); return; } } if(pressedUp && 0 < player.y) { player.y -= 3; if(checkCrash(player.x, player.y) || checkCrash(player.x+player.pW, player.y) ){ gameOver(); return; } } if(pressedDown && player.y < canvas.height - player.pH) { player.y += 3; if(checkCrash(player.x, player.y+player.pH) || checkCrash(player.x+player.pW, player.y+player.pH) ){ gameOver(); return; } } ctx.clearRect(0, 0, canvas.width, canvas.height); player.draw(); block.draw(); } var timerId = setInterval(draw, 10); //используется нативный метод isPointInPath, который проверяет принадлежность // точки к текущему контексту. Текущим контекстом у Вас является блок, т.к. он отрисовывается последним. function checkCrash(x,y){ return ctx.isPointInPath(x,y); } function gameOver(){ console.log("Вы проиграли"); document.removeEventListener("keydown", keyDown, false); document.removeEventListener("keyup", keyUp, false); clearInterval(timerId); } #d1 { border: 1px solid black; }

Комментариев нет:

Отправить комментарий