1. 程式人生 > >關於H5-canvas遊戲開發初談

關於H5-canvas遊戲開發初談

剛剛接觸H5-canvas遊戲的開發,寫一下這段時間遊戲開發的總結

基本概念:

視訊 -- 即是通過無數的靜態圖片組合起來,通過一定的頻率切換而組成的一種視覺動態效果

遊戲 -- 同樣是無數的靜態圖片的組合,但不同的是,每一幀生成的圖片都是通過遊戲內部邏輯進行生成的,如:

  玩家通過滑鼠點選一個按鈕,遊戲內部邏輯會對此事件進行處理,後生成滑鼠點選這個行為的圖片

  現如今對於遊戲的頻率,最佳的體驗是在一秒60幀,這樣的頻率,可以讓視覺和操作體驗上達到最佳

遊戲開發:

使用面向物件的開發模式,將遊戲中的每個元素設計成類和物件的關係,可以更好的開發遊戲                                                                                                                                                                                                                                 

canvas方法:

window.setTimeout(callback, 1000 / 60) -- 遊戲幀數控制,一千毫秒重新整理60次,使用setTimeout,等執行的方法結束後再計時.

isPointInPath(x,y)-- 判斷當前座標是否在當前路徑中,x,y為目標座標,(注:canvas使用beginPath()、closePath開啟路徑和關閉路徑,此方法判斷的時候是以最近的路徑作為區域判斷)

    與html直接監聽標籤的各種事件不一樣,canvas的監聽是通過此方法結合事件監聽判斷座標的方式確定當前座標是否在目標區域 

arc(圓心橫座標,圓心縱座標,半徑,起始角,結束角,方向)

 -- 畫圓弧路徑,畫圓的寫法arc(圓心橫座標,圓心縱座標,半徑,0,2*Math.PI)

rect(x, y, width, height) -- 畫矩形路徑,x,y為矩形左上角座標

moveTo(x,y) -- 指定路徑的起始座標

lineTo(x,y) -- 畫一條直線路徑,x,y為結束座標,一般以上一個lineTo的結束座標作為起始座標,可以使用moveTo指定起始座標

drawImage(img,sx,sy,swidth,sheight,x,y,width,height) -- 引進圖片並顯示在畫布指定位置上,需new一個image物件,

      var img = new Image();

      img.src="...";

      img.onload = function(){

        canvas.drawImage(img,x,y,width,height);

      }

監聽事件:

canvas.addEventListener(1,2,3)  --  監聽畫布事件,第一個引數為事件名,第二個引數為呼叫方法,第三個為指定執行時機,預設false

常用事件--

canvas.addEventListener("click", function(){},false) ;監聽滑鼠點選
canvas.addEventListener("mousemove",  function(){},false);監聽滑鼠移動
canvas.addEventListener('keydown',  function(){}, false);監聽鍵盤按鍵,需在<canvas  tabindex="0">標籤上加tabindex="0"啟動,且需聚焦canvas畫布focus()

以下是通過做好的一個小遊戲整理出來的簡單開發框架

先列出目錄結構

variable.js--放置全域性變數

main.js--主函式執行

gameClass.js--遊戲使用類

common.js--公共方法

展示簡單開發模版的程式碼

game.html:

複製程式碼
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>H5-Game</title>
    <style>
        .canvas{position:absolute;left:50%;margin-left:-480px}
    </style>
</head>
<body>
    <div>
            <canvas id="bg-canvas" class="canvas" tabindex="0" width="960" height="600" style="position:absolute"></canvas>
            <canvas id="canvas" class="canvas" tabindex="0" width="960" height="600"></canvas>
    </div>
    <script src="js/variable.js"></script>
    <script src="js/main.js"></script>
    <script src="js/common.js"></script>
    <script src="js/gameClass.js"></script>
</body>
</html>
複製程式碼

common.js

複製程式碼
function getMovePosition(ev){         //返回移動座標
    if (ev.layerX || ev.layerX == 0){   
        moveX = ev.layerX;   
        moveY = ev.layerY;   
    }else if (ev.offsetX || ev.offsetX == 0) { // Opera
        moveX = ev.offsetX;   
        moveY = ev.offsetY;
    }
}

function getClickPosition(ev){        //返回點選座標
    clickChip=1;
    if(ev.layerX || ev.layerX == 0){  
        clickX = ev.layerX;   
        clickY = ev.layerY;   
    }else if (ev.offsetX || ev.offsetX == 0) { // Opera
        clickX = ev.offsetX;   
        clickY = ev.offsetY;
    }
}

function isTrueListener(x,y){        //判斷座標是否當前位置,返回true or false
    if(ctx.isPointInPath(x,y)){
        return true;
    }else{
        return false;
    }
}

function getKeyDown(e) {            //返回滑鼠按下的鍵值
    keyDown=e.keyCode ? e.keyCode :e.which;
}

function requestAnimFrame(callback,element){        //遊戲重新整理速率
        return window.setTimeout(callback, 1000 / 60);
};

function getXMLHttpRequest(){            //返回適用當前環境request物件,資料互動
    try{
        try{
            return new ActiveXobject("Microsoft.XMLHTTP");
        }
        catch(e){
            return new ActiveXobject("Msxm12.XMLHTTP");
        }
    }
    catch(e){
        return new XMLHttpRequest();
    }
}
複製程式碼

variable.js

複製程式碼
var canvas = document.getElementById("canvas");

var ctx = canvas.getContext("2d");

var bgCanvas = document.getElementById("bg-canvas");

var bgCtx = bgCanvas.getContext("2d");

var bgImgae;

var clickX;

var clickY;

var moveX;

var moveY;

var keyDown=null;

var canvasWidth = canvas.offsetWidth;

var canvasHeight = canvas.offsetHeight;
複製程式碼

main.js

複製程式碼
document.body.onload=game;        //啟動遊戲

function game(){
    init();            //初始化元素物件
    loops();        //遊戲函式
}

function backDraw(){        //背景,靜態元素
    bgImgae = new Image();
    bgImgae.src="bg.jpg";
    bgImgae.onload = function(){
        bgCtx.drawImage(bgImgae, 0, 0);
    };
}

function init(){        //初始化
    canvas.addEventListener("click", getClickPosition,false);        //監聽滑鼠點選
    canvas.addEventListener("mousemove", getMovePosition,false);        //監聽滑鼠移動
    canvas.addEventListener('keydown', getKeyDown, false);        //監聽鍵盤
    //聚焦canvas畫布時觸發
    canvas.focus();
    
    backDraw();        //初始化靜態元素,執行一次
    
}

function loops(){        //循環遊戲動態元素
    stop = requestAnimFrame(loops);
    ctx.clearRect(0,0,960,600)
    ctx.fillStyle="rgba(0,0,0,0.4)";
    ctx.rect(0,0,canvasWidth,canvasHeight);
    ctx.fill();
}
複製程式碼

不對之處請指正

注:小瘋紙的yy

相關推薦

關於H5-canvas遊戲開發

剛剛接觸H5-canvas遊戲的開發,寫一下這段時間遊戲開發的總結 基本概念: 視訊 -- 即是通過無數的靜態圖片組合起來,通過一定的頻率切換而組成的一種視覺動態效果 遊戲 -- 同樣是無數的靜態圖片的組合,但不同的是,每一幀生成的圖片都是通過遊戲內部邏輯進行生成的,如:   玩家通過滑鼠點選一

H5鬥地主×××開發(一)

日誌服務器 登錄 serve server lds 因此 的人 意義 運營 h5鬥地主遊戲開發Q1446595067 官網:h5.haozibbs.com去年從傳統軟件公司辭職,下定決心轉互聯網,由於對遊戲的熱愛,去了一家遊戲公司,待了將近10個月,參與開發了一款動作卡牌手

微信小遊戲開發體驗

1.環境搭建 官網下載安裝nodejs設定目錄,配置環境變數 2.註冊賬號下載下微信官方工具集啟動demo體驗 3.雲開發的版本會提示報錯 雲開發版本專案配置:開啟project.config.json將以下條目正確配置   "projectname":

HTML5 canvas遊戲開發實戰 5 : 石頭剪刀布

5.1 遊戲分析       遊戲畫面 <!DOCTYPE HTML> <html> <head> <meta charset="utf-8" /> <script type="text/javascript" sr

通過遊戲學javascript系列第一節Canvas遊戲開發基礎

本節教程通過一個簡單的遊戲小例子,講解Canvas的基礎知識。 ### 最終效果: 點選移動的方塊,方塊上的分數會增加,方塊的行進方向會改變,並且方塊的速度會增加。 [線上演示](https://kamiba.gitee.io/mini-canvas-framework/bouncing-square.h

遊戲開發】淺遊戲開發中常見的設計原則

依賴關系 unity 說過 srp des log gof https 類繼承   俗話說得好:“設計模式,常讀常新~”。的確,每讀一遍設計模式都會有些新的體會和收獲。馬三不才,才讀了兩遍設計模式(還有一遍是在學校學的),屬於菜鳥級別的。這次準備把閱

H5遊戲開發技術的發展進程

android 遊戲開發 pc瀏覽器 編程語言 遊戲平臺 首先,手機上最常用的兩個瀏覽器Android Chrome和iOS Safari默認支持WebGL。隨著這一飛躍式地發展,PC瀏覽器和手機都支持硬件圖形加速,而這是Web成為可行性遊戲平臺的必要條件。同時,這也使Flash、Silv

【Unity遊戲開發】淺Unity遊戲開發中的單元測試

可靠 屬於 sin 自定義類型 允許 ogr 兩個 階段 ast 一、單元測試的定義與作用   單元測試定義:單元測試在傳統軟件開發中是非常重要的工具,它是指對軟件中的最小可測試單元進行檢查和驗證,一般情況下就是對代碼中的一個函數去進行驗證,檢查它的正確性。一個單元測試是

微信H5遊戲開發【私人定制】

聯網 分析 html5 下載安裝 現實 微軟雅黑 app 打開 images 微信H5遊戲指??的是html5標記語言編寫的超文本網頁遊戲,具有無視平臺和系統的通用性。傳統的移動端遊戲要下載安裝以後才可以使用,而H5遊戲則免去了這些步驟,滿足用戶直接在微信中打開、操作,不僅

h5遊戲構建架設h5棋牌平臺開發制作

開始 margin post menu 讓我 com 管理啟動 版本 char 還記得貪吃蛇這個經典遊戲嗎?在諾基亞時代,在黑白像素點遊戲機時代,就是這樣一個簡單的遊戲也能讓我們玩上幾個小時。 還有現在最熱門的h5棋牌平臺開發制作Q-2189563389,也都是利用H5開發

h5棋牌遊戲公眾號開發 app開發+源碼平臺搭建分享教程

和數 ip訪問 conf 設置 bcb 金花 自己 打包 服務器 h5棋牌遊戲公眾號開發 app開發+源碼平臺搭建分享教程下載diguaym.com/h5 扣扣2152876294 多合一集合遊戲 聚集了h5牛牛、金花、二杠八、十三水、三公等 全新界面UI設計(WeChat

最新h5牛牛平臺遊戲開發框架之架構

內存 cal 引用 構造 autot auto 新的 clas 線程同步 Q1446595067官網:h5.haozibbs.com或http:\\www.aqbaa.cn 現在來和大家分享下怎麽架構和實現框架來滿足棋牌遊戲需求的。 一、原型 符合棋牌項目框架,快速換皮

暴雪15年老員工遊戲開發中經常被忽略的關鍵領域

  Ben Brode在暴雪工作了15年,現已離職創立了工作室Second Dinner,過往的工作經歷使他反覆注意到一些“很重要的小事情”。   Brode將在這個月的西雅圖PAX Dev主題演講上對此進行詳細討論。這位前《爐石傳說》總設計師最近與GamesIndustry.biz分享

【原創】使用HTML5+canvas+JavaScript開發的原生中國象棋遊戲及原始碼分享

<!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title>Title</title>     <style>         

H5遊戲開發遊戲引擎入門推薦

前言很多剛剛接觸到遊戲開發,準備大展拳腳的小鮮肉們,往往在技術選型這第一關就栽了跟頭。畢竟網路上的遊戲引擎良莠不齊,官網上相關資料也比較少,而選擇一個適合的遊戲引擎是一個專案最基礎,也是很核心的一部分。試想一下,在遊戲開發進行到中後期的時候,才發現專案引入的遊戲引擎與需求相悖

H5遊戲開發程式碼總結

<span style="font-family: Arial, sans-serif; background-color: rgb(255, 255, 255);">1.移動端頁面佈局,使用相對的數值,不要使用絕對數值,推薦使用%,vw,vh,rem,em&

網頁HTML5--飛機大戰小遊戲開發--canvas的應用

一,概述 此小專案,是用來練習HTML5的canvas的程式設計運用。在這個專案中,我們需要建立一個可執行的網頁小遊戲,開發此小遊戲並不難,大概如下圖所示: 在整個遊戲的執行中,總共要分為5個狀態(state)去實現,分別是首頁(START),載入中(STARTING)

Canvas】HTML5遊戲開發的基本流程+P2.js物理引擎實戰開發

《HTML5遊戲開發的基本流程》 * 1. HTML5的簡述 * 2. HTML5遊戲開發所需的環境與工具 * 2.1. 開發環境 * 2.1.1. 瀏覽器 * 2.1.2. 開發語言 *

H5遊戲開發的架構總結(一) 客戶端

【客戶端】 1.關於遊戲引擎 在15年3月開始準備做h5遊戲的時候,首先遇到的問題就是引擎選型的問題。 當時市面上的2d引擎主要有3個:白鷺egret,layabox和cocos2d-js。 一方面,是因為我以前用cocos2d-x(c++)做了一年多的手遊客戶端,所以,很

H5遊戲開發之phaser學習筆記(一)

1、Phaser.Game(width, height, renderer, parent, state, transparent, antialias, physicsConfig) width: 遊戲的寬度,也就是用來渲染遊戲的canvas的寬度,單位為px hei