中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

利用原生JavaScript來實現拼圖小游戲的方法

發布時間:2020-08-29 14:40:17 來源:億速云 閱讀:141 作者:小新 欄目:web開發

這篇文章給大家分享的是有關利用原生JavaScript來實現拼圖小游戲的方法的內容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。

一、游戲的基礎邏輯

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

1、圖形繪制

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

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

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

注:這里要等圖片加載完畢后再進行繪制,即在 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 就只是一張靜態的圖片。如果是簡單的圖形刷新,只需在原來的位置重新繪制,進行覆蓋即可。但有時候我們只需要將原來已存在的圖形清除掉,而不需要繪制新圖案。比如在拼圖游戲中,將一個方塊移動到另一個位置后,需要清空原來的位置。

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

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

2、事件處理

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

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

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

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

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

鍵盤的按鍵點擊則是通過 documentonkeyuponkeydown 等事件進行回調。 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 ,然后在屏幕點擊和鍵盤按鈕響應事件的開始處添加判斷,如果已經結束,則不繼續走方塊移動的邏輯。

感謝各位的閱讀!關于利用原生JavaScript來實現拼圖小游戲的方法就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

运城市| 涪陵区| 亳州市| 红桥区| 泗水县| 株洲县| 开原市| 百色市| 集安市| 河池市| 武安市| 寻乌县| 乌恰县| 偏关县| 曲阜市| 齐齐哈尔市| 石渠县| 巴里| 土默特左旗| 博罗县| 曲水县| 和政县| 镇宁| 景谷| 循化| 镇平县| 屯昌县| 垦利县| 吴江市| 富蕴县| 乡城县| 临沧市| 忻城县| 铁岭县| 剑川县| 五家渠市| 耒阳市| 丹寨县| 远安县| 崇左市| 弥渡县|