HTML5-坦克大战一完成坦克上下左右移动的功能(一)

坦克大战一完成坦克上下左右移动的功能

<!DOCTYPE html>  
<html>  
<head>  
<meta charset="utf-8"/>  
</head>  
  
<body  onkeydown="getCommand()">  
<h1>html5-经典的坦克大战</h1>  
<canvas id="tankeMap" width="500px"  height="500px"  style="background-color:black">  
</canvas>  
<script type="text/javascript">  
    //定义一个hero类  
    //x、y表示初始坐标,direct表示方向  
    function  Hero(x,y,direct){  
        this.x=x;  
        this.y=y;  
        this.direct=direct;     
        this.speed=5;  
          
        this.moveUp=function(){  
            this.y-=this.speed;  
            this.direct=0;  
        }  
        this.moveDown=function(){  
            this.y+=this.speed;  
            this.direct=2;  
        }  
        this.moveRight=function(){  
            this.x+=this.speed;  
            this.direct=1;  
        }  
        this.moveLeft=function(){  
            this.x-=this.speed;  
            this.direct=3;  
        }  
    }  
  
    //准备工作  
    //得到画布  
    var  canvas1=document.getElementById("tankeMap");  
    //得到上下文引用对象,你可以理解成画笔  
    var cxt=canvas1.getContext("2d");  
      
    //定义一个坦克  
    //数字0表示向上 数字1表示右 数字2表示下 数字3表示左  
    var  hero=new Hero(130,30,0);  
      
    //把创建坦克的方法封装为一个对象  
    //该函数可以画自己的坦克,也可以画敌人的坦克  
    //tanke就是一个对象   
    function  drawTanke(tanke){  
        //坦克的方向  
        switch(tanke.direct){  
            case 0:  
            case 2:  
            {//
                //画出自己的坦克设置颜色  
                cxt.fillStyle="#00A6BD";  
                cxt.fillRect(tanke.x,tanke.y,5,30);//左齿轮  
                cxt.fillRect(tanke.x+15,tanke.y,5,30);//右齿轮  
                cxt.fillRect(tanke.x+6,tanke.y+5,8,20);//中间的坦克体  
                  
                //画中间的圆形的炮筒体  
                cxt.fillStyle="#00A6BD";  
                cxt.beginPath();  
                cxt.arc(tanke.x+10,tanke.y+15,4.5,0,360,false);  
                cxt.closePath();  
                cxt.fill();  
                  
                //画出炮筒  
                cxt.strokeStyle="#00A6BD";  
                //cxt.fillStyle="#FFD972";  
                cxt.lineWidth=1.9;  
                cxt.beginPath();  
                cxt.moveTo(tanke.x+10,tanke.y+15);//设置点的位置    
                if(tanke.direct==0){  
                    cxt.lineTo(tanke.x+10,tanke.y-6);//设置第二个点的位置   
                }else if(tanke.direct==2){  
                    cxt.lineTo(tanke.x+10,tanke.y+36);//设置第二个点的位置  
                }  
                cxt.closePath();      
                cxt.stroke();  
            }  
            break;  
            case 1:  
            case 3:  
            {//
                //画出自己的坦克设置颜色  
                cxt.fillStyle="#00A6BD";  
                cxt.fillRect(tanke.x,tanke.y,30,5);//左齿轮  
                cxt.fillRect(tanke.x,tanke.y+15,30,5);//右齿轮  
                cxt.fillRect(tanke.x+5,tanke.y+6,20,8);//中间的坦克体  
                  
                //画中间的圆形的炮筒体  
                cxt.fillStyle="#00A6BD";  
                cxt.beginPath();  
                cxt.arc(tanke.x+15,tanke.y+10,4.5,0,360,false);  
                cxt.closePath();  
                cxt.fill();  
                  
                //画出炮筒  
                cxt.strokeStyle="#00A6BD";  
                //cxt.fillStyle="#FFD972";  
                cxt.lineWidth=1.9;  
                cxt.beginPath();  
                cxt.moveTo(tanke.x+15,tanke.y+10);//设置点的位置    
                if(tanke.direct==1){//
                    cxt.lineTo(tanke.x+36,tanke.y+10);//设置第二个点的位置   
                }else if(tanke.direct==3){//
                    cxt.lineTo(tanke.x-6,tanke.y+10);//设置第二个点的位置   
                }  
  
                cxt.closePath();      
                cxt.stroke();  
            }  
            break;  
        }  
    }  
  
    drawTanke(hero);  
      
    function getCommand(){  
        var code=event.keyCode;  
        cxt.clearRect(0,0,500,500);  
        switch(code){  
            case 87:  
                hero.moveUp();  
                break;  
            case 68:  
                hero.moveRight();  
                break;  
            case 83:  
                hero.moveDown();   
                break;  
            case 65:  
                hero.moveLeft();  
                break;  
        }  
        cxt.clearRect(0,0,500,500);  
      
        drawTanke(hero);  
    }  
      
</script>  
</body>  
</html>  

也可以将hero的定义,和画坦克的函数抽取出来放到一个文件里面让HTML界面的逻辑更加清晰,如下

<!DOCTYPE html>  
<html>  
<head>  
<meta charset="utf-8"/>  
</head>  
  
<body  onkeydown="getCommand()">  
<h1>html5-经典的坦克大战</h1>  
<canvas id="tankeMap" width="500px"  height="500px"  style="background-color:black">  
</canvas>  
<script type="text/javascript" src="tankeGame.js"></script>  
<script type="text/javascript">  
    //准备工作  
    //得到画布  
    var  canvas1=document.getElementById("tankeMap");  
    //得到上下文引用对象,你可以理解成画笔  
    var cxt=canvas1.getContext("2d");  
      
    //定义一个坦克  
    //数字0表示向上 数字1表示右 数字2表示下 数字3表示左  
    var  hero=new Hero(130,30,0);  
  
    drawTanke(hero);  
      
    function getCommand(){  
        var code=event.keyCode;  
        cxt.clearRect(0,0,500,500);  
        switch(code){  
            case 87:  
                hero.moveUp();  
                break;  
            case 68:  
                hero.moveRight();  
                break;  
            case 83:  
                hero.moveDown();   
                break;  
            case 65:  
                hero.moveLeft();  
                break;  
        }  
        cxt.clearRect(0,0,500,500);  
      
        drawTanke(hero);  
    }  
      
</script>  
</body>  
</html>  
原文地址:https://www.cnblogs.com/xh_Blog/p/8426602.html