canvas 实现赛车小游戏
一:样式
<style>
        #btn{
            width: 60px;
            height: 30px;
            line-height: 30px;
            background: #7EC0EE;
            border: 2px solid #8A2BE2;
            font-size: 20px;
            text-align: center;
            font-weight: bold;
            border-radius: 5px;
            box-shadow: 0 2px 2px #8A2BE2;
            display: block;
            position: absolute;
            top:30px;
            left: 140px;
            cursor: pointer;
        }
#sd{
            position: absolute;
            top:30px;
            left: 30px;
            border: 2px solid #8A2BE2;
            width: 100px;
            height: 30px;
            line-height: 30px;
            border-radius: 5px;
            font-size: 20px;
            text-align: center;
        }
    </style>
二: 画布
<canvas width="200" height="500" id="canvas" style="border:10px solid #A2CD5A;"></canvas>
<input type="text" placeholder="难度(1-5)" id="sd">
<div id="btn">开始</div>
三:实现
var canvas = document.getElementById('canvas');
    var cxt = canvas.getContext('2d');
// 定时器
    var timer;
    // 游戏是否结束
    var iStop;
    // 赛车
    var car;
    // 障碍物
    var blocks;
    // 障碍物速度
    var speed;
// 清除画布
    function erase(){
        cxt.clearRect(0, 0, canvas.width, canvas.height);
    }
function init(){
        iStop = false;
        // 赛车
        car = {'x':0,'y':450,'width':50, 'height':50};
        // 障碍物
        blocks = [
            {'x':-0,'y':-50,'width':50, 'height':50},
            {'x':50,'y':-50,'width':50, 'height':50},
            {'x':100,'y':-50,'width':50, 'height':50},
            {'x':0,'y':250,'width':50, 'height':50},
            {'x':50,'y':250,'width':50, 'height':50},
            {'x':150,'y':250,'width':50, 'height':50}
        ];
        speed = 2;
    }
// 绘图
    function draw(){
        cxt.save();
        cxt.fillRect(car.x, car.y, car.width, car.height);
        for(var i=0;i<blocks.length;i++){
            cxt.fillRect(blocks[i].x, blocks[i].y, blocks[i].width, blocks[i].height);
            if(blocks[i].y > 400 && blocks[i].x == car.x){
                iStop = true;
            }
        }
        cxt.restore();
    }
// 障碍物前进
    function step(){
        var _blocks = [];
for(var i=0;i<blocks.length;i++){
            blocks[i].y += speed;
            if(blocks[i].y < 500){
                _blocks.push(blocks[i]);
            }
        }
if(_blocks.length == 3){
            var out = Math.round(Math.random()*3);
            for(var j=0; j<4; j++){
                if(j != out){
                    _blocks.push({'x':(50*j),'y':-50,'width':50, 'height':50});
                }
            }
        }
blocks = _blocks;
    }
function drawOver() {
        cxt.save();
        cxt.font="20px Verdana";
        cxt.fillStyle = 'yellow';
        cxt.fillText('游戏结束!', 75, 200);
        cxt.restore();
    }
// 键盘控制赛车左右(<-、->)运动
    var last = new Date();
    document.onkeydown = (function(e){
        var now = new Date();
        if(now.getTime() - last.getTime() < 100){
            return;
        }
        last = now;
        switch(e.which){
            case 39:
                if(car.x < 150){
                    car.x += 50;
                }
                break;
            case 37:
                if(car.x > 0){
                    car.x -= 50;
                }
                break;
        }
    });
window.requestAnimationFrame =
            window.requestAnimationFrame ||
            window.mozRequestAnimationFrame ||
            window.webkitRequestAnimationFrame ||
            window.msRequestAnimationFrame;
window.cancelRequestAnimationFrame =
            window.cancelRequestAnimationFrame ||
            window.mozCancelRequestAnimationFrame ||
            window.webkitCancelRequestAnimationFrame ||
            window.msCancelRequestAnimationFrame;
function animate() {
        erase();
        draw();
        step();
        if(iStop){
            cancelRequestAnimationFrame(timer);
            drawOver();
        }else{
            timer = requestAnimationFrame(animate);
        }
    }
//animate();
document.querySelector('#btn').onclick = function(){
        if(this.innerHTML == '开始'){
            init();
var s = document.querySelector('#sd').value;
            if(s != ''){
                speed = parseInt(s);
            }
animate();
            this.innerHTML = '结束';
        }else{
            cancelRequestAnimationFrame(timer);
            this.innerHTML = '开始';
        }
    }
canvas 实现赛车小游戏的更多相关文章
- java 图形化小工具Abstract Window Toolit :画笔Graphics,画布Canvas(),弹球小游戏
		画笔Graphics Java中提供了Graphics类,他是一个抽象的画笔,可以在Canvas组件(画布)上绘制丰富多彩的几何图和位图. Graphics常用的画图方法如下: drawLine(): ... 
- Canvas进阶——制作小游戏【贪吃蛇】
		今天呢,主要和小伙伴们分享一下一个贪吃蛇游戏从构思到实现的过程~因为我不是很喜欢直接PO代码,所以只copy代码的童鞋们请出门左转不谢. 按理说canvas与其应用是老生常谈了,可我在准备阶段却搜索不 ... 
- canvas 实现微信小游戏
		var canvas = document.getElementById('canvas'); var cxt = canvas.getContext('2d'); var timer; var iS ... 
- [Canvas]首个小游戏告成
		英雄在地图上射箭杀怪兽,杀完了就胜利了. 点此下载程序试玩. 图例: 代码: <!DOCTYPE html> <html lang="utf-8"> < ... 
- 【JavaScript】canvas实现一个小游戏
		参考: 1.image onload事件:http://www.runoob.com/jsref/event-img-onload.html(赞) 2.canvas的drawImage无法显示图像:h ... 
- 如何开发一个简单的HTML5 Canvas 小游戏
		原文:How to make a simple HTML5 Canvas game 想要快速上手HTML5 Canvas小游戏开发?下面通过一个例子来进行手把手教学.(如果你怀疑我的资历, A Wiz ... 
- html5+Canvas实现酷炫的小游戏
		最近除了做业务,也在尝试学习h5和移动端,在这个过程中,学到了很多,利用h5和canvas做了一个爱心鱼的小游戏.点这里去玩一下 PS: 貌似有点闪屏,亲测多刷新两下就好了==.代码在本地跑都不会闪, ... 
- Canvas小游戏里,删除过期或者死亡元素技巧
		在许多canvas游戏,canvas效果中,经常会有过期的元素需要删除 例如现在需要制作一个笨鸟先飞(flappy bird)小游戏,游戏中障碍物(且称为柱子),此时会有一个全局变量保存所有柱子的实例 ... 
- canvas drag 实现拖拽拼图小游戏
		博主一直心心念念想做一个小游戏- 前端时间终于做了一个小游戏,直到现在才来总结,哈哈- 以后要勤奋点更新博客! 实现原理 1.如何切图? 用之前的方法就是使用photoshop将图片切成相应大小的图 ... 
随机推荐
- 调整数组顺序使奇数位于偶数前面(python)
			题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. # -*- codi ... 
- Linux之间配置SSH互信(SSH免密码登录)
			为简化SSH过程,采用证书方式,免去SSH登入时需要输入账号密码的过程,具体操作如下: 一.在SSH服务器所在机器上 1.以root用户登录,更改ssh配置文件 /etc/ssh/sshd_confi ... 
- Selenium 定位元素原理,基本API,显示等待,隐式等待,重试机制等等
			Selenium 如何定位动态元素: 测试的时候会遇到元素每次变动的情况,例如: <div id="btn-attention_2030295">...</di ... 
- 解决com.microsoft.sqlserver.jdbc.SQLServerException: 该连接已关闭
			com.microsoft.sqlserver.jdbc.SQLServerException: 该连接已关闭. at com.microsoft.sqlserver.jdbc.SQLServerEx ... 
- java 编解码
			decoder:解码--> 将文件内容转换为字符对象: encoder:编码-->将字符对象转换为字节或者字节数组: ASCII (American Standard for Infor ... 
- linux命令学习之:wc
			wc(Word Count)命令用来计算数字.利用wc指令我们可以计算文件的Byte数.字数或是列数,若不指定文件名称,或是所给予的文件名为“-”,则wc指令会从标准输入设备读取数据. 命令格式 wc ... 
- python3 安装使用 fabirc3 模块以及 fab 命令(转)
			原文地址:https://blog.csdn.net/cityzenoldwang/article/details/78454964 python3 fabric3 模块之 fab 命令 安装 pyt ... 
- linux修改hosts
			vim /etc/hosts 
- 我的第一个WCF程序
			写WCF,VS需要一管理员身份呢启动,否则服务无法访问. model层 using System; using System.Runtime.Serialization; namespace MyMo ... 
- three.js raycaster射线碰撞的坑 (当canvas大小 不是屏幕大小是解决拾取物体的办法)
			这里只是记录一下坑,方便查阅,内容主要援引自:three.js Raycaster 射线拾取 canvas不占满整屏时射线拾取存在偏差 1. 世界坐标系: 世界坐标系位于屏幕的中心(0,0,0),往右 ... 
