成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁(yè) > 知識(shí)庫(kù) > canvas實(shí)現(xiàn)俄羅斯方塊的方法示例

canvas實(shí)現(xiàn)俄羅斯方塊的方法示例

熱門(mén)標(biāo)簽:農(nóng)村住宅地圖標(biāo)注 跟電銷(xiāo)機(jī)器人做同事 鄭州電銷(xiāo)外呼系統(tǒng)違法嗎 鶴壁手機(jī)自動(dòng)外呼系統(tǒng)怎么安裝 威海營(yíng)銷(xiāo)外呼系統(tǒng)招商 ai電銷(xiāo)機(jī)器人連接網(wǎng)關(guān) 濟(jì)南辦理400電話(huà) 中紳電銷(xiāo)智能機(jī)器人 漳州人工外呼系統(tǒng)排名

好久沒(méi)使用canvas了,于是通過(guò)寫(xiě)小游戲“俄羅斯方塊”再次熟悉下canvas,如果有一定的canvas基礎(chǔ),要實(shí)現(xiàn)還是不難的。

原理詳解

看游戲最終界面,可知需要實(shí)現(xiàn)以下關(guān)鍵功能:

  • 游戲面板,也就是12 * 20的方格,以及是否填充了方塊信息;
  • 運(yùn)動(dòng)方塊,方塊需要實(shí)現(xiàn)移動(dòng),變形的功能。
     

 

界面的實(shí)現(xiàn)

整個(gè)面板就是以左上角(0,0)為原點(diǎn)的坐標(biāo)系,右上角(12,0)左下角(0,20)右下角(12,20),每個(gè)點(diǎn)的坐標(biāo)位置都可以確定。是否已經(jīng)填充方塊,我們可以將每個(gè)方格看成一個(gè)數(shù)組元素,0表示沒(méi)有,1表示已經(jīng)填充。12 * 20 的面板使用兩層數(shù)組,即用20個(gè)長(zhǎng)度為12的數(shù)組實(shí)現(xiàn)。

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], ...];

畫(huà)出面板的代碼,用最基礎(chǔ)的canvas的api就能實(shí)現(xiàn)

//格子
    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){//方格已經(jīng)有填充內(nèi)容
                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();

方塊的實(shí)現(xiàn)

游戲中用到以下 7 種圖形

結(jié)合上面介紹的坐標(biāo)系,數(shù)組 [x1, y1, x2, y2, x3, y3, x4, y4] 就是上面圖形中4個(gè)點(diǎn)坐標(biāo)的數(shù)據(jù)表現(xiàn)形式,7 種圖形的坐標(biāo)分別如下:

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]];

方塊的移動(dòng),遍歷整個(gè)數(shù)組,加上位移向量就行,非常簡(jiǎn)單

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;
    }

方塊的旋轉(zhuǎn),俄羅斯方塊里面方塊除了左右和上下運(yùn)動(dòng),還會(huì)旋轉(zhuǎn),不是嗎?稍微思考下就知道,這不過(guò)就是矩陣變換而已,也就是每次圖形繞中心點(diǎn)旋轉(zhuǎn)90度。我這里用數(shù)組第三個(gè)點(diǎn)作為圖形變換的中心點(diǎn),當(dāng)然這樣處理不夠完善。

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;    
    }

邊界條件

主要包括如下三個(gè)方面

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

遍歷數(shù)組 (1)任意一個(gè)點(diǎn)y坐標(biāo)為19時(shí)表示到達(dá)了底部;(2)獲取該坐標(biāo)的y+1位置在maps的信息,如果為1表示已經(jīng)填充。這兩種情況下,運(yùn)動(dòng)方塊的周期結(jié)束,將該方塊的坐標(biāo)填充到maps對(duì)應(yīng)的數(shù)組里面即可。

如果坐標(biāo)的y+1已經(jīng)有填充,同時(shí)當(dāng)前坐標(biāo)小于1,即已經(jīng)在界面的頂部了,那么表示游戲結(jié)束。

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位置已經(jīng)填充
        isEnd = true;
        if(y <= 1){isOver=true;} // 游戲結(jié)束
        break;
    }
}

方塊運(yùn)動(dòng)周期結(jié)束時(shí)檢測(cè)每一層是否滿(mǎn)格,以及滿(mǎn)格后的處理。某項(xiàng)數(shù)組全部元素都為1則表示已經(jīng)滿(mǎn)格,那么刪除該項(xiàng)數(shù)組,同時(shí)列表頭再壓入一項(xiàng)每個(gè)元素都為0的數(shù)組即可。

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){// 表示該層已經(jīng)滿(mǎn)格
            that.maps.splice(i,1);
            that.score+=10; // 增加分?jǐn)?shù)
            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);
}

總結(jié)

這里面實(shí)現(xiàn)了俄羅斯方塊的最基本功能,還有關(guān)卡等功能點(diǎn)并沒(méi)有實(shí)現(xiàn),同時(shí)該demo仍然有不完善的地方需要修正。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

標(biāo)簽:蘇州 咸陽(yáng) 惠州 營(yíng)口 紅河 甘南 文山 萍鄉(xiāng)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《canvas實(shí)現(xiàn)俄羅斯方塊的方法示例》,本文關(guān)鍵詞  canvas,實(shí)現(xiàn),俄羅斯,方塊,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《canvas實(shí)現(xiàn)俄羅斯方塊的方法示例》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于canvas實(shí)現(xiàn)俄羅斯方塊的方法示例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧美日韩中文视频| 日韩精品视频在线播放| 无码少妇一区二区| 日韩电影在线观看一区| 最近中文字幕在线观看| 国产欧美日韩不卡| 中文乱码字幕av网站| 日韩成人精品在线| 免费日韩电影在线观看| 欧洲精品乱码久久久久蜜桃| 欧美精品在线免费播放| 看全色黄大色黄女片18| 艳女tv在线观看国产一区| 日韩中文字幕在线观看视频| 日本大臀精品| 豆国产97在线 | 亚洲| 免费网站在线高清观看| 香蕉精品久久| 国产成人aaa| 国产精品视频最多的网站| 亚洲熟女综合色一区二区三区| 中文在线资源观看视频网站免费不卡| 日韩欧美国产三级| 最近中文字幕免费| 日韩高清在线观看| 国产精品7777777| 婷婷久久国产对白刺激五月99| 国产经典视频一区| 日韩电影网在线| 欧美一区二区三区婷婷| 欧美三级xxx| 啪啪激情综合网| 91久久精品一区二区三区| 毛片网站免费哦| 丁香婷婷综合激情五月色| 国产精品**亚洲精品| 91精品国产高清久久久久久| 亚洲天堂免费视频| 亚州av电影免费在线观看| 美美哒免费高清在线观看视频一区二区| av免费在线网站| 欧美日韩一区二区视频在线观看| 超碰在线人人爱| 在线看中文字幕| 91精品久久久久久久久99蜜臂| 毛片免费在线观看| 欧美激情一二区| 亚洲2020天天堂在线观看| 久久久久久久综合色一本| 色欲久久久天天天综合网| 久久www免费人成看片高清| 不卡一卡二卡三乱码免费网站| 欧美日韩国产欧美日美国产精品| 成在在线免费视频| 美女网站色精品尤物极品姐弟| 国产wwwwxxxx| 欧美日韩在线播放一区| 黄色三级电影网站| 日本一区二区三区精品| 国产刺激高潮av| 久久久美女艺术照精彩视频福利播放| 久久艹这里只有精品| 男女猛烈无遮挡| 午夜在线视频观看| 91伊人久久大香线蕉| 久久精品www人人爽人人| 成人免费视频app| 色男人天堂综合再现| 精品人妻一区二区三区蜜桃| 亚洲综合一二三| 性色av一区二区三区四区| 欧美日韩mv| 蜜桃视频在线观看成人| 精品一区二区三区免费毛片爱| 国产欧美欧洲在线观看| 成人精品一区二区不卡视频| 天天干,天天操,天天射| 成人免费网站观看| 久草这里只有精品视频| 久久综合给合久久狠狠色| 天天操天天碰| 成视频在线观看免费观看| 黄色精品一区二区| 国产盗摄在线视频网站| 久久无码专区国产精品s| 亚洲一区二区三区视频在线播放| 欧美日本韩国在线| 操欧美女人视频| 性生活免费网站| 精品国内自产拍在线观看视频| 欧美亚洲一区在线| 台湾十八成人网| 在线综合+亚洲+欧美中文字幕| 综合久久给合久久狠狠狠97色| 日韩欧美精品一区二区综合视频| 婷婷激情综合五月天| 精品无人乱码一区二区三区的优势| 麻豆视频免费看| 麻豆精品蜜桃| 欧美好骚综合网| 久久99国内精品| 欧美另类videosbestsex日本| 精品伦一区二区三区| 国产精品久久网| 777免费视频| 韩国成人精品a∨在线观看| 中文字幕成人av| 国产精品嫩草影院精东| 国产麻豆一区二区三区| 久久激情久久| 亚洲天天做日日做天天谢日日欢| 欧美视频免费看欧美视频| 欧美高清日韩| 久久久噜久噜久久综合| 亚洲视频一二区| 日本黄色免费视频| xfplay先锋影音夜色资源站| 男女激烈动态图| 91制片厂免费观看| 一级片免费在线| 禁果av一区二区三区| 国产亚洲女人久久久久毛片| 在线激情av| 三级黄色片网站| 波多野结衣xxxx| 国产精品久久久久9999赢消| 亚洲第一在线播放| 亚洲天堂av一区二区三区| 亚洲国产精品国自产拍av| 欧美黑人xxxx猛牲大交| 日韩欧美亚洲日产国产| 欧美日韩爆操| 国精产品乱码一区一区三区四区| 少妇献身老头系列| 国产午夜三级一区二区三| 国产视频一区二区在线观看| 在线免费观看羞羞视频一区二区| 亚洲美女在线观看| 亚洲av无码乱码在线观看性色| 波多野结衣在线电影| 国模套图日韩精品一区二区| mm131午夜| 一二三四区视频| 中文字幕无码精品亚洲35| 国产福利电影一区二区三区| 韩国精品美女www爽爽爽视频| 亚洲欧洲在线一区| 七七久久电影网| 欧美激情xxxxx| 久久久久免费观看| 欧美日韩福利电影| 国产精品美女久久久浪潮软件| 在线不卡视频| 精品乱码亚洲一区二区不卡| 欧美另类在线播放| 国内一区二区三区精品视频| 国产精品久久亚洲不卡| 亚洲欧洲国产日韩| 91美女片黄在线观| 国产乱了高清露脸对白| 中文字幕在线观看视频网站| 精品欧美乱码久久久久久1区2区| 久久99精品久久久久久水蜜桃| 国产成人精品久久亚洲高清不卡| 天美星空大象mv在线观看视频| 成人国产1314www色视频| 亚洲高清不卡在线观看| bestiality新另类大全| 日本五十路女优| 最全影音av资源中文字幕在线| 亚洲狼人国产精品| av在线播放国产| aa片在线观看视频在线播放| 在线精品视频小说1| 国产福利电影一区二区三区| av成人在线电影| 日本久久黄色| 男人天堂视频在线观看| 91成人在线视频| 91免费精品国自产拍在线不卡| www.午夜精品| 日韩视频在线观看国产| 欧美高清性xxxxhd| 国产精品老牛影院在线观看| 国产伦精品一区二区三区视频青涩| 日韩三级精品电影久久久| 精品成人av一区二区在线播放| 欧美久久亚洲| 成人丝袜视频网| 波多野结衣家庭教师| 91偷拍与自偷拍精品| 亚洲男人电影天堂| 久久久久久亚洲精品杨幂换脸| 成年大片免费视频播放二级| 91.成人天堂一区| 大片在线观看网站免费收看| 国产精品免费小视频| 亚洲精品极品| 免费在线观看国产黄| 波多野结衣理论片| www.国产在线观看| 午夜娱乐在线| 一区二区三区久久久久| 日韩免费av在线| 男女18免费网站视频| 亚洲人的天堂男人爽爽爽| 国产精品福利无圣光在线一区| 2018天天操夜夜操| 免费电影视频在线看| 人人妻人人澡人人爽精品欧美一区| 亚洲精品传媒| а√天堂中文在线资源8| 91亚洲午夜在线| 亚洲精品一区在线观看香蕉| 国产日韩1区| 国产自产在线视频| 一区二区xxx| 国产卡二和卡三的视频| 亚洲永久免费精品| 一起草av在线| 久久一级黄色片| 国产成人在线视频播放| 丁香花视频在线观看| 视频在线日韩| 奇米影视首页 狠狠色丁香婷婷久久综合| 日韩精品在线免费观看视频| 久久久久国产精品厨房| 日韩精品电影一区二区| www.就去干.com| 国产精品久久久久久五月尺| 九九热这里只有| 亚洲人a成www在线影院| 亚洲永久一区二区三区在线| 老熟妻内射精品一区| 国产日韩欧美黄色| 亚洲色无码播放| 成人h动漫免费观看网站| 亚洲av无码成人精品区| 99精品视频中文字幕| 中文字幕成人乱码在线电影| 国产精品久久久久久亚洲毛片| 国产精品500部| 亚洲国产aⅴ天堂久久| 亚洲三级在线看| 四虎国产成人永久精品免费| 中文字幕欧美激情一区| а 天堂 在线| 国产成人艳妇aa视频在线| 欧美日韩国产小视频| 性欧美videohd高精| 五月天一区二区三区| 天天色天天综合| 在线影院自拍| 欧美中文字幕一二三四区| 日韩经典一区二区| 日韩av片专区| 黄页网站在线观看| 亚洲色无码播放| 国产在线精品一区在线观看麻豆| 国产精品12| 国产精品久久人| 久久国产主播| 午夜在线a亚洲v天堂网2018| 亚洲精品一区中文字幕电影| 欧美大胆一级视频| 777a∨成人精品桃花网| 香蕉亚洲视频| 欧美视频在线观看免费网址| 99热这里只有精品2| 国产在线98福利播放视频| 国内精品久久久久久久久蜜桃| 91免费日韩| 天天干天天草天天| 天堂久久一区二区三区| 97视频国产在线| 97国产在线| 久久一区二区三| 久久精品欧美日韩| 粉嫩av一区二区三区免费野| 四虎亚洲成人| 免费看a级黄色片| av中文字幕第一页| 国产欧美精品一区aⅴ影院| 欧美国产视频| 理论片一区二区在线| 蜜桃av.网站在线观看| 中文字幕亚洲欧美日韩高清| 久久综合色8888| 精品国产综合区久久久久久| 亚洲视频三区| 黄视频在线观看网站| 51漫画成人app入口| 在线视频国产日韩| 日韩三级视频在线播放| 日本中文视频| 亚洲一区二区中文字幕| 国产精品国产三级国产aⅴ中文| 99国产欧美另类久久久精品| 一个人免费观看视频www在线播放| 美女脱光衣服与内衣内裤一区二区三区四区| 免费看毛片的网站| 亚洲一区av在线播放| 在线看黄的网站| 自拍偷拍亚洲激情| 国产第一页在线观看| 亚洲天堂av图片| 精品一区二区久久| 麻豆精品传媒视频| 嫩草国产精品入口| 欧美丰满熟妇bbbbbb百度| 亚洲图片欧美| 亚洲黄色小说网站| 成a人片在线观看www视频| 日韩二区三区| 午夜视频在线免费观看| 老司机免费视频一区二区| 91亚洲天堂| 先锋影视中文字幕| 日本学生初尝黑人巨免费视频| 黑人巨大精品欧美一区二区三区| 色黄网站在线观看| 欧美日韩四区| aa在线观看视频| 99久久夜色精品国产亚洲| 欧美日韩在线视频免费观看| 天天插天天狠天天透| 欧美成人午夜免费视在线看片| 国产精品678|