1. 程式人生 > >使用canvas繪製見縫插針小遊戲Hello_yihao的部落格

使用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