HTML5 Canvas 赛车游戏动画

2022年4月19日 471点热度 0人点赞 0条评论

Hi,大家好,今天要带大家来做一个基于HTML5 Canvas的简易版赛车游戏。在游戏中,你可以使用键盘中的方向键来控制赛车,当然因为它只是模拟动画,所以并没有像真正的赛车游戏那样功能强大,不过这也可以帮助你很好的学习HTML5相关知识。

这个游戏有下面几个特点:

  • 通过上下左右键控制车速和方向。
  • 赛车飞出道路后自动减速。
  • 简易的实时码速表。

下面我们先来看看最终效果吧,文章最后我们也会给出源码包供大家学习。

效果预览

图片

代码实现

HTML代码

HTML代码非常简单,在页面中丢一个<canvas>元素即可。

JavaScript代码

由于并没有什么特殊的CSS代码,因此我们直接跳过这部分了,直接来看看这个游戏的核心JS代码。

首先是一些配置信息,包括颜色配置,比如道路颜色、草地颜色、天空颜色等等,还包括一些画面参数,例如每秒帧数(fps)、草地宽度、道路宽度等,具体代码定义如下:

var $ = {
      canvasnull,
      ctxnull,
      canvas2null,
      ctx2null,
      colors: {
        sky"#D4F5FE",
        mountains"#83CACE",
        ground"#8FC04C",
        groundDark"#73B043",
        road"#606a7c",
        roadLine"#FFF",
        hud"#FFF"
      },
      settings: {
        fps60,
        skySize120,
        ground: {
          size350,
          min4,
          max120
        },
        road: {
          min76,
          max700,
        }
      },
      state: {
        bgpos0,
        offset0,
        startDarktrue,
        curve0,
        currentCurve0,
        turn1,
        speed27,
        xpos0,
        section50,
        car: {
          maxSpeed50,
          friction0.4,
          acc0.85,
          deAcc0.5
        },
        keypress: {
          upfalse,
          leftfalse,
          rightfalse,
          downfalse
        }
      },
      storage: {
        bgnull
      }
    };

接下来获取canvas绘制对象:

$.canvas = document.getElementsByTagName('canvas')[0];
$.ctx = $.canvas.getContext('2d');
$.canvas2 = document.createElement('canvas');
$.canvas2.width = $.canvas.width;
$.canvas2.height = $.canvas.height;
$.ctx2 = $.canvas2.getContext('2d');

然后注册监听键盘事件:

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

到这里,前期准备工作就做完了。接下来就是要绘制赛道、赛车、草地、天空以及码速表这些元素了。

赛车绘制:

function drawCar({
  var carWidth = 160,
      carHeight = 50,
      carX = ($.canvas.width / 2) - (carWidth / 2),
      carY = 320;
  
  // shadow
  roundedRect($.ctx, "rgba(0, 0, 0, 0.35)", carX - 1 + $.state.turn, carY + (carHeight - 35), carWidth + 10, carHeight, 9);
  
  // tires
  roundedRect($.ctx, "#111", carX, carY + (carHeight - 30), 30406);
  roundedRect($.ctx, "#111", (carX - 22) + carWidth, carY + (carHeight - 30), 30406);
  
  drawCarBody($.ctx);
}

赛道绘制:

function drawRoad(min, max, squishFactor, color{
  var basePos = $.canvas.width + $.state.xpos;
  
  $.ctx.fillStyle = color;
  $.ctx.beginPath();
  $.ctx.moveTo(((basePos + min) / 2) - ($.state.currentCurve * 3), $.settings.skySize);
  $.ctx.quadraticCurveTo((((basePos / 2) + min)) + ($.state.currentCurve / 3) + squishFactor, $.settings.skySize + 52, (basePos + max) / 2, $.canvas.height);
  $.ctx.lineTo((basePos - max) / 2, $.canvas.height);
  $.ctx.quadraticCurveTo((((basePos / 2) - min)) + ($.state.currentCurve / 3) - squishFactor, $.settings.skySize + 52, ((basePos - min) / 2) - ($.state.currentCurve * 3), $.settings.skySize);
  $.ctx.closePath();
  $.ctx.fill();
}

码速表绘制:

function drawHUD(ctx, centerX, centerY, color{
  var radius = 50, tigs = [090135180225270315],
      angle = 90;

  ctx.beginPath();
  ctx.arc(centerX, centerY, radius, 02 * Math.PI, false);
  ctx.lineWidth = 7;
  ctx.fillStyle = 'rgba(0, 0, 0, 0.4)';
  ctx.fill();
  ctx.strokeStyle = color;
  ctx.stroke();
  
  for (var i = 0; i < tigs.length; i++) {
    drawTig(ctx, centerX, centerY, radius, tigs[i], 7);
  }
  
  // draw pointer
  angle = map($.state.speed, 0, $.state.car.maxSpeed, 90360);
  drawPointer(ctx, color, 50, centerX, centerY, angle);
}

其他元素的绘制也是大同小异,这里就不一一展开了,大家可以在源码JS文件中找到相应的代码。

最后是键盘事件处理,用来控制车速以及方向:

function keyUp(e{
    move(e, false);
}

function keyDown(e{
    move(e, true);
}

function move(e, isKeyDown{
  if(e.keyCode >= 37 && e.keyCode <= 40) {
    e.preventDefault();
  }

  if(e.keyCode === 37) {
    $.state.keypress.left = isKeyDown;
  } 

  if(e.keyCode === 38) {
    $.state.keypress.up = isKeyDown;
  } 

  if(e.keyCode === 39) {
    $.state.keypress.right = isKeyDown;
  } 

  if(e.keyCode === 40) {
    $.state.keypress.down = isKeyDown;
  }
}

到这里,我们把整个HTML5赛车动画的制作过程就全部讲完了,文章最后也将源码献给大家。

源码下载

完整的代码我已经整理出了一个源码包,供大家下载学习。

长按下方二维码关注我的公众号“前端技术官”,回复关键字:3008,即可获取源码下载链接。

图片

代码仅供参考和学习,请不要用于商业用途。

最后总结

通过这个HTML5 Canvas赛车游戏的学习,你会发现其在网页上做小游戏并没有像你想得那么复杂。下面给大家留一个思考:如何在道路上添加一些障碍,让赛车可以避开障碍物行驶?

67330HTML5 Canvas 赛车游戏动画

root

这个人很懒,什么都没留下

文章评论