js实现一个canvas赛车小游戏效果代码
代码语言:html
所属分类:游戏
代码描述:js实现一个canvas赛车小游戏效果代码
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> <canvas height="450" width="750"></canvas> <script> var $ = { canvas: null, ctx: null, canvas2: null, ctx2: null, colors: { sky: "#D4F5FE", mountains: "#83CACE", ground: "#8FC04C", groundDark: "#73B043", road: "#606a7c", roadLine: "#FFF", hud: "#FFF" }, settings: { fps: 60, skySize: 120, ground: { size: 350, min: 4, max: 120 }, road: { min: 76, max: 700, } }, state: { bgpos: 0, offset: 0, startDark: true, curve: 0, currentCurve: 0, turn: 1, speed: 27, xpos: 0, section: 50, car: { maxSpeed: 50, friction: 0.4, acc: 0.85, deAcc: 0.5 }, keypress: { up: false, left: false, right: false, down: false } }, storage: { bg: null } }; $.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); drawBg(); draw(); function draw() { setTimeout(function() { calcMovement(); //if($.state.speed > 0) { $.state.bgpos += ($.state.currentCurve * 0.02) * ($.state.speed * 0.2); $.state.bgpos = $.state.bgpos % $.canvas.width; $.ctx.putImageData($.storage.bg, $.state.bgpos, 5); $.ctx.putImageData($.storage.bg, $.state.bgpos > 0 ? $.state.bgpos - $.canvas.width : $.state.bgpos + $.canvas.width, 5); //} $.state.offset += $.state.speed * 0.05; if($.state.offset > $.settings.ground.min) { $.state.offset = $.settings.ground.min - $.state.offset; $.state.startDark = !$.state.startDark; } drawGround($.ctx, $.state.offset, $.colors.ground, $.colors.groundDark, $.canvas.width); drawRoad($.settings.road.min + 6, $.settings.road.max + 36, 10, $.colors.roadLine); drawGround($.ctx2, $.state.offset, $.colors.roadLine, $.colors.road, $.canvas.width); drawRoad($.settings.road.min, $.settings.road.max, 10, $.colors.road); drawRoad(3, 24, 0, $.ctx.createPattern($.canvas2, 'repeat')); drawCar(); drawHUD($.ctx, 630, 340, $.colors.hud); requestAnimationFrame(draw); }, 1000 / $.settings.fps); } function drawHUD(ctx, centerX, centerY, color) { var radius = 50, tigs = [0, 90, 135, 180, 225, 270, 315], angle = 90; ctx.beginPath(); ctx.arc(centerX, centerY, radius, 0, 2 * 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, 90, 360); drawPointer(ctx, color, 50, centerX, centerY, angle); } function drawPointer(ctx, color, radius, centerX, centerY, angle) { var point = getCirclePoint(centerX, centerY, radius - 20, angle), point2 = getCirclePoint(centerX, centerY, 2, angle + 90), point3 = getCirclePoint(centerX, centerY, 2, angle - 90); ctx.beginPath(); ctx.strokeStyle = "#FF9166"; ctx.lineCap = 'round'; ctx.lineWidth = 4; ctx.moveTo(point2.x, point2.y); ctx.lineTo(point.x, point.y); ctx.lineTo(point3.x, point3.y); ctx.stroke(); ctx.beginPath(); ctx.arc(centerX, centerY, 9, 0, 2 * Math.PI, false); ctx.fillStyle = color; ctx.fill(); } function drawTig(ctx, x, y, radius, angle, size) { var startPoint = getCirclePoint(x, y, radius - 4, angle), endPoint = getCirclePoint(x, y, radius - size, angle) ctx.beginPath(); ctx.lineCap = 'round'; ctx.moveTo(startPoint.x, startPoint.y); ctx.lineTo(endPoint.x, endPoint.y); ctx.stroke(); } function getCirclePoint(x, y, radius, angle) { var radian = (angle / 180) * Math.PI; return { x: x + radius * Math.cos(radian), y: y + radius * Math.sin(radian) } } function calcMovement() { var move = $.state.speed * 0.01, newCurve = 0; if($.state.keypress.up) { $.state.speed += $.state.car.acc - ($.state.speed * 0.015); } else if ($.state.speed > 0) { $.state.speed -= $.state.car.friction; } if($.state.keypress.down && $.state.speed > 0) { $.state.speed -= 1; } // Left and right $.state.xpos -= ($.state.currentCurve * $.state.speed) * 0.005; if($.state.speed) { if($.state.keypress.left) { $.state.xpos += (Math.abs($.state.turn) + 7 + ($.state.speed > $.state.car.maxSpeed / 4 ? ($.state.car.maxSpeed - ($.state.speed / 2)) : $.state.speed)) * 0.2; $.state.turn -= 1; } if($.state.keypress.right) { $.state.xpos -= (Math.abs($.state.turn) + 7 + ($.state.speed > $.state.car.maxSpeed / 4 ? ($.state.car.maxSpeed - ($.state.speed / 2)) : $.state.speed)) * 0.2; $.state.turn += 1; } if($.state.turn !== 0 && !$.state.keypress.left && !$.state.keypress.right) { $.state.turn += $.state.turn > 0 ? -0.25 : 0.25; } } $.state.turn = clamp($.state.turn, -5, 5); $.state.speed = clamp($.state.speed, 0, $.state.car.maxSpeed); // section $.state.section -= $.state.speed; if($.state.section < 0) { $.state.section = randomRange(1000, 9000); newCurve = randomRange(-50, 50); if(Math.abs($.state.curve - newCurve) < 20) { newCurve = randomRange(-50, 50); } $.state.curve = newCurve; } if($.state.currentCurve < $.state.curve && move < Math.abs($.state.currentCurve - $.state.curve)) { $.state.currentCurve += move; } else if($.state.currentCurve > $.state.curve && move < Math.abs($.state.currentCurve - $.state.curve)) { $.state.currentCurve -= move; } if(Math.abs($.state.xpos) > 550) { $.state.speed *= 0.96; } $.state.xpos = clamp($.state.xpos, -650, 650); } function keyUp(e) { move(e, false); } function keyDown(e) { move(e, true); } function move(e, isKeyDown) { if(e..........完整代码请登录后点击上方下载按钮下载查看
网友评论0