HTML小游戏—打灰机

这里为大家带了一款小游戏~~打灰机========
话不多说,上代码:
HTML部分:

    <meta charset="UTF-8">
    <title>打灰机</title>
    <link rel="stylesheet" type="text/css" href="css/default.css">
    <style type="text/css">
        #canvas{margin: 0 auto;}
    </style>
</head>
<body>
    <div class="htmleaf-container">
        <header class="htmleaf-header">
            <h1>打灰机~~~~~~~~~~</h1>
        </header>
        <canvas id="canvas" width="800" height="600"></canvas>
    </div>
    <script src="js/BlockBlaster.js"></script>

default.css里面的内容:

body{
    background: #f9f7f6;
    color: #404d5b;
    font-weight: 500;
    font-size: 1.05em;
    font-family: "Segoe UI", "Lucida Grande", Helvetica, Arial, "Microsoft YaHei", FreeSans, Arimo, "Droid Sans", "wenquanyi micro hei", "Hiragino Sans GB", "Hiragino Sans GB W3", "FontAwesome", sans-serif;
}
.htmleaf-container{
    margin: 0 auto;
    text-align: center;
    overflow: hidden;
}

css里面没啥重要的东西,主要就是定个位之类的~~~
下面是核心代码了!!!JS
BlockBlaster.js内容:


    var fps = 30;
    var canvas = document.getElementById('canvas');
    var ctx = canvas.getContext("2d");          
    var bgColor = "rgb(40,40,40)"
    var ready;
    var enemyScore;
    var renderTimer = setInterval(render,1/fps*100);
    var difficultyTimer;
    var spawnTimer;
    var spawntime;
    var gameTime;
    var difficulty;
    var score;
    var highScore=0;
    var gameOver;
    var entities = [];
    var player;
    var fader;

    function reset(){
        if (score > highScore) highScore = score;
        ready = true;
        enemyScore = 0;
        gameTime = 0;
        difficulty = 1;
        score = 0;
        spawntime = 1500;
        gameOver = false;
        fader = 0;
        entities = [];
        player = null;
        clearTimers()
    }

    //清除所有的定时器
    function clearTimers(){
        clearInterval(difficultyTimer);
        clearInterval(spawnTimer);
    }
    //初始化所有定时器 
    function initializeTimers(){
        difficultyTimer = setInterval(increaseDifficulty,2000);
        spawnTimer = setInterval(spawnEnemy,spawntime);
    }
    //初始化/开始游戏 
    function init(){
        ready = false;
        clearTimers();
        initializeTimers();

        //Spawn player
        player = new Player();
        player.position.set(canvas.width/2,canvas.height-player.size);
        player.render();
        entities.push(player);

    }
    //更新的实体 
    function updateEntities(){
        entities.forEach(function(e){
            if (e.position.y > canvas.height + 20){
                if (e.name == "Enemy"){
                    enemyScore += 1;
                }
                removeEntity(e);
            }
            e.update(1/fps);
        })
    }
    //绘制背景
    function drawBG(){
        ctx.fillStyle = bgColor;
        ctx.fillRect(0,0,canvas.width,canvas.height);
    }
    //绘制成绩显示器 
    function drawScore(){
        ctx.fillStyle = "#CCFF99";
        ctx.font = "24px sans-serif";
        ctx.fillText("成绩: " + score,10,24);
        ctx.font = "16px sans-serif";
        ctx.fillText("最高成绩: " + highScore,10,48);
        var enemyScoreString = "";
        for (var i = 0; i < enemyScore; i++){
            enemyScoreString += "X";
        }
        ctx.font = "24px sans-serif";
        ctx.fillStyle = "#FF6666";
        ctx.fillText(enemyScoreString,canvas.width - 75,24);
        ctx.font = "16px sans-serif";
        ctx.fillText("难度: " + difficulty,canvas.width/2 - 50,24);
    }
    //绘制一些静态
    function drawStatic(alpha){
        var s = 15 ;
        for (var x = 0; x < canvas.width; x+=s){
            for (var y = 0; y < canvas.width; y+=s){
                var n = Math.floor(Math.random() * 60);
                ctx.fillStyle = "rgba(" + n + "," + n + "," + n + "," + (Math.random() * alpha) + ")";
                ctx.fillRect(x,y,s,s);
            }
        }
    }
    //“准备好了吗?”屏幕 
    function drawReadyScreen(){
        drawBG();
        //drawStatic(.25);
        drawScore();
        fader += .1 * 1/fps;
        ctx.fillStyle = "rgba(255,255,255," + fader + ")";
        ctx.font = "72px sans-serif";
        ctx.fillText("准备好了?",canvas.width/2 - 140,canvas.height/2);
        drawScore();
    }
    //所有实体的绘制
    function drawEntities(){
        entities.forEach(function(e){e.render();});
    }   
    //游戏结束界面
    function drawGameOver(){
        ctx.fillStyle = "rgba(0,0,0,"+fader +")";
        ctx.fillRect(0,0,canvas.width,canvas.height);
        drawStatic(fader/2);
        drawScore();
        fader += .1 * 1/fps
        ctx.fillStyle = "rgba(255,255,255," + fader + ")";
        ctx.font = "72px sans-serif";
        ctx.fillText("游戏结束",canvas.width/2 - 220,canvas.height/2);
    }   
    //Render 事件
    function render(){
        drawBG();
        drawEntities();
        drawScore();
        if (gameOver){drawGameOver(); return;}
        else if (ready){drawReadyScreen(); return;}
        updateEntities();
        gameTime += 1/fps;
        if (enemyScore >= 3) {
            clearTimers();
            gameOver = true;
            fader = 0;
        }
    }
    //返回相对于画布的鼠标位置
    function getMousePos(canvas, evt) {
        var rect = canvas.getBoundingClientRect();
        return new Vector2(evt.clientX - rect.left,
                            evt.clientY - rect.top)
    }           
    //鼠标点击
    function canvasClick(){
        if (gameOver){ if (fader > .5) reset();return;}
        if (ready)      {init(); return;}
        var bullet = new Bullet();
        bullet.position.set(player.position.x + player.size / 2 - bullet.size/2,player.position.y - player.size/2 - bullet.size /2);
        bullet.velocity.y = -30;
        entities.push(bullet);
        if (score > 0) score -= 1;
    }   
    //增加难度
    function increaseDifficulty(){
        difficulty += 1;
        if (spawntime > 20) spawntime -= 20;
        clearInterval(spawnTimer);
        spawnTimer = setInterval(spawnEnemy,spawntime);
    }   
    //改变方块颜色
    function setAlpha(color,alpha){
        if (color.indexOf('a') == -1){
            return color.replace(")",","+alpha+")").replace("rgb","rgba");
        }
    }   
    //方块的消灭
    function death(entity){
        if (entity.name == "Enemy") {
            var particleCount = Math.floor((Math.random() * 6) + 3);
            for (var i = 0; i < particleCount; i++){
                var p = new Particle();
                p.color = entity.color;
                p.size = Math.floor((Math.random() * entity.size/2) + 5);
                p.position.set(entity.position.x+entity.size/2,entity.position.y+entity.size/2);
                entities.push(p);
            }
            score += 25;
        }
        removeEntity(entity);
    }   
    //消除方块
    function removeEntity(entity){
        var idx = entities.indexOf(entity);
        if (idx > -1) entities.splice(idx,1);
    }   
    //检查两个实体是否重叠
    function overlaps(entityA,entityB){
        var sa = entityA.size;
        var x1a = entityA.position.x;
        var x2a = entityA.position.x + sa;
        var y1a = entityA.position.y;
        var y2a = entityA.position.y + sa;
        var sb = entityB.size;
        var x1b = entityB.position.x;
        var x2b = entityB.position.x + sb;
        var y1b = entityB.position.y;
        var y2b = entityB.position.y + sb;
        return (x1a < x2b && x2a > x1b && y1a < y2b && y2a > y1b);
    }   
    //滋生新的方块
    function spawnEnemy(){
        var e = new Enemy();
        var px = Math.floor((Math.random() * canvas.width));
        var py = -e.size;
        var v = difficulty;
        var a = Math.floor((Math.random() * (v + 15)) + v);
        var f = Math.floor((Math.random() * (v + 15)) + v);
        e.position.set(px,py);
        var r = Math.random();
        if (r > .5){
            straightDownMotion(e,v);
        }
        else if (r > .3){
            sineMotion(e,a,f,v);
        }
        else if (r > .1){
            triangularMotion(e,a,f,v);
        }
        else{
            sawtoothMotion(e,a,f,v);
        }
        entities.push(e);
    }   
    //直向下运动 
    function straightDownMotion(entity,speed){
        entity.update = function(deltatime){
            this.velocity.x = 0;
            this.velocity.y = speed;
            Entity.prototype.update.call(this,deltatime);
        }
    }   
    //定义正弦波运动
    function sineMotion(entity,amplitude,freq,speed){
        entity.update = function(deltatime){
            this.velocity.x = amplitude * Math.cos(this.position.y/freq);
            this.velocity.y = speed;
            Entity.prototype.update.call(this,deltatime);
        }
    }
    //定义锯波运动
    function sawtoothMotion(entity, amplitude,freq,speed){
        var modifier = 1;
        if (Math.random() > .5) modifier = -1;
        entity.update = function(deltatime){
            this.velocity.x = modifier * ((-2*amplitude)/Math.PI)*Math.atan(1/Math.tan(this.position.y / freq));
            this.velocity.y = speed;
            Entity.prototype.update.call(this,deltatime);
        }
    }
    //定义三角运动()
    function triangularMotion(entity, amplitude,freq,speed){
        entity.update = function(deltatime){
            this.velocity.x = ((2*amplitude)/Math.PI)*Math.asin(Math.sin(this.position.y / freq));
            this.velocity.y = speed;
            Entity.prototype.update.call(this,deltatime);
        }
    }   
    //定义颜色
    function randomColor(min,max){
        var r = Math.floor((Math.random() * max) + min);
        var g = Math.floor((Math.random() * max) + min);
        var b = Math.floor((Math.random() * max) + min);
        var col = "rgb(" + r + "," + g + "," + b + ")";
        return col;
    }   
    //向量
    var Vector2 = function(x1,y1){
        this.x = x1;
        this.y = y1;
    }
    Vector2.prototype.set = function(a,b){
        this.x = a;
        this.y = b;
    }   
    //实体(基类) 
    var Entity = function(){
        this.name = "Entity";
        this.size = 25;
        this.position = new Vector2(0,0);
        this.velocity = new Vector2(0,0);
        this.color = "#FFFFFF";
    }
    Entity.prototype.sayName = function(){
        console.log(this.name);
    }
    Entity.prototype.update = function(deltaTime){
        this.position.x += this.velocity.x * deltaTime;
        this.position.y += this.velocity.y * deltaTime;
        //Keep in bounds
        if (this.position.x - this.size < 0) {this.position.x = this.size;}
        if (this.position.x + this.size > canvas.width) {this.position.x = canvas.width - this.size;}
    }
    Entity.prototype.render = function(){
        ctx.fillStyle = this.color;
        ctx.fillRect(this.position.x,this.position.y,this.size,this.size);
    }   
    //敌人的单位
    var Enemy = function(){
        Entity.call(this);
        this.name = "Enemy";
        this.size = Math.floor((Math.random() * 50)+20);
        this.color = randomColor(90,150);
    }
    Enemy.prototype = Object.create(Entity.prototype);
    Enemy.prototype.constructor = Entity;
    //玩家单位
    var Player = function(){
        Entity.call(this);
        this.name = "Player";
        this.color = "#4747FF"
    }
    Player.prototype = Object.create(Entity.prototype);
    Player.prototype.constructor = Entity;
    //方块的实体 
    var Particle = function(){
        Entity.call(this);
        this.name = "Particle";
        this.size = 10;
        this.time = 0;
        this.maxTime = Math.floor((Math.random() * 10) + 3);
        this.velocity.x = Math.floor((Math.random() * 20) - 10);
        this.velocity.y = Math.floor((Math.random() * 20) - 10);
    }
    Particle.prototype = Object.create(Entity.prototype);
    Particle.prototype.constructor = Entity;
    Particle.prototype.update = function(deltatime){
        Entity.prototype.update.call(this,deltatime);
        this.time += deltatime;
        if (this.time >= this.maxTime) removeEntity(this);
    }
    //子弹的实体
    var Bullet = function(){
        Entity.call(this);
        this.name = "Bullet";
        this.size = 10;
        this.time = 0;
        this.color = "rgba(200,200,200,1)";
        this.particlesDelay = .5;
    }
    Bullet.prototype = Object.create(Entity.prototype);
    Bullet.prototype.constructor = Entity;
    Bullet.prototype.update = function(deltatime){
        Entity.prototype.update.call(this,deltatime);
        //检查碰撞
        var me = this;
        entities.forEach(function(e){
            if (e !== me && e.name != "Particle"){
                if (overlaps(me,e)){
                    death(e);
                    removeEntity(me);
                }
            }
        })
        //从游戏中删除如果外部界限
        if (this.position.y < 0) removeEntity(this);    
        //创建粒子
        this.time += deltatime;
        if (this.time >= this.particlesDelay){
            this.time = 0;
            var p = new Particle();
            p.size = Math.floor((Math.random() * 5)+2);
            p.color = setAlpha("rgb(125,125,125)",Math.random());
            //p.color = setAlpha(randomColor(100,255),Math.random()); //彩色颗粒
            p.velocity.x /=2;
            p.position.x = this.position.x + this.size /2 - p.size/2;
            p.position.y = this.position.y - p.size/2;
            entities.push(p);
        }
    }
    //HTML加载事件
    document.addEventListener('DOMContentLoaded', reset());
    canvas.addEventListener("click",canvasClick);
    //鼠标移动事件
    canvas.addEventListener('mousemove', function(evt) {
            var mousePos = getMousePos(canvas, evt);
            if (player && !gameOver) player.position.x = mousePos.x;
    }, false);

游戏截图

哈哈,这就是打灰机小游戏,也可以叫打豆豆吧=-=,这游戏很魔性哦!!

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值