javascript - 如何给跳跃系统添加限制?

标签 javascript html css

我正在尝试为我的学校元素重新创建“我想成为那个人”。 我想给重力系统添加一个限制,让 Angular 色在空气中停留几秒钟,然后再次跳跃只有在它到达地面时。我找到了很多教程,但我的仍然没有用。 (问题是当你按住W时, Angular 色会上升到框架的顶部,松开时会下降)

var canvas = document.getElementById("canvas");
var c = canvas.getContext("2d");
var img = document.getElementById("kid");
var playerW = 30;
var playerH = 40;
var playerX = 5 + 40;
var playerY = canvas.height - 40 - playerH + 5;
var right = false;
var left = false;
var up = false;
var rightup = false;
var leftup = false;
var onGround = true;
var dy = 10;
var userchoice = false;
var velocity = 10;

document.addEventListener("keydown", press);
document.addEventListener("keyup", release);

function press(event) {
  if (event.keyCode == 68) {
    right = true
  }
  if (event.keyCode == 65) {
    left = true
  }
  if (event.keyCode == 87) {
    up = true;
  }
  if (event.keyCode == 68 && event.keyCode == 87) {
    rightup = true;
  }
  if (event.keyCode == 65 && event.keyCode == 87) {
    leftup = true;
  }

}

function release(event) {
  if (event.keyCode == 68) {
    right = false
  }
  if (event.keyCode == 65) {
    left = false
  }
  if (event.keyCode == 87) {
    up = false
  }
  if (event.keyCode == 68 && event.keyCode == 87) {
    rightup = false
  }
  if (event.keyCode == 65 && event.keyCode == 87) {
    leftup = false
  }
}

function Gravity() {
  if (playerY <= canvas.height - 80) {
    playerY += dy;
    playerY += velocity;
    velocity *= 0.9
  }

}


function background() {
  var backgroundX = 40;
  var backgroundY = 40;
  for (var a = 0; a < canvas.width / 40; a++) {
    c.moveTo(backgroundX, backgroundY);
    c.lineTo(backgroundX, 0); //verticle
    c.moveTo(backgroundX, backgroundY);
    backgroundX += 40;
    c.lineTo(backgroundX, backgroundY);
    c.stroke();
  }
  backgroundX = 40;
  for (var a = 0; a < canvas.height / 40; a++) {
    c.moveTo(backgroundX, backgroundY);
    c.lineTo(0, backgroundY);
    c.moveTo(backgroundX, backgroundY);
    backgroundY += 40;
    c.lineTo(backgroundX, backgroundY);
    c.stroke();
  }
  backgroundY = canvas.height - 40;
  for (var a = 0; a < canvas.width / 40; a++) {
    c.moveTo(backgroundX, backgroundY);
    c.lineTo(backgroundX, canvas.height);
    c.moveTo(backgroundX, backgroundY);
    backgroundX += 40;
    c.lineTo(backgroundX, backgroundY);
    c.stroke();
  }
  backgroundX = canvas.width - 40;
  for (var a = 0; a < canvas.height / 40; a++) {
    c.moveTo(backgroundX, backgroundY);
    c.lineTo(canvas.width, backgroundY);
    c.moveTo(backgroundX, backgroundY);
    backgroundY -= 40;
    c.lineTo(backgroundX, backgroundY);
    c.stroke();
  }
}


function Player() {
  c.beginPath();
  c.drawImage(img, playerX, playerY, playerW, playerH);
  c.closePath();
}

function Sprites() {
  c.beginPath();
  c.moveTo();

  c.closePath();
}

function draw() {
  c.clearRect(0, 0, canvas.width, canvas.height);
  Player();
  background();
  if (right && playerX < canvas.width - 40 - playerW) {
    playerX += 10
  }
  if (left && playerX > 40) {
    playerX -= 5
  }
  if (up && onGround === false) {
    onGround === true
    if (up && playerY < canvas.height - 40) {
      playerY -= 20
    }
    if (rightup && playerX < canvas.width - 40 - playerW && playerY < canvas.height - 40 - playerH) {
      playerX += 5;
      playerY -= 20
    }
    if (leftup && playerX > 40 && playerY < canvas.height - 40 - playerH) {
      playerX += 5;
      playerY -= 20
    }
  }
  playerY += dy;
  playerY += velocity;
  velocity *= 0.9;
  if (playerY >= canvas.height - 80) {
    onGround = false;
    playerY = canvas.height - 80;
    velocity = 0;

  }
}

var interval = setInterval(draw, 30);
body {
  background: #2b2b2b;
  height: 100vh;
  margin: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  font-family: Helvetica neue, roboto;
}

h1 {
  color: #bdbdbd;
  font-weight: 300;
}
<canvas id="canvas" width="800" height="600" style="border:1px solid black;"></canvas>
<div style="display:none;">
  <img id="kid" src="https://vignette.wikia.nocookie.net/smash-bros-lelle/images/7/79/The_kid.png/revision/latest?cb=20180424233943">
</div>

最佳答案

这段代码看起来不对

  if(up && onGround===false){
    onGround===true
    if(up && playerY<canvas.height-40){playerY-=20}
    if(rightup && playerX<canvas.width-40-playerW && playerY<canvas.height-40-playerH){playerX+=5; playerY-=20}
    if(leftup && playerX>40 && playerY<canvas.height-40-playerH){playerX+=5; playerY-=20}
  }

对于初学者来说,onGround===true 是一个比较,而不是一个赋值,所以这有一个 no opp 的效果。

在其他地方,你有

  if(event.keyCode== 68 && event.keyCode==87){rightup=true; }
  if(event.keyCode== 65 && event.keyCode==87){leftup=true;}

event.keyCode可以是68、65、87,但绝对不能是68和87,只有一个值:key的keyCode值

尝试这些更正,看看它是否能让你更接近你想要的东西

关于javascript - 如何给跳跃系统添加限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55226513/

相关文章:

html - 仅在移动设备上居中对齐文本

javascript - 未将数组从 Node.js 获取到 AJAX

jquery - 自定义单选按钮 - 在 iPad 上的 Safari 中显示隐藏的默认按钮

javascript - 如何更改表格中点击的样式

javascript - 在 css3 表单上使用 Javascript

JavaScript Map/Reduce 返回按计数分组

php - 显示来自两个表(菜单和子菜单)的数据

html - 页眉不适用于背景图片

javascript - 集成 Netbeans、symfony 和 dart

使用 Spring WebFlow 进行 Javascript 表单验证