<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        利用原生的JavaScript實現簡單拼圖游戲

        來源:懂視網 責編:小采 時間:2020-11-27 22:03:44
        文檔

        利用原生的JavaScript實現簡單拼圖游戲

        利用原生的JavaScript實現簡單拼圖游戲:前言 本篇主要講解,如何利用原生的 JavaScript 來實現一個簡單的拼圖小游戲。 一、游戲的基礎邏輯 想用一門語言來開發游戲,必須先了解如何使用這門語言來實現一些基礎邏輯,比如圖像的繪制、交互的處理、定時器等。 1、圖形繪制 圖形繪制是一切的基礎,
        推薦度:
        導讀利用原生的JavaScript實現簡單拼圖游戲:前言 本篇主要講解,如何利用原生的 JavaScript 來實現一個簡單的拼圖小游戲。 一、游戲的基礎邏輯 想用一門語言來開發游戲,必須先了解如何使用這門語言來實現一些基礎邏輯,比如圖像的繪制、交互的處理、定時器等。 1、圖形繪制 圖形繪制是一切的基礎,

        前言

        本篇主要講解,如何利用原生的 JavaScript

        來實現一個簡單的拼圖小游戲。

        一、游戲的基礎邏輯

        想用一門語言來開發游戲,必須先了解如何使用這門語言來實現一些基礎邏輯,比如圖像的繪制、交互的處理、定時器等。

        1、圖形繪制

        圖形繪制是一切的基礎,這里使用 JavaScript 在 canvas 上進行繪制。即先在 html 中創建 canvas 元素,然后在 JavaScript 中,通過 id 拿到這個元素,并且通過 canvas 拿到對應的上下文環境 context ,為后續的繪圖做好準備。

        <canvas id="background" width="450px" height="450px"></canvas>
        var background = document.getElementById("background");
        var context = background.getContext('2d');

        通過 context 的 drawImage 方法可以繪制圖片,這里進行了相應的封裝:

        注:這里要等圖片加載完畢后再進行繪制,即在 onload 中去調用 drawImage 方法,否則會繪制失敗。

        var drawImageItem = function(index, position) {
        var img = new Image();
        img.src = './image/dog_0' + String(index+1) + '.jpg';
        img.onload = () => {
        var rect = rectForPosition(position);
        context.drawImage(img, rect[0], rect[1], rect[2], rect[3]);
        }
        }

        在繪制圖片之后,我們還需要去動態刷新視圖,否則 canvas 就只是一張靜態的圖片。如果是簡單的圖形刷新,只需在原來的位置重新繪制,進行覆蓋即可。但有時候我們只需要將原來已存在的圖形清除掉,而不需要繪制新圖案。比如在拼圖游戲中,將一個方塊移動到另一個位置后,需要清空原來的位置。

        通過 context 的 clearRect 方法可以達到清除的目的。以下是清除 canvas 的某個區域的代碼:

        var originRect = rectForPosition(origin);
        context.clearRect(originRect[0], originRect[1], originRect[2], originRect[3]);

        2、事件處理

        有了圖形的繪制后,我們還需要處理玩家的輸入事件,然后根據輸入事件,來決定什么時候刷新視圖。輸入事件可以分為 3 種:在手機上有觸屏事件;在 PC 上,有鼠標和鍵盤事件。

        JavaScript 中對觸屏和鼠標點擊的監聽是一樣的,都是通過 canvas 的 onclick 事件進行回調,具體如下:

        // 屏幕點擊
        background.onclick = function(e) {
        };

        我們可以通過 e.offsetX 、 e.offsetY 來獲取觸控點在 canvas 中的位置。

        注: canvas 的坐標原點在左上角,即左上角的坐標是 (0, 0) 。

        鍵盤的按鍵點擊則是通過 document 的 onkeyup 、 onkeydown 等事件進行回調。 onkeyup 是指按鍵的抬起事件, onkeydown 是指按鍵的按下事件。我們可以通過 keyCode 知道當前具體是哪一個按鍵,然后根據不同的按鍵去處理不同的邏輯,如下:

        if (event.keyCode == '37') { // 左
        // do something
        } else if (event.keyCode == '38') { // 上
        // do something
        } else if (event.keyCode == '39') { // 右
        // do something
        } else if (event.keyCode == '40') { // 下
        // do something
        }

        3、定時器

        有時候,除了在玩家輸入的時候需要去刷新視圖,還需要每隔一段時間定時去刷新視圖。比如在一個貪吃蛇游戲中,就需要每隔一段時間就去刷新蛇的位置。

        這個時候我們就需要一個定時器,讓它每隔一段時間去執行一段刷新視圖的代碼。我們通過 setInterval 方法來實現定時器功能:

        setInterval("run()", 100);

        上面這段代碼表示每隔 100 毫秒,去執行一次 run 方法。

        二、拼圖的基礎邏輯

        有了游戲的基礎邏輯,下面來看一下如何實現拼圖的邏輯。

        1、生成隨機序列

        因為不是任意序列都可以通過平移的方式來還原,所以我們不能簡單地生成一個隨機序列。比如 1、0、2、3、4、5、6、7、8 這個序列,無論怎么平移,都不可能還原。

        這里采取的做法是:預先設置了 4 個可還原的序列,先從這 4 個序列中隨機選取一個,然后再對序列進行模擬平移若干步驟。以此來盡可能地保證初始序列的多樣性,也保證了序列的可還原性。具體代碼如下:

        var setupRandomPosition = function() {
        var list1 = [4, 3, 2, 8, 0, 7, 5, 6, 1];
        var list2 = [2, 0, 5, 6, 8, 7, 3, 1, 4];
        var list3 = [3, 7, 2, 4, 1, 6, 8, 0, 5];
        var list4 = [3, 2, 4, 1, 7, 6, 5, 0, 8];
        var lists = [list1, list2, list3, list4];
        
        imageIndexForPosition = lists[parseInt(Math.random() * 4)];
        
        // 獲取空位位置
        var emptyPosition = 0;
        for (var i = imageIndexForPosition.length - 1; i >= 0; i--) {
        if (imageIndexForPosition[i] == lastIndex()) {
        emptyPosition = i;
        break;
        }
        }
        background.emptyPosition = emptyPosition;
        
        // 隨機移動次數
        var times = 10;
        while (times--) {
        // 獲取隨機數,決定空位哪個位置進行移動
        var direction = parseInt(Math.random() * 4);
        
        var target = -1;
        if (direction == 0) {
        target = topOfPosition(emptyPosition); // 上
        } else if (direction == 1) {
        target = leftOfPosition(emptyPosition); // 左 
        } else if (direction == 2) {
        target = rightOfPosition(emptyPosition); // 右
        } else if (direction == 3) {
        target = bottomOfPosition(emptyPosition); // 下
        }
        if (target < 0 || target > lastIndex()) { // 位置不合法,繼續下一次循環
        continue;
        }
        var result = moveImageIfCanAtPosition(target);
        if (result >= 0) { // 如果移動成功,更新空位的位置
        emptyPosition = target;
        }
        }
        }

        2、判斷是否可以移動方塊

        在保存順序的時候,是用 0~8 這 9 個數字來保存,而空白的方塊是數字 8 的位置。所以判斷可以移動的唯一條件是,目標位置的值是否為 8。代碼如下:

        var isPositionEmpty = function(position) {
        if (position < 0 || position > lastIndex()) {
        return false;
        } 
        if (imageIndexForPosition[position] == lastIndex()) {
        return true;
        } else {
        return false;
        }
        }

        上面 lastIndex() 的值為 8。

        3、實現方塊移動

        方塊移動的實現很簡單,先將舊位置的圖形清除,然后在新的位置繪制。

        var refreshImagePositions = function(origin, target) {
        var originRect = rectForPosition(origin);
        context.clearRect(originRect[0], originRect[1], originRect[2], originRect[3]);
        drawImageItem(imageIndexForPosition[target], target);
        }

        4、檢查是否完成

        檢查圖案是否已經還原,只需要對數組進行一次遍歷,看是否有序即可。

        var checkIfFinish = function() {
        for (var index = 0; index < imageIndexForPosition.length; index++) {
        if (index != imageIndexForPosition[index]) {
        return false;
        }
        }
        return true;
        }

        5、交互事件屏蔽

        當圖案還原之后,我們不希望玩家還能通過鍵盤或鼠標來移動方塊,這個時候就需要對交互事件進行屏蔽。

        只需要一個標志位就可以達到這個目的:

        //

        屏幕點擊
        background.onclick = function(e) {
        if (isFinish) {
        return;
        }
        
        // do something
        };
        
        // 鍵盤按鈕事件
        document.onkeyup = function(event) {
        if (isFinish) {
        return;
        }
        
        // do something
        }

        當圖案還原之后,標志位 isFinish 會被置為 true ,然后在屏幕點擊和鍵盤按鈕響應事件的開始處添加判斷,如果已經結束,則不繼續走方塊移動的邏輯。

        總結

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        利用原生的JavaScript實現簡單拼圖游戲

        利用原生的JavaScript實現簡單拼圖游戲:前言 本篇主要講解,如何利用原生的 JavaScript 來實現一個簡單的拼圖小游戲。 一、游戲的基礎邏輯 想用一門語言來開發游戲,必須先了解如何使用這門語言來實現一些基礎邏輯,比如圖像的繪制、交互的處理、定時器等。 1、圖形繪制 圖形繪制是一切的基礎,
        推薦度:
        標簽: 實現 js javascript
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲成AV人片在线观看| 亚洲午夜福利精品无码| 亚洲福利一区二区三区| 一个人免费日韩不卡视频| 亚洲国产精品久久久天堂| 精品视频一区二区三区免费| 国产亚洲av人片在线观看| 精品免费久久久久国产一区| 国产亚洲成归v人片在线观看| h片在线播放免费高清| 亚洲精品乱码久久久久66| 免费无码av片在线观看| 亚洲天天做日日做天天欢毛片| 18禁成人网站免费观看| 亚洲AV无码乱码在线观看代蜜桃 | 亚洲成a人片7777| 亚欧色视频在线观看免费| 亚洲va在线va天堂va手机| 女人被男人躁的女爽免费视频| 国产精品亚洲lv粉色| 亚洲中文字幕伊人久久无码| 成人妇女免费播放久久久| 亚洲福利视频导航| 日韩免费精品视频| 美女视频黄.免费网址| 亚洲色精品vr一区二区三区| 2019中文字幕在线电影免费| 亚洲色大18成人网站WWW在线播放| 全部免费a级毛片| 国产日韩AV免费无码一区二区 | 久久亚洲一区二区| 免费v片在线观看视频网站| 亚洲国产精品无码久久久秋霞1| 日批日出水久久亚洲精品tv| 三根一起会坏掉的好痛免费三级全黄的视频在线观看 | 亚洲一区电影在线观看| 高清在线亚洲精品国产二区| 日韩在线不卡免费视频一区| 亚洲AV无码一区二区三区性色 | 亚洲经典千人经典日产| 亚洲色欲久久久综合网东京热 |