整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          使用canvas實現簡單的貪吃蛇游戲,html+css+js

          .話不多,先瞅效果:

          又在別的地方嫖到了這個效果研究了億下下,制作過程如下(超詳細):

          二.實現過程(源碼在最后):

          1.定義canvas標簽:

           <canvas id="canvas"></canvas>
          

          2.基本css樣式:

          #canvas{
                      position: absolute;
                      top: 50%;
                      left: 50%;
                      transform: translate(-50%,-50%);
                      box-shadow:  0 0 10px rgb(150, 150, 150);     
                  }
          

          position: absolute; 絕對定位。
          top: 50%;
          left: 50%;
          transform: translate(-50%,-50%); 居中。
          box-shadow: 0 0 10px rgb(150, 150, 150); 陰影。

          3.開始js部分,獲取標簽:

          var canvas = document.querySelector("#canvas");
          var ctx = canvas.getContext('2d');            
          

          4.定義基本變量:

                  //畫布寬
                  var wide=600;
                  //畫布高
                  var high=600;
                  // 變量,判斷一次渲染中只識別按鍵一次
                  var kd = 0;
                  //當前分數
                  var fraction =0;
                  //速度,就是執行定時器的時間參數
                  var speed = 250;
                  // 蛇的初始顏色 紅色
                  var yanse = `red`;
                  // 蛇數組,組成蛇的每一個方塊
                  var snake = [];
                  // 食物數組
                  var food = {};
                  // 蛇的移動方向,x軸:1為向右,-1為向左;y軸:1為向下,-1為向上 。不能斜著走,所以0為某軸無方向。
                  var diretion = {
                      x:-1,
                      y:0
                  }
                  // 給畫布寬高賦值 打算畫一個長寬都是30個20px的方塊畫布
                  canvas.width = wide;
                  canvas.height = high;
          

          5. 初始化:

          function chushi(){            
                  //蛇初始長度為3個方塊,位置如下(這個隨意)
                      for(let i =0;i<3;i++){
                          snake.push({
                              x: i+10,
                              y: 10
                          })
                      }
                      // 給食物一個隨機位置和隨機顏色
                      food = {
                          x: parseInt(Math.random()*30),
                          y: parseInt(Math.random()*30),
                          color:`rgb(${Math.random()*255},${Math.random()*255},${Math.random()*255})`
                      }
                  }
          

          6. 繪制圖形:

            // 繪制圖形
                  function draw(){
                      // 繪制顯示當前分數的文字
                      ctx.fillStyle = 'rgba(255,255,255,0.5)';
                          ctx.font="50px 仿宋";
                          ctx.textAlign = 'center'; 
                          ctx.fillText("你的分數為:"+fraction+" 分",300,300);
          
                       // 繪制方格,長寬都是30個,都是19px*19px的方格   
                      for(let i=0;i<30;i++){
                          for(let j=0;j<30;j++){
                              ctx.fillStyle = 'rgba(255, 255, 255,.3)';
                              ctx.fillRect(i*20,j*20,19,19);
                          }
                      }
                        // 繪制蛇
                      for(let i=0;i<snake.length;i++){
                          temp = snake[i];
                          ctx.fillStyle = yanse;
                          ctx.fillRect(temp.x*20,temp.y*20,19,19);
                          // 判斷蛇頭(第一個方塊)是否與身體某個方塊重合 ,就是頭撞到身體
                          if(temp.x==snake[0].x&&temp.y==snake[0].y&&i!=0){
                              // 游戲結束,重新給初始化
                              alert('游戲結束~點擊確認再來一次~'); 
                              fraction = 0;
                              snake.length=0;  
                              chushi();
                              
                          }
                      }
                         // 繪制食物,繪制一個圓形
                          ctx.beginPath();
                          ctx.fillStyle = food.color;
                          ctx.arc(food.x*20+9.5,food.y*20+9.5,7,0,Math.PI*2,false);
                          ctx.stroke();
                          ctx.fill();
                          ctx.closePath();
                
                         // 給蛇頭繪制一個字符,☆ ,好區分頭尾 ,也可省略
                          ctx.fillStyle = 'yellow';
                          ctx.font="15px 仿宋";
                          ctx.textAlign = "start";
                          ctx.fillText("☆",snake[0].x*20+2,snake[0].y*20+14.5);
                  }
          

          7.更新位置:

           //更新
                  function update(){
                      // 建一個對象head,這個為蛇的新頭,通過繪制新頭,去掉尾部實現移動效果
                      var head = {};
                      //判斷蛇頭是否遇到邊界,到邊界則在另一邊重新繪制 x軸
                      switch (snake[0].x+diretion.x){
                          case -1: head.x=29;break;
                          case 30: head.x=0;break;
                          // 沒到邊界則為當前位置加方向
                          default:  head.x = snake[0].x+diretion.x;
                      }
                     //判斷蛇頭是否遇到邊界,到邊界則在另一邊重新繪制 y軸
                      switch (snake[0].y+diretion.y){
                          case -1: head.y=29;break;
                          case 30: head.y=0;break;
                          // 沒到邊界則為當前位置加方向
                          default:  head.y = snake[0].y+diretion.y;
                      }
                      // 判斷新蛇頭是否與食物重合,就是吃到食物
                     if(head.x==food.x&&head.y==food.y){
                         //蛇的顏色為吃到食物的顏色
                      yanse = food.color;
                       // 重新給食物初始化
                      food = {
                          x: parseInt(Math.random()*30),
                          y: parseInt(Math.random()*30),
                          color:`rgb(${Math.random()*255},${Math.random()*255},${Math.random()*255})`
                      }
                      //在蛇尾添加一節
                      let temp = snake[length-1];
                      snake.push(temp);
                      fraction+=1;
                      // 吃完食物速度加快
                      if(speed>80){
                          //定時器間隔減10
                          speed = speed-10;
                          // 清除原來定時器,重新繪制
                          clearInterval(time);
                           time = setInterval(function () {
                              kd = 0;
                              ctx.clearRect(0, 0, wide, high);
                              update();
                              draw();
          
                          }, speed);
                      
                      }
                     
                     }
                      //添加新頭
                      snake.splice(0,0,head);
                      //去掉尾部
                      snake.pop();
                               
                  }
          

          8.判斷點擊鍵盤事件:

           //判斷點擊事件 
                  document.addEventListener('keydown', event=>{
                        switch (event.keyCode){
                            // 按了向上鍵
                            case 38:
                                // 判斷當前不是向下移動與還沒按過鍵,否則蛇會重疊
                                if(diretion.y!=1&&kd==0){
                                    // 重新給移動方向賦值
                                  diretion.x=0;
                                  diretion.y=-1;
                                  kd=1;
                                }
                                break;
                                // 下面以此類推一樣的原理
                            case 39:
                                if(diretion.x!=-1&&kd==0){
                                  diretion.x=1;
                                  diretion.y=0;
                                  kd=1;
                                }
                                break;
                            case 40:
                                if(diretion.y!=-1&&kd==0){                     
                                diretion.x=0;
                                diretion.y=1;
                                kd=1;
                                }
                                break; 
                            case 37:
                                if(diretion.x!=1&&kd==0){
                                  diretion.x=-1;
                                  diretion.y=0;
                                  kd=1;
                                }
                                break;        
          
                        }
                  })
          

          9.設置定時器,開始動畫:

           chushi();    
                      var time = setInterval(function(){
                      kd=0;
                      ctx.clearRect(0,0,wide,high);
                      update();
                      draw();      
                  
                  },speed);
          

          三.完整代碼:

          歡的可以收藏轉發加關注

          HTML5經歷了前期HTML快速的更新換代,以其獨有特性的優勢迅速占據了網頁開發市場鰲頭。介于目前學習和想要從事HTML5網頁開發的人越來越多。本次,給大家整理了一下基本的HTML5學習路線圖,適應于一些零基礎學習HTML5的同學借鑒。




          如果你依然在編程的世界里迷茫,不知道自己的未來規劃,可以加入web前端學習交流秋秋圈:767273102 里面可以與大神一起交流并走出迷茫。新手可免費領取學習資料,看看前輩們是如何在編程的世界里傲然前行不停更新最新的教程和學習方法(詳細的前端項目實戰教學視頻),有想學習web前端的,或是轉行,或是大學生,還有工作中想提升自己能力的,正在學習的小伙伴歡迎加入

          HTML5學習路線規劃:

          一、HTML5基礎

          HTML 快速入門、文本、圖像、鏈接、表格、列表、表單、框架;

          二、CSS3基礎

          CSS基礎語法、各種選擇器(通用選擇器、元素選擇器、id和class選擇器、后代選擇器、偽類選擇器等)、框模型與背景、文本格式化、表格、顯示與定位、瀏覽器調試

          三、HTML5高級

          HTML5 增強表單元素、HTML5驗證、HTML5新事件和新屬性、Canvas繪圖、HTML5 SVG、音頻和視頻處理、離線Web存儲與應用、HTML5 拖放、Web Socket API、Geolocation API、Web Worker API

          四、實戰技能目標

          掌握JQuery核心API,HTML5 中的繪圖、音頻視頻處理、表單新特性,輕量級WEBAPP開發。

          HTML5開發從根本上改變了開發者開發web和應用的方式,從桌面瀏覽器到移動應用,HTML5都已經成為前端開發必不可少的語言。特別是移動互聯網的爆發和微信這個超級應用對HTML5的支持,掌握HTML5語言的程序員已然成為各個互聯網公司的標配,薪資也是一路走高。

          如果你想入門HTML5,又苦于沒有好的學習方法,可以選擇一套優秀的教程來進行學習,讓自己少走彎路快速進入HTML5開發的行列。

          學習前端的伙伴可以私信回復小編“前端”領取全套免費前端學習資料和學習視頻

          天小編將分享前端開發中必學的知識點,HTML5中關于Canvas(畫布)的知識點;

          基本內容

          Canvas,是HTML5中所有新特性目前應用最廣泛的一個標簽,替代引入的圖片(圖形),用途非常廣泛如(因此這個標簽相當重要):

          1.完成HTML頁面中的圖形繪制

          2.實現網絡游戲或單機游戲(網頁游戲)

          3.在HTML頁面中繪制圖表

          4.餅狀圖

          5.柱狀圖

          6.折線圖

          7.網頁游戲

          ...

          Canvas的發展方向,目前主流的游戲開發引擎之一,如:白鷺引擎 - HTML5、Cocos-JS - HTML5、掌握物理系統、掌握精靈系統(地圖)、HTML5網頁游戲。

          需要特別注意的是:Canvas作為HTML頁面的元素出現、在Canvas繪制的圖形與HTML頁面是無關的、利用DOM定位繪制的圖形、元素的事件不能綁定繪制的圖形

          如何使用Canvas(分2步驟)

          HTML頁面部分:定義<canvas>元素、建議使用width和height屬性設置<canvas>元素的寬度和高度

          JavaScript部分:獲取HTML頁面中的<canvas>元素、通過getContext()方法創建畫布對象、該方法接收一個參數 - 創建二維或三維圖形

          需要特別注意的是該參數為字符串類型、"2d"或"3d"中的"d"必須小寫、目前幾乎都是"2d"效果、使用Canvas提供的API完成需求。

          常見的應用

          應用一:繪制圖形

          fillRect(x,y,width,height) - 繪制實心矩形

          x和y - 表示繪制矩形的左上角的坐標值(x,y)

          width - 表示繪制矩形的寬度

          height - 表示繪制矩形的高度

          strokeRect(x,y,width,height) - 繪制空心矩形

          x和y - 表示繪制矩形的左上角的坐標值(x,y)

          width - 表示繪制矩形的寬度

          height - 表示繪制矩形的高度

          clearRect(x,y,width,height) - 清除指定區域的矩形

          x和y - 表示繪制矩形的左上角的坐標值(x,y)

          width - 表示繪制矩形的寬度

          height - 表示繪制矩形的高度

          設置樣式

          fillStyle - 設置填充樣式

          strokeStyle - 設置描邊樣式

          globalAlpha - 設置透明度(0-10-100-10-1000-10-1000000-10-10000-10-10000-10-10000-10-10000-10-1000-10-100000-100-100-1)

          需要特別注意的是:先設置樣式,再繪制圖形,每改變一次樣式,都需要重新設置樣式,填充樣式與描邊樣式互不干擾

          應用二:線性漸變

          createLinearGradient(x1,y1,x2,y2)

          線性漸變具有一個基準線

          射線(扇形)漸變

          createRadialGradient(x1,y1,r1,x2,y2,r2)

          射線漸變具有兩個基準圓

          設置漸變顏色

          addColorStop(position,color)方法

          color - 顏色

          實現步驟如下:

          1.設置線性漸變或扇形漸變

          2.返回漸變對象

          3.漸變對象設置漸變的顏色

          4.設置填充或描邊樣式為漸變

          應用三:繪制文字

          設置屬性:font - 用法與CSS中的font一致

          對齊方式:

          textAlign - 水平對齊

          left - 基準線在文字的左邊

          center - 基準線在文字的中間

          right - 基準線在文字的右邊

          textBaseline - 垂直對齊

          top - 基準線在文字的上邊

          middle - 基準線在文字的中間

          bottom - 基準線在文字的下邊

          hanging - 懸掛基線

          alphabetic - 字母基線

          繪制方法

          fillText(text,x,y) - 繪制實心文字

          text - 設置繪制的文字內容

          x和y - 設置繪制文字的坐標值

          strokeText(text,x,y) - 繪制空心文字

          text - 設置繪制的文字內容

          x和y - 設置繪制文字的坐標值

          設置陰影

          shadowColor - 設置陰影顏色

          shadowOffsetX - 設置陰影水平位置

          正值 - 陰影向右移動、0 - 陰影不移動、負值 - 陰影向左移動

          shadowOffsetY - 設置陰影垂直位置

          正值 - 陰影向下移動、0 - 陰影不移動、負值 - 陰影向上移動

          shadowBlur - 設置陰影的程度

          值的類型為Number、值越大,陰影效果越明顯


          主站蜘蛛池模板: 国产激情无码一区二区| 又硬又粗又大一区二区三区视频 | 日本一道高清一区二区三区 | 国产精品成人免费一区二区| 亚洲日本一区二区| 中文字幕精品一区| 日韩经典精品无码一区| 精品国产日韩亚洲一区91| 天堂va在线高清一区| 中文字幕无线码一区2020青青| 午夜福利一区二区三区在线观看 | 国产Av一区二区精品久久| 国产精品免费大片一区二区| 午夜在线视频一区二区三区| 在线视频国产一区| 亚洲福利一区二区三区| 日本激情一区二区三区| 亚洲av一综合av一区| 久久精品中文字幕一区| 日本一区二区三区精品国产 | 亚洲综合一区二区国产精品| 日本一区免费电影| 亚洲a∨无码一区二区| 亚洲国产日韩一区高清在线| 极品尤物一区二区三区| 国产伦精品一区二区三区不卡| 精品免费国产一区二区| 国产精品美女一区二区| 久久成人国产精品一区二区| 亚洲色婷婷一区二区三区| 色窝窝无码一区二区三区| 老熟妇仑乱视频一区二区| 中文字幕精品一区二区2021年| 国产乱码精品一区二区三区 | 精品无码一区二区三区电影| 日美欧韩一区二去三区| 最美女人体内射精一区二区| 无码国产精品一区二区免费式影视| 精品国产一区二区三区久| 亚洲性日韩精品一区二区三区| 日韩视频一区二区三区|