js弹球小游戏(带积分)

注:如果小球与底部方块的角碰撞,积分可能有些许bug

<style>
    #box {
      width: 400px;
      height: 400px;
      border: 1px solid #000000;
      margin: 50px auto;
      position: relative;
    }

    #ball {
      height: 60px;
      width: 60px;
      border-radius: 50%;
      background-color: red;
      position: absolute;
      left: 0;
      top: 0;
    }

    #block {
      width: 100px;
      height: 20px;
      position: absolute;
      left: 150px;
      bottom: 0;
      background-color: black;
    }

    #count {
      color: #ff0000;
      font-size: 18px;
      position: absolute;
      width: 20px;
      height: 20px;
      left: -20px;
      top: 0;
    }
  </style>
<body>
  <div id="box">
    <div id="count">0</div>
    <div id="ball"></div>
    <div id="block"></div>
  </div>
</body>
<script>
  var oBox = document.querySelector('#box');
  var oBall = document.querySelector('#ball');
  var oBlock = document.querySelector('#block');
  var oCount = document.querySelector('#count');

  var speedBlock = 5;
  var speedX = 5;
  var speedY = 4;

  var maxLeft = oBox.clientWidth - oBall.offsetWidth;
  var maxTop = oBox.clientHeight - oBall.offsetHeight;
  var max = oBox.clientWidth - oBlock.offsetWidth;

  setInterval(function () {
    var left = oBall.offsetLeft;
    var top = oBall.offsetTop;

    left += speedX;
    top += speedY;

    if (left < 0 || left > maxLeft) {
      speedX = -speedX;
    }

    if (top < 0) {
      speedY *= -1;
    }

    var r = oBall.offsetWidth / 2;

    if (left >= oBlock.offsetLeft - r &&  // 左边线碰撞条件
      left <= oBlock.offsetLeft - r + oBlock.offsetWidth &&  // 右边线碰撞条件
      top >= maxTop - oBlock.offsetHeight     // 下边线碰撞条件
    ) {
      // console.log('撞上了');
      speedY = -Math.abs(speedY);
      // speedY *= -1;
      oCount.innerHTML = oCount.innerHTML * 1 + 1;
    }

    if (top > maxTop) {
      left = 0;
      top = 0;
    }

    oBall.style.left = left + 'px';
    oBall.style.top = top + 'px';

  }, 50);

  document.onkeydown = function (e) {
    var ev = event || e;
    var keyCode = ev.keyCode || ev.which;

    var left = oBlock.offsetLeft;

    if (keyCode === 37) {
      left -= speedBlock;
    }
    if (keyCode === 39) {
      left += speedBlock;
    }

    if (left <= 0) {
      left = 0
    }

    if (left >= max) {
      left = max;
    }

    oBlock.style.left = left + 'px';
  }
</script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值