日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 編程 > HTML > 正文

canvas實現俄羅斯方塊的方法示例

2024-08-26 00:21:12
字體:
來源:轉載
供稿:網友

好久沒使用canvas了,于是通過寫小游戲“俄羅斯方塊”再次熟悉下canvas,如果有一定的canvas基礎,要實現還是不難的。

原理詳解

看游戲最終界面,可知需要實現以下關鍵功能:

  • 游戲面板,也就是12 * 20的方格,以及是否填充了方塊信息;
  • 運動方塊,方塊需要實現移動,變形的功能。 
     

 canvas,俄羅斯方塊

界面的實現

整個面板就是以左上角(0,0)為原點的坐標系,右上角(12,0)左下角(0,20)右下角(12,20),每個點的坐標位置都可以確定。是否已經填充方塊,我們可以將每個方格看成一個數組元素,0表示沒有,1表示已經填充。12 * 20 的面板使用兩層數組,即用20個長度為12的數組實現。

var maps = [[0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,1,0,1,0], ...];

畫出面板的代碼,用最基礎的canvas的api就能實現

//格子    for(var i=0;i<12;i++){        for(var j=0;j<20;j++){            ctx.fillRect(i*40,j*40,40,40);            ctx.strokeRect(i*40,j*40,40,40);            if(this.maps[j][i]==1){//方格已經有填充內容                ctx.save();                ctx.lineWidth=4;                ctx.fillStyle='hsla(200,100%,50%,.5)';                ctx.strokeStyle='hsla(200,100%,50%,.9)';                ctx.fillRect(i*40,j*40,40,40);                ctx.strokeRect(i*40+2,j*40+2,38,38);                ctx.restore();            }        }    }    //邊框    ctx.lineWidth=4;    ctx.strokeStyle='hsla(0,100%,0%,.3)';    ctx.moveTo(0,0);    ctx.lineTo(0,20*40);    ctx.lineTo(12*40,20*40);    ctx.lineTo(12*40,0);    ctx.stroke();    ctx.restore();

方塊的實現

游戲中用到以下 7 種圖形

canvas,俄羅斯方塊

結合上面介紹的坐標系,數組 [x1, y1, x2, y2, x3, y3, x4, y4] 就是上面圖形中4個點坐標的數據表現形式,7 種圖形的坐標分別如下:

var Arr = [[4,0,4,1,5,1,6,1],[4,1,5,1,6,1,6,0],[4,0,5,0,5,1,6,1],[4,1,5,0,5,1,6,0],[5,0,4,1,5,1,6,1],[4,0,5,0,6,0,7,0],[5,0,6,0,5,1,6,1]];

方塊的移動,遍歷整個數組,加上位移向量就行,非常簡單

class Shape {    constructor(m){        this.m = Object.assign([],m);    }    move(x,y){ // 位移        var m = this.m,            l = m.length;        y = y||0;        for (var i=0;i<l;i=i+2){            m[i]+=x;            m[i+1]+=y;        }        return this;    }

方塊的旋轉,俄羅斯方塊里面方塊除了左右和上下運動,還會旋轉,不是嗎?稍微思考下就知道,這不過就是矩陣變換而已,也就是每次圖形繞中心點旋轉90度。我這里用數組第三個點作為圖形變換的中心點,當然這樣處理不夠完善。

class Shape {    transform(){//二維矩陣變換        var m =this.m,            l = m.length,            c = Math.ceil(l/2),            x = m[c],            y = m[c+1],            cos = Math.cos(Math.PI/180 * 90),            sin = Math.sin(Math.PI/180 * 90);        for (var i=0;i<l;i=i+2){            if(i == c) continue;            var mx = m[i]- x,                my = m[i+1] - y,                nx = mx*cos - my*sin,                ny = my*cos + mx*sin;            m[i]=x+nx;            m[i+1]=y+ny;        }        return this;        }

邊界條件

主要包括如下三個方面

  • 方塊位置不能超出界面的判斷;
  • 方塊到達底部或放置完成的判斷;
  • 游戲結束的判斷。

遍歷數組 (1)任意一個點y坐標為19時表示到達了底部;(2)獲取該坐標的y+1位置在maps的信息,如果為1表示已經填充。這兩種情況下,運動方塊的周期結束,將該方塊的坐標填充到maps對應的數組里面即可。

如果坐標的y+1已經有填充,同時當前坐標小于1,即已經在界面的頂部了,那么表示游戲結束。

var isEnd = false,isOver=false,x,y;for(var i=0,sl=that.shape.m.length;i<sl;i=i+2){    x=that.shape.m[i];    y=that.shape.m[i+1];    if(y >= 19){ // 到了底部        isEnd = true;break;    }    if(that.maps[y+1][x]==1){ // y+1位置已經填充        isEnd = true;        if(y <= 1){isOver=true;} // 游戲結束        break;    }}

方塊運動周期結束時檢測每一層是否滿格,以及滿格后的處理。某項數組全部元素都為1則表示已經滿格,那么刪除該項數組,同時列表頭再壓入一項每個元素都為0的數組即可。

checkPoint(){    var that = this,        maps = that.maps;    for(var i=0,l=maps.length;i<l;i++){        if(Math.min.apply(null,maps[i]) == 1){// 表示該層已經滿格            that.maps.splice(i,1);            that.score+=10; // 增加分數            that.maps.unshift([0,0,0,0,0,0,0,0,0,0,0,0]);        }    }    return this;}

綁定事件

主要就是綁定keydown事件,要注意的是左移和右移事件包括了邊界判斷

bindEvent(){    var that = this;    document.addEventListener('keydown',function(e){        switch(e.keyCode){            case 13:        //enter                cancelAnimationFrame(that.timer);                that.init().update();            break;            case 80:        //p                that.pause = !that.pause;                break;              case 40:        //down                that.d = 0.5;                break;            case 37:        //left                var over = false,                    maps = that.maps,                    shape = that.shape,                    m = shape.m;                for(var i=0,l=m.length;i<l;i=i+2){                    if(m[i]<=0 || maps[m[i+1]][m[i]-1] == 1){                        over = true;break;                    }                }                if(!over) shape.move(-1,0);                break;            case 39:        //right                var over = false,                    shape = that.shape,                    maps = that.maps,                    m = shape.m;                for(var i=0,l=m.length;i<l;i=i+2){                    if(m[i]>=11 || maps[m[i+1]][m[i]+1] == 1){                        over = true;break;                    }                }                if(!over) shape.move(1,0);                break;            case 32:        //space                that.shape.transform();                break;        }    },false);}

總結

這里面實現了俄羅斯方塊的最基本功能,還有關卡等功能點并沒有實現,同時該demo仍然有不完善的地方需要修正。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到HTML教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲日本欧美日韩高观看| 中文字幕在线观看网址| 黄污视频在线看| 亚洲日产av中文字幕| 精品视频999| √天堂资源中文www| 91久久中文| 91色在线看| 欧美日韩国产一级片| 中文字幕 乱码 中文乱码91| 日本视频久久久| 欧美日韩一级视频| 日韩精品三级| 亚洲大片免费看| 91精品国产91久久久久| 91精品免费观看| 日韩免费看网站| 国产日韩精品在线看| 欧美一级日韩不卡播放免费| 成年人黄国产| 国产95在线|亚洲| 国产黄色在线免费观看| 二区三区中文字幕| 91精品国产91久久久久青草| 亚洲国产综合久久| 久久99蜜桃精品久久久久小说| 欧美日韩性视频一区二区三区| 中文精品在线观看| 国产福利一区二区在线精品| av手机天堂| 欧美日韩乱国产| 在线黄色国产电影| 韩国av一区二区| 中文字幕在线亚洲| 91久久视频| 国产在线www| 精品网站999| 欧美日韩久久不卡| 精品熟女一区二区三区| 国产激情在线视频| 亚洲视频一二三四| 欧美黄页在线免费观看| 欧美一级搡bbbb搡bbbb| 色妇色综合久久夜夜| 国产激情三区| 久久永久免费视频| 国产黄色在线播放| 中文字幕一区二区三区精品| 久久久99精品久久| 日韩精品高清不卡| 国产字幕在线看| 77777_亚洲午夜久久多人| 精品亚洲永久免费| 91九色精品视频| 国产高清一区| 999精品网| 激情综合色综合久久| 国产福利在线看| 欧美国产三级| 欧美 日韩 国产 在线| 亚洲高清视频在线| 久久久99久久精品欧美| 中文字幕亚洲区| 91日韩欧美| 亚洲综合在线中文字幕| 中文字幕在线高清| 国产日韩中文字幕在线| 日韩精品在线免费看| 日韩精品综合在线| 日韩不卡在线播放| 精品久久久精品| 亚洲一区激情| 国产欧美日韩三级| 91精品国产自产| 国产不卡视频在线| 欧美日韩中文字幕| 91www成人久久| 亚洲开心激情| 精品国产31久久久久久| 亚洲成年网站在线观看| 999在线视频| 欧美日韩国产一二三| 日韩欧美一卡二卡| 亚洲 欧美 精品| 在线综合 亚洲 欧美中文字幕| 亚洲一区视频在线观看视频| 国产美女主播视频一区| 国产一二三精品| av一卡二卡| 91精品国产综合久久久蜜臀粉嫩| 日本亚洲视频在线| 日韩免费视频一区二区视频在线观看| 欧美日韩综合不卡| 欧美日韩国产999| 日韩精品一级| 精品区一区二区| 欧美日韩久久不卡| 国产成人精品亚洲| 欧美日韩在线精品成人综合网| 视频在线一区二区| 精品极品三级久久久久| 一本一道综合狠狠老| 中文字幕 欧美日韩| 欧美日韩在线视频一区| 久久精品久久精品国产大片| 欧美天堂一区二区| 欧美日韩综合在线观看| 国产在线一区二区视频| 91精品视频免费在线观看| 中文欧美日韩| 91精品久久久久久久久久| 日韩中文欧美在线| 国产高清大尺度一区二区不卡| 成人一区二区不卡免费| 日韩av不卡在线观看| 国产成人精品三级| 91国内精品在线视频| 一区二区三区高清在线| 中文字幕亚洲高清| 在线观看91精品国产入口| 在线视频观看日韩| 日韩欧美亚洲国产| 男人的天堂网av| 日韩精品视频在线观看免费| 日韩欧美综合在线| 亚洲伊人婷婷| 国产婷婷精品| 中文亚洲欧美| 亚洲欧美日本国产专区一区| 亚洲欧美伊人| 亚洲开心激情| 91精品国产综合久久精品app| 欧美日韩三级一区| 亚洲国产综合久久| 搞黄在线观看| 欧美 中文字幕| 午夜一区二区三区| 国产日韩亚洲欧美| 日韩在线视频一区二区三区| 国产三级做爰在线观看| 在线黄色国产电影| 国产在线www| 国内精品露脸在线视频播放| 91欧美在线视频| 国产99在线|亚洲| 免费高清特黄a大片| 日韩欧美在线1卡| 一区二区在线观| 在线观看av的网站| 午夜视频在线观看一区| 影音先锋一区二区资源站| 国产欧美综合视频| 色综合婷婷久久| 欧洲精品二区| 日韩一级中文字幕| 国产一区久久| 国产香蕉精品视频| 国产绿帽一区二区三区| 91亚洲国产高清| 日韩欧美在线看| 欧美在线中文字幕| 在线视频亚洲| 久草中文在线观看| 亚洲美女视频一区| 中文字幕欧美日韩在线| 欧美日韩国产三级| 天天摸日日摸狠狠添| 欧美日韩国产不卡| 日韩在线不卡一区| 欧美婷婷久久| 精品久久香蕉国产线看观看gif| 三级网站免费观看| 国产免费久久| 91精品国产91久久久久久青草| 在线视频色在线| 精品在线一区二区| 日韩国产成人| 国产黄色在线网站| 中文字幕久久av| 一区二区三区在线|网站| 欧美婷婷精品激情| 91精品在线视频观看| 欧美日韩免费精品| 国产日韩av高清| 日韩在线中文视频| 一区二区三区在线|网站| 九一精品国产| 91日韩中文字幕| 国产高清一区| 国产偷久久久精品专区| 久久久99久久| 国产黄在线看| 中文字幕精品www乱入免费视频| 日韩欧美在线视频| 男人的天堂网av| 国产欧美日韩第一页| 日韩视频精品| 日韩欧美看国产| 一区二区欧美国产| 亚洲中午字幕| 国产一区精品在线| 日韩免费电影网站| 深夜日韩欧美| 中文字幕在线中文字幕二区| 日韩精品视频在线观看网址| 亚洲国产福利| 色综合久久88色综合天天免费| 1区2区在线| 国产成人精品三级| 久久人人精品| 精品国产免费视频| 欧美日韩国产首页在线观看| 日韩亚洲不卡在线| 视频一区视频二区中文| 日韩国产欧美亚洲| 久久久精品日韩欧美| 视频一区不卡| 亚洲成人7777| 91精品在线观看入口| 国产在线不卡av| 中文字幕国产欧美| 一区二区中文字幕在线| 国产福利在线看| 精品国产免费观看一区| 在线观看一区日韩| 日韩欧美99| 亚洲综合日韩欧美| 欧美日韩高清在线| 欧美国产三级| 91精品国产色综合久久不卡蜜臀| 一区二区三区四区五区视频在线观看| 日韩免费精品| av高清一区| 91精品国产自产91精品| 在线视频不卡国产V| 日韩精品手机在线观看| 日韩精品在线播放| 成人久久在线| 天天在线视频色| 精品亚洲永久免费| 91精品在线视频观看| 亚洲女人天堂色在线7777| 亚洲羞羞网站| 色综合天天综合网天天狠天天 | 国产 日韩 欧美 综合| 日本一级一片免费视频| 久久99久久99精品中文字幕| 欧美不卡一二三| 首页国产欧美久久| 国产一级片在线| 91精品国产综合久久久久| 国产在线精品国自产拍免费| 国产乱国产乱老熟300| 欧美人妻一区二区三区| 日韩精品在线第一页| 国产美女主播视频一区| 韩国v欧美v日本v亚洲| 欧美日本精品在线| 日韩不卡一区二区| 国产拍揄自揄精品视频麻豆| 欧美一级一级性生活免费录像| 精品三级久久| www.中文字幕在线| 欧美1234区| 91精品国产乱码久久蜜臀| 国产亚洲污的网站| 精品人妻二区中文字幕| 免费看日韩精品| 一本一道久久a久久精品综合蜜臀| 中文字幕第一页在线播放| 欧洲精品二区| av首页在线| 国产羞羞视频在线播放| 国产在线黄色| 婷婷久久综合网| 亚洲一区中文字幕在线观看| 国产乱码在线| 国产91久久久久蜜臀青青天草二 | 欧美三级在线播放| 成片免费观看| 二区中文字幕| 中文字幕日韩第一页| 日本国产一区| 中文字幕日韩高清| 欧美日韩国产中文精品字幕自在自线| 91精品国产综合久久香蕉最新版| 精品亚洲综合| 国产视频一二区| 最近中文av字幕在线中文| 久久精品国产成人一区二区三区| 亚洲国产综合久久| 色综合久久88色综合天天免费| 中文字幕日韩欧美在线| 久久riav| 国产视频三级在线观看播放| 91精品国产综合久久久久久| 欧美日韩精品综合| 人成在线免费视频| 一区二区中文视频| 精品激情国产视频| 亚洲制服丝袜一区| 91av久久久| 国产嫩草影院久久久久| 精品一二三四| 国产视频中文字幕| 国产日韩精品在线观看| 中文字幕第一页在线播放| 国产123在线| 免费日韩精品中文字幕视频在线| 亚洲男女av一区二区| 被陌生人带去卫生间啪到腿软| 国产欧美自拍一区| 欧美1234区| 日韩免费看网站| 日韩.欧美.亚洲| 欧美日韩久久不卡| 久久网站免费观看| www.三级.com| 黄色国产在线| 91精品国产综合久久精品app| 中文字幕精品一区二区三区在线| 国产偷国产偷亚洲清高网站 | 欧美三级一区二区三区| 日韩欧美中文第一页| 日韩在线视频观看| 国产亚洲一区字幕| 在线国产一级| 国产激情久久久| 久久久精品日韩欧美| 欧美日韩国产黄色| 午夜精品一区二区三区免费视频| 精人妻一区二区三区| 国产在线一区二区视频| 日韩亚洲欧美中文三级| 日韩在线a电影| 久久久精品福利| 国产一区激情在线| 欧美在线日韩精品| 一区二区在线视频播放| 久久99久久久欧美国产| 91精品免费看| 亚洲欧美伊人| 中文字幕国产日韩| 国产在线高清精品| 欧美日韩国产一区中文午夜| 国产高清一级片| 黄色片免费在线| 成人精品视频一区| 欧美日韩国产页| 国产亚洲欧美色| 日本一欧美一欧美一亚洲视频| 在线视频1区2区| 韩国av一区二区| 久久综合九色欧美综合狠狠| 91精品国产经典在线观看| 国产丝袜一区| 精品视频在线视频| 97最新国自产拍视频在线完整在线看 | 中文字幕日韩国产| 国产成人精品三级| 国产卡1卡2卡三卡在线| 色综合久久88色综合天天免费| 欧美日韩国产区| 日韩视频一区| 久久麻豆视频| 欧美日韩精品区| 黄色一区二区视频| 国产无遮挡在线视频免费观看| 一本大道一区二区三区| 日韩精品免费观看视频| 欧美日本精品| av一区在线观看| 最近中文字幕在线中文高清版| 免费中文字幕日韩欧美| 黄色一区二区在线| 日韩在线中文| 日韩中文字幕在线视频观看| 日韩va亚洲va欧洲va国产| 尤物av一区二区| 中文字幕无线码一区| 国产不卡一区二区在线观看| 在线免费视频一区二区| 久久精品夜夜夜夜久久| 一区视频在线播放| 精品一二三区| 国产免费不卡av| 综合激情国产一区| 国产高清一级片| 国产一卡2卡3卡免费网站 | 日韩欧美高清在线视频| 精品免费视频| 欧洲精品在线视频| 欧美在线日韩| 精品一性一色一乱农村| 国产高清精品在线观看| 日韩一级二级三级精品视频| 国产三级视频在线| 中文字幕在线导航| 国产欧美日韩精品在线| 欧美在线日韩精品|