使用canvas繪製見縫插針小遊戲Hello_yihao的部落格
利用html5的canvas可以做出很多非常酷炫的效果,今天就利用canvas繪製一個見縫插針的小遊戲,遊戲效果如圖:
首先:
我們新建一個html檔案 使用canvas標籤
<canvas class="canvas" width="600" height="600px"></canvas>
畫布的大小 由個人決定 如果需要改變大小,小球的座標可能需要重新尋找。
接下來就開始寫javascript程式碼
定義接下來所需要的數值,大圓半徑,大圓的座標,連結大圓與小圓之間的線條長度,旋轉小球的半徑,關卡數,旋轉小球的陣列,等待小球的陣列,以及小球的數量和旋轉角度等;
var canvas = document.querySelector('.canvas');
var cxt = canvas.getContext('2d');
//var Rballs = parseInt(Math.random()*10+1);
//var RballWait = parseInt(Math.random()*20+1);
var arcX = 300; //大圓X
var arcY = 160;//大圓Y
var arcR = 30;//大圓半徑
var lineWidth = 100;//線條長度
var radius = 10;//小球半徑
//遊戲的等級 速度 等待小球
var LevelSpeed = [
{
"speed" : 1,//速度
"ballnum": 3,//旋轉小球
"waitNum": 5//等待小球
},
{
"speed": 1.5,
"ballnum": 3,
"waitNum": 6
},
{
"speed": 2,
"ballnum": 4,
"waitNum": 7
},
{
"speed": 2.5,
"ballnum": 4,
"waitNum": 7
}
];
var balls = []; //定義一個旋轉的小球陣列
var waitBalls = []; //等待小球的陣列
//定義關卡
var level;
if (parseInt(window.location.href.split('#')[1])) {
level = parseInt(window.location.href.split('#')[1]);
} else {
level = 0;
}
var ballNum = LevelSpeed[level].ballnum;//定義旋轉小球的數量
var waitNum = LevelSpeed[level].waitNum;//定義等待小球的數量
var rotateAngle = LevelSpeed[level].speed;//定義旋轉的角度
繪製大圓和中間的關卡數
function ballBig() {
//大圓
cxt.beginPath();
cxt.arc(arcX, arcY, arcR, 0, Math.PI * 2);
cxt.fillStyle = '#000';
cxt.fill();
cxt.closePath();
//字型
cxt.fillStyle = '#fff';
cxt.font = '30px 微軟雅黑';
if (level == LevelSpeed.length) {
level = LevelSpeed.length - 1;
}
var txt = (level + 1) + "";
cxt.fillText(txt, arcX, arcY);
}
繪製旋轉的小球
function ballRotate() {
cxt.clearRect(100, 20, 350, 280);
ballBig();
cxt.save();
cxt.translate(arcX, arcY);
balls.forEach(function (item) {
cxt.save();
cxt.rotate(Math.PI / 180 * item.angle);
item.angle += rotateAngle;
if (item.angle >= 360) item.angle = 0;
//繪製小球和線條
cxt.beginPath();
cxt.moveTo(0, -arcR);
cxt.lineTo(0, -(arcR + lineWidth));
cxt.closePath();
cxt.stroke();
cxt.beginPath();
cxt.arc(0, -(arcR + lineWidth), radius, 0, Math.PI * 2);
cxt.fillStyle = '#000';
cxt.fill();
cxt.closePath();
if (item.numStr != "") {
cxt.fillStyle = '#fff';
cxt.font = '10px 微軟雅黑';
cxt.fillText(item.numStr, 0, -(arcR + lineWidth));
}
cxt.restore();
});
cxt.restore();
window.requestAnimationFrame(ballRotate);
}
注意:在讓小球旋轉時,如果想要讓小球旋轉的更流暢,請使用
window.requestAnimationFrame();
此方法比定時函式流暢,不會出現卡頓的情況。每次旋轉開始不要忘記清空畫布。
繪製等待小球
//繪製等待小球
function ballWait() {
//清空小球的等待區域
cxt.clearRect(arcX - radius, 270, 20, 360);
waitBalls.forEach(function (item, index) {
cxt.save();
cxt.beginPath();
cxt.arc(arcX, arcY + lineWidth + arcR + radius * 3 + (radius * index * 2), radius, 0, Math.PI * 2);
cxt.fillStyle = '#000';
cxt.fill();
cxt.fillStyle = '#fff';
cxt.font = '10px 微軟雅黑';
cxt.fillText(item.numStr, arcX, arcY + lineWidth + radius * 3 + arcR + (radius * index * 2));
cxt.closePath();
cxt.restore();
})
}
當一切準備就緒時,我們最後需要的就是,通過點選畫布,來讓等待中的小球插入到旋轉中的小球中去,從而來實現我們的遊戲。
canvas.onclick = function () {
//刪除等待小球,並且把刪除的小球插入到轉動小球的末尾處
var obj = waitBalls.shift();
if (waitBalls.length != 0) {
//更改小球的角度
obj.angle = 180;
//判斷小球之間是否碰撞
for (var i = 0; i < balls.length; i++) {
if (balls[i].angle >= 171 && balls[i].angle <= 189) {
alert('遊戲失敗');
window.location.href = "index.html#" + level;
}
}
balls.push(obj);
} else if (waitBalls.length == 0) {
alert('闖關成功!');
level++;
window.location.href = "index.html#" + level;
}
ballWait();
};
這裡主要用到了陣列的兩個方法:shift();和 push();
完整的程式碼請到GitHub上取:
使用canvas繪製見縫插針小遊戲
裡面寫好了遊戲的開始和結束。
如遊戲有不足之處請自行修改。
相關推薦
使用canvas繪製見縫插針小遊戲Hello_yihao的部落格
利用html5的canvas可以做出很多非常酷炫的效果,今天就利用canvas繪製一個見縫插針的小遊戲,遊戲效果如圖: 首先: 我們新建一個html檔案 使用canvas標籤 <canvas class="canvas" width=
android 開發 View _12_ 用Canvas 繪製一張圖片(部落格中演示用Canvas畫驗證碼圖片)
package net.yt.yuncare.widgets; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import and
【走在遊戲開發道路上的青年 —— BlueCoder(黎小華)的部落格】湛是清澈的水底 , 藍是美麗的天空 , 這也是我所喜歡的程式碼風格
首先對支援我部落格的朋友說一聲:抱歉。由於BlueCoder目前面臨讀研,還有很多計算機基礎知識需要強化,因此目前已經沒什麼時間續寫部落格了~最後,希望還在遊戲領域奮鬥的你,繼續加油,相信自己可以做的更好! --2015/3/15
黃金點遊戲總結部落格
黃金點遊戲作業要求: 作業要求 專案原始碼的github地址: 原始碼 2. 不適用,因為這個專案我們的實現比較簡單,我們本身並沒有用PSP記錄時間。 3. 設計了Data類用於formalize獲取到的隊伍資料,用Policy類包含所有用到的方法。用getNumbers作為輸入介面呼叫這兩個模組。
程式設計小白的部落格日記
程式設計小白的部落格日記 2018—11—8 星期四 晴 大學開學有一段時間了,從暑假自學c語言,到現在為止,感覺大學生活似乎沒有想象中那麼精彩,因此想要每天堅持寫日記, 在這裡記錄下自己每天關於程式設計相關知識學習的經歷,記錄自己的成長之路。 從昨天開始自學python,感覺p
Unity製作“見縫插針”小遊戲
控制小球旋轉 using System.Collections; using System.Collections.Generic; using UnityEngine; public class RotateSelf : MonoBehaviour {
【追夢小樂的部落格】android工作開發經驗集_android基礎知識學習筆記集_反編譯教程收集
讀《瘋狂Android講義 第三版》筆記 本欄目會收集閱讀《瘋狂Android講義 》 的一些筆記,俗話說:好記性不如爛筆頭!更何況是我這種剛進入android程式設計界的初級小白,我要不斷堅持寫筆記,向中高階進軍
利用js寫的見縫插針小遊戲(推薦給新手)
標題之所以寫推薦給新手,是因為我也是個剛學js一週的新人,想練練手,於是就花了一下午寫了這個遊戲,所以我寫的可能更適合新手,大神勿噴。 這個遊戲是利用原生的js以及html5的canvas技術做的一個小遊戲,遊戲規則跟手機上的見縫插針一樣的,這是我的遊戲介面:
【愛學習的小蝸牛的部落格】愛學習的小蝸牛
My Moto I believe that life is a greedy law, and every step is the best choice at present, and may not get the best results, but th
小q的部落格開通啦
大家好,這裡是quailty,一隻ACMer,24K純蒟蒻,大學前沒接觸過程式設計。大概是從好幾個月前就打算開一個部落格了,中間偶爾想起來然而又馬上忘掉,不過終於還是下定決心開了這個部落格。開這個部落格也沒有什麼目的的樣子,總之會定期不更新一些題解,分享一些學習心得體會,說
Cxihu田樹東的遊戲開發部落格
幀同步在網上可以搜的資料比較少,關於遊戲的更是沒有,不過,實現的原理也比較簡單,最近幾天就寫了份關於幀同步的文件,當作給同事掃掃盲,順便也在這裡發發,可以給其他人蔘考參考 --競技類網路遊戲設計方案 一、 前言 幀同步,根據wiki百科的定義是,一種對同步源進行畫素級同步顯示的處理
HTML5 Canvas 射擊類小遊戲 平滑的移動 思路
這篇部落格主要講了如何處理HTML5 Canvas 遊戲中的角色移動問題。 筆者這幾天做了一個 HTML5 Canvas 的射擊類小遊戲,嗯,名字叫做《DroppingBalls》,大概就是自己控制一個坦克在介面的最下面左右移動,然後上面會有怪向下移動,我們必須
Vue、Nuxt服務端渲染,NodeJS全棧專案,面試小白的部落格系統~~
![](https://user-gold-cdn.xitu.io/2020/7/1/1730b15676ec8c32?w=1920&h=1080&f=jpeg&s=181162) Holle,大家好,我是李白!! 一時興起的開源專案,到這兒就告一段落了。 這是一個入門全棧之路的小專案,從設計、
見縫插針 一個canvas小遊戲
var canvas=document.querySelector("#canvas"); var ctx=canvas.getContext("2d"); var centerX = 400;//大圓X軸座標 var centerY = 200;//大圓Y軸座標 var bigRadius = 50;//
CSS3實現五子棋Web小遊戲,Canvas畫布和DOM兩種實現,並且具有悔棋和撤銷悔棋功能。
posit oct padding 角色 sar pac osi fse ech 用Canvas實現五子棋的思路: 1、點擊棋盤,獲取坐標x,y,計算出棋子的二維數組坐標i和j, 2、棋子的實現,先arc一個圓,再填充漸變色。 3、下完一步棋後切換畫筆和角色。 4、贏法算法
推箱子小遊戲《格魯的實驗室》13關 - bfs最短路徑
rst ace clu end 路徑 我們 prior top other 下載了一款推箱子小遊戲,第13關的時候怎麽也破不了最佳紀錄(最少步數是9而我們最好的方案是10步),因為數據比較小(6*8的方陣),所以寫了個BFS來找最短路。 遊戲的目標是把小黃人推到黃色球,小綠
💒 es6 + canvas 開源 蓋樓小遊戲 完整代碼註釋 從零教你做遊戲(一)
lock 基於 時間 git cor 默認 掃描 lin tga 蓋樓遊戲 一個基於 Canvas 的蓋樓遊戲 Demo 預覽 在線預覽地址 (Demo Link) 手機設備可以掃描下方二維碼 github https://github.com/bmqb/to
一個簡單的canvas射擊小遊戲
本人初學前端技術,在HTML5的背景下,逐漸感受到前端技術的越來越強大與完善。web開發者已經不再是簡簡單單的製作網頁name簡單了。 近日看見網路上許多H5小遊戲,非常感興趣,於是臨時抱佛腳,學習了有關canvas的知識,製作了一個小遊戲。 大家儲存圖片,複製程式碼就可以
使用Hexo搭建個人部落格,極速高效簡潔,新手小白可操作
目錄 只需要兩步 第一步程式碼部分: 第二部分放置程式碼 https://www.cnblogs.com/blogjun/articles/8289977.html 詳細操作可參考上文 這裡說一下大概的原理吧(純屬個人觀點,如有疑問請評論回去,接懟) 只需要兩步
小碼農的第一篇部落格--Java web ServletConfig物件
Java Web ServletConfig物件 ServletConfig物件 演示案例1 關於Servletconfig物件 XML配置資訊 程式碼實現 ServletConf