|
導讀網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立... 網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立在超文本基礎之上的。超級文本標記語言之所以稱為超文本標記語言,是因為文本中包含了所謂“超級鏈接”點。 本篇文章的內容是關于如何利用原生的 JavaScript來實現一個簡單的拼圖小游戲,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。一、游戲的基礎邏輯 想用一門語言來開發游戲,必須先了解如何使用這門語言來實現一些基礎邏輯,比如圖像的繪制、交互的處理、定時器等。 1、圖形繪制圖形繪制是一切的基礎,這里使用 <canvas id="background" width="450px" height="450px"></canvas> var background = document.getElementById("background");
var context = background.getContext('2d');通過 注:這里要等圖片加載完畢后再進行繪制,即在 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]);
}
}在繪制圖片之后,我們還需要去動態刷新視圖,否則 通過 var originRect = rectForPosition(origin); context.clearRect(originRect[0], originRect[1], originRect[2], originRect[3]); 2、事件處理有了圖形的繪制后,我們還需要處理玩家的輸入事件,然后根據輸入事件,來決定什么時候刷新視圖。輸入事件可以分為 3 種:在手機上有觸屏事件;在 PC 上,有鼠標和鍵盤事件。
// 屏幕點擊
background.onclick = function(e) {
};我們可以通過 注: 鍵盤的按鍵點擊則是通過 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("run()", 100);上面這段代碼表示每隔 100 毫秒,去執行一次 二、拼圖的基礎邏輯有了游戲的基礎邏輯,下面來看一下如何實現拼圖的邏輯。 1、生成隨機序列因為不是任意序列都可以通過平移的方式來還原,所以我們不能簡單地生成一個隨機序列。比如 這里采取的做法是:預先設置了 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;
}
}上面 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來實現一個簡單的拼圖小游戲的詳細內容,更多請關注php中文網其它相關文章! 網站建設是一個廣義的術語,涵蓋了許多不同的技能和學科中所使用的生產和維護的網站。 |
溫馨提示:喜歡本站的話,請收藏一下本站!