1. 程式人生 > >Phaserjs基礎教程第二節:載入圖片、文字和動畫

Phaserjs基礎教程第二節:載入圖片、文字和動畫

遊戲場景的建立是遊戲開發的基礎,而遊戲場景又是由各種圖片、模型、文字等構成的,我們本節就來學習怎麼載入資源到遊戲場景中。

       一、載入圖片:

首先,我們載入一張簡單的圖片,程式碼如下:

var game = newPhaser.Game(800, 600, Phaser.AUTO, 'phaser-example', { preload: preload,create: create});
function preload() {
    //  給路徑所在位置的圖片定義一個唯一的關鍵字,這個關鍵字在所有的圖片中必須是唯一的。
    game.load.image('imageKey','assets/sprites/phaser2.png');
}

function create() {
       //引數:x座標,y座標,圖片關鍵字
    game.add.sprite(0, 0, 'imageKey');
}

這段程式碼中,我們只使用了preload和create兩個方法,因為我們只是載入了圖片和建立場景,並沒有進行其他操作,所以並沒有定義其他狀態。

       這裡,我們需要了解下sprite的概念,sprite的翻譯是精靈,它在phaser中是一個物件,具體來講,它是一個具有結構(紋理)、可以執行動畫、支援輸入事件和物理學的遊戲物件。所以,我們一般講會進行操作的圖片和動畫物件等都定義成sprite物件。

       在上面的例子中,因為我們沒有設定背景,所以自動填充為黑色,下面我們新增一張背景圖片:

var game = newPhaser.Game(800, 600, Phaser.AUTO, 'phaser-example', { preload: preload,create: create});
function preload() {
    //  給路徑所在位置的圖片定義一個唯一的關鍵字,這個關鍵字在所有的圖片中必須是唯一的。
    game.load.image('space','assets/pics/thalion-rain.png');
}
function create() {
var bg = game.add.tileSprite(0, 0, 800, 600, 'space');
//var bg = game.add.sprite(0, 0, 'space');
}

因為背景圖片需要填充整個遊戲區域,而sprite物件並不支援填充區域的寬高,所以我們選擇了tileSprite物件,tileSprite物件可以對圖片進行裁剪或平鋪填充設定區域,你可以切換註釋行嘗試下新增兩種物件的不同。

當然,你也可以直接填充一個顏色作為背景色:

function create() {
       //注意,這裡的顏色只支援16進位制的數字或者字串
    game.stage.backgroundColor = 0xfff00;
//  game.stage.backgroundColor = '#ff0000';
}

二、載入文字

       如果只是單純的在遊戲中顯示文字的話,很簡單,檢視程式碼:

var game = newPhaser.Game(800, 600, Phaser.CANVAS, 'phaser-example', { create: create });

//設定文字樣式:大小、字型、顏色、排列方向
var textStyle= { font: "48px Arial", fill: "#ff0044", align:"center" };
functioncreate() {
       //game.world.centerX:檢視中心的x座標
       //game.world.centerY:檢視中心的y座標
    var text =game.add.text(game.world.centerX, game.world.centerY, "你好,歡迎來到Phaser的世界", textStyle);
    //錨點設定
text.anchor.set(0.5, 0.5);
//text.scale.setTo(0.5);
//text.angle = 90;
//text.alpha = 0.5;
}

這裡要介紹幾個基礎且常用的屬性:anchor、scale、angle、alpha。

anchor(錨點):取值範圍0~1,其實就是,元素(圖片、文字等)中心與放置位置(新增到的座標)相對於自身長寬的一個比例,比如(0,0)表示元素左上角座標和放置位置座標重合,(1,1)表示元素右下角座標和放置位置座標重合,(0.5,0.5)表示元素中心和放置位置重合,其他則根據元素長寬比例來設定。

scale(縮放比例):相對於元素原始尺寸的比例。

angle(角度):一個有效的數字,一般取值0~360.

alpha(透明度):也就是rgba中的a,取值範圍0~1.

       可是遊戲嘛,很多時候都常常使用一些類似於藝術字之類的炫酷字型,那就沒辦法用textStyle設定文字樣式了,這個時候,我們就需要藉助一個叫做BitmapText(點陣圖文字,如果不知道什麼叫點陣圖的話,可以百度一下概念),使用BitmapText物件,我們不僅可以自定義字型,還可以定義角度、透明度、顏色等屬性,先來看一個簡單的例子:

var game = newPhaser.Game(800, 600, Phaser.CANVAS, 'phaser-example', { preload: preload,create: create, render: render });

function preload() {
       //載入點陣圖字型圖片和配置檔案
       //bitmapFont(key, textureURL, atlasURL,atlasData, xSpacing, ySpacing)
       //引數:關鍵字,紋理圖片路徑,配置檔案(xml或json格式,如果不帶字尾,預設解析成xml格式),atlasData,字元間距,行間距
       //atlasData:暫時沒有用到,根據api翻譯的理解,應該是如果配置檔案有多層的話,這裡可以選擇其中的一層
    game.load.bitmapFont('desyrel','assets/fonts/bitmapFonts/desyrel.png', 'assets/fonts/bitmapFonts/desyrel.xml');
}
 
var line1;
var line2;
function create() {
       //順便檢視下anchor、tint、scale、alpha效果
    var text1 = game.add.bitmapText(400, 70,'desyrel', 'Anchor.x = 0', 64);
    var text2 = game.add.bitmapText(400, 270,'desyrel', 'Anchor.x = 0.5', 64);
    text2.anchor.x = 0.5;
    var text3 = game.add.bitmapText(400, 470,'desyrel', 'Anchor.x = 1', 64);
    text3.anchor.x = 1;
    //設定文字顏色
    text3.tint = 0xFF0000;
    text3.scale.set(0.8);
    text3.alpha = 0.5;
       //新增兩條中心線
    line1 = new Phaser.Line(400, 0, 400, 600);
    line2 = new Phaser.Line(0, 300, 800, 300);
} 
function render() {
       //顯示中心線
    game.debug.geom(line1);
    game.debug.geom(line2);
}

下面是使用到的圖片:

       如果紋理圖片被整合到其他圖片中,和另外的圖片合成了一張新圖片,照樣也可以設定點陣圖字型(不過此方法為2.7版本新增方法,2.6以下不支援):

var game = newPhaser.Game(800, 600, Phaser.AUTO, 'phaser-example', { preload: preload,create: create });
function preload() {
    //  載入紋理圖片和圖片地圖集資料
    game.load.atlas('atlas','assets/sprites/atlas-mixed.png', 'assets/sprites/atlas-mixed.json');
    //  載入點陣圖字型配置檔案
    game.load.xml('fontData','assets/fonts/bitmapFonts/desyrel.xml');
}
var bmpText;
functioncreate() {
       // addBitmapFontFromAtlas方法為2.7版本新增的
       //引數:定義字型的關鍵字,圖片資源關鍵字,圖片中字型部分的關鍵字,字型配置檔案,配置檔案格式,字元間隔,行間距
    game.cache.addBitmapFontFromAtlas('myFont','atlas', 'desyrel', 'fontData', 'xml', 0, 0);
    // 新增點陣圖字型:x,y,字型關鍵字,文字,字型大小
    bmpText = game.add.bitmapText(0, 100,'myFont', 'A Bitmap Font\nfrom a Texture Atlas', 64);
    bmpText.align = 'center';
    bmpText.centerX = 400;

    //  還可以新增同一張圖片的其他元素:一個綠球
    var ball = game.add.sprite(20, 100,'atlas', 'wizball');
}

       其實還有一種簡單的匯入文字資源的方式,只需要載入一張圖片就行了,不過在這張圖片中,每個字元或者空格都要佔有相同大小的位置,還要定義好文字的位置,這樣才可以使用,檢視下面示例:

這是Phaser.RetroFont已經定義好的字元:

要使用的圖片如下:

程式碼如下:

var game = new Phaser.Game(800, 600, Phaser.AUTO, 'phaser-example', { preload: preload,create: create, update: update });
function preload() {
    game.load.image('goldFont','assets/fonts/retroFonts/gold_font.png');
    game.load.image('bluePink','assets/fonts/retroFonts/bluepink_font.png');
}
var font1;
var font2;
var image1;
var image2;
function create() {
       console.log(Phaser);
       //字首,空格對應空格
    font1 = game.add.retroFont('goldFont', 16,16, "!     :() ,?." +Phaser.RetroFont.TEXT_SET10, 20, 0, 0);
    font1.text = "phaser brings you retrostyle bitmap fonts";
    image1 = game.add.image(game.world.centerX,48, font1);
    image1.anchor.set(0.5);
font2 = game.add.retroFont('bluePink', 32,32, Phaser.RetroFont.TEXT_SET2, 10);
font2.setText("phaser 2\nin thehouse", true, 0, 8, Phaser.RetroFont.ALIGN_CENTER);
image2 = game.add.image(game.world.centerX,220, font2);
    image2.anchor.set(0.5);

       //每兩秒鐘隨機變換一次顏色
    game.time.events.loop(Phaser.Timer.SECOND *2, change, this);
}

function change(){
       //程式碼的作用是生成一個類似0xXXXXXX這樣的16進位制數字
    image2.tint = Math.random() * 0xFFFFFF;
}
function update() {
       //game.time.physicsElapsed = 1/60
       image2.rotation += (2 *game.time.physicsElapsed);
}

       這個時候,你可以想象一下如果遊戲中的提示全部用中文特效來做,你要做多少個字的特效?

三、載入動畫

大家都知道,動畫其實就是由一幀一幀的圖片組成的,所以動畫的本質就是讓一系列的圖片按照順序以特定的時間間隔顯示出來。Phaser也一樣,它的動畫實際上就是載入了一張(或幾張)png圖片,然後按照固定的寬高擷取圖片中相應位置的內容作為動畫的一幀,按照規定的順序逐一顯示,形成動畫。說起來有點繞口,下面還是直接看例子吧:

1.載入順序、固定位置動畫:

先來看個示例:

var game = new Phaser.Game(800, 600, Phaser.CANVAS, 'phaser-example', { preload: preload,create: create });

function preload() {
       //39X40是每個畫面的尺寸
    game.load.spritesheet('mummy', 'assets/sprites/metalslug_monster39x40.png',39, 40);
} 
function create() {
       //將sprite新增到場景中
    var mummy = game.add.sprite(300, 200,'mummy');
//因為圖片太小,放大為原來的兩倍顯示
mummy.scale.set(2); 
    //新增一個名叫walk的動畫
    //因為我們沒有設定其他引數,所以它會執行mummy中所有的frame
    var walk = mummy.animations.add('walk');
    //開始動畫,每秒30幀,迴圈執行
    mummy.animations.play('walk', 30, true);
}

上面的示例中,要載入的圖片如下:


這張圖片一共有16個畫面,圖片大小156*160px,每個畫面都佔用了39*40px,按照順序顯示,就形成了上面的動畫;可是如果畫面數量不是16個呢,如果圖片中有額外的空白呢?那麼把程式碼修改下吧:

var game = new Phaser.Game(800, 600, Phaser.CANVAS, 'phaser-example', { preload: preload,create: create }); 
function preload() {
       //37X45是每個frame的尺寸,畫面並沒有佔滿全部圖片,所以新增一個引數:顯示畫面的數量
    game.load.spritesheet('mummy','assets/sprites/metalslug_mummy37x45.png', 37, 45, 18); 
} 
function create() {
       //將sprite新增到場景中
    var mummy = game.add.sprite(300, 200,'mummy');
    mummy.scale.set(2); 
    //新增一個名叫walk的動畫
    //因為我們沒有設定其他引數,所以它會執行mummy中所有的frame
    var walk = mummy.animations.add('walk');
    //開始動畫,每秒30幀,迴圈執行
    mummy.animations.play('walk', 30, true);
}

這個例子中,載入的圖片如下:

這張圖片中,所有的畫面同樣是固定寬高,同樣是按順序排列,可是並沒有填滿整個圖片,因此就需要顯示一下動畫中畫面的數量。

如果你的圖片中所有畫面並沒有緊挨,而是有著固定的間距,那麼你就需要在最後再新增兩個引數,margin和spacing,分別表示垂直和水平的間距(我並沒有找到合適的圖片,所以這裡不提供程式碼了)。 

2.載入無序、隨機位置動畫:

事實上,我們也不能保證製作的png圖片中每個畫面都有固定的長度和寬度(就算可以實現,也要花費設計人員很多的時間,畢竟是要按畫素調整的)。比如下面這張圖片,展示了一個機器人奔跑的動畫:

 

這個時候,我們可以使用atlasJSONHash函式來載入這張圖片和配合它使用的json檔案,程式碼如下:

var game = newPhaser.Game(800, 600, Phaser.AUTO, 'phaser-example', { preload: preload,create: create }); 

function preload() {
    game.load.atlasJSONHash('bot','assets/sprites/running_bot.png', 'assets/sprites/running_bot.json');
} 
function create() {
var bot = game.add.sprite(200, 200, 'bot'); // 定義一個名為run的動畫 // 雖然我們沒有規定任何畫面,但是json檔案裡面已經定義好了 bot.animations.add('run'); // 執行動畫run,幀數15,迴圈播放 bot.animations.play('run', 15, true); }

這樣動畫就可以播放了。

那麼問題又來了,我們怎麼生成一個和png圖片匹配的json的檔案呢?開啟上面的json檔案,你可以看到它是有固定的格式的,整個物件中包含了frames和meta兩個屬性,frames固定了所有畫面截圖位置和順序,meta屬性則顯示了製作工具的地址和圖片名稱等資訊。所以,其實json檔案是可以通過工具生成的。

  OK,這一節就就到這裡,下一節來講一些簡單的互動操作。

上面的示例中,要載入的圖片如下:
這張圖片一共有16個畫面,圖片大小156*160px,每個畫面都佔用了39*40px,按照順序顯示,就形成了上面的動畫;

可是如果畫面數量不是16個呢,如果圖片中有額外的空白呢?那麼把程式碼修改下吧:

相關推薦

Phaserjs基礎教程第二載入圖片文字動畫

遊戲場景的建立是遊戲開發的基礎,而遊戲場景又是由各種圖片、模型、文字等構成的,我們本節就來學習怎麼載入資源到遊戲場景中。       一、載入圖片:首先,我們載入一張簡單的圖片,程式碼如下:var game = newPhaser.Game(800, 600, Phaser.

問題2css圖片文字居中

1. 文字或圖片水平對齊:父元素中新增以下樣式     text-align : center;2. 單行文字垂直對齊:父元素中新增以下樣式     line-height : 父元素高度; 3.圖片水平及垂直居中方法一:    利用

Phaserjs基礎教程第七TimeTimer物件

大家都是程式設計師,Time和Timer之間的不同肯定是知道的,不過我還是要再重複一遍,在Phaserjs中,Time(Phaser.Time)是時間物件,而Timer(Phaser.Timer)則是定時器物件。       在Phaserjs中,Time物件雖然都是用來表示

Android零基礎入門第49AdapterViewFlipper圖片輪播

討論 表格 微信 列表 自動播放 clas padding spa absolute 上一期學習了ExpandableListView的使用,你已經掌握了嗎?本期開始學習AdapterViewFilpper的使用。 一、認識AdapterViewFilp

手動安裝K8s 1.10 第二基礎環境+CA證書

docekr kubernetes 容器 1、安裝Dockeryum install docker-ce -y 2、準備相關軟件上傳k8s-v1.10.1-manual.zip到/usr/local/src[root@k8smaster src]# lltotal 1178908-rw-r--r-

JVM基礎系列教程|第二Java記憶體模型

推薦視訊連結 所有的Java開發人員可能會遇到這樣的困惑?我該為堆記憶體設定多大空間呢?OutOfMemoryError的異常到底涉及到執行時資料的哪塊區域?該怎麼解決呢?其實如果你經常解決伺服器效能問題,那麼這些問題就會變的非常常見,瞭解JVM記憶體也是為了

DirectX11入門教程——第二DirectX11的基礎知識

本系列系作者原創,可隨便轉發但一定要註明出處 剛才明明說盡量不跳章的,為啥一進來就變成第二章,這裡首先用幾句話說明一下原因:因為第一章我想留給更基礎更概念的GPU發展史和管線描述。在此對不起大家了。不過我保證這個系列初步成型後絕對不跳章 2010年5月微軟釋出了Direct

《C# GDI+ 破境之道》第一境 GDI+基礎 —— 第二畫矩形

有了上一節畫線的基礎,畫矩形的各種邊線就特別好理解了,所以,本節在矩形邊線上,就不做過多的講解了,關注一下畫“隨機矩形”的具體實現就好。與畫線相比較,畫矩形稍微複雜的一點就是在於它多了很多填充的樣式。接下來,我們就來細細品味一番。 同樣,一個窗體專案,窗體的佈局風格與上一節的保持一致: 1 namesp

Android零基礎入門第57日期選擇器DatePicker時間選擇器TimePicker

oncreate ted show imageview bce min date 教程 運行程序 在實際開發中,經常會遇見一些時間選擇器、日期選擇器、數字選擇器等需求,那麽從本期開始來學習Android中常用選擇器,今天學習的是DatePicker和TimePicke

讀書筆記--《Python基礎教程第二版》-- 第五章 條件循環其他語句

ja5.1 print和import的更多信息5.1.1 使用獨號輸出>>> print ‘Age:‘,42Age: 42>>> 1,2,3(1, 2, 3)>>> print 1,2,31 2 3>>> print (1,2,3)(1,

讀書筆記--《Python基礎教程第二版》--第六章 抽象

ja6.1 懶惰即美德>>> fibs=[0,1]>>> for i in range(8):... fibs.append(fibs[-2]+fibs[-1])... >>> fibs[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]6

HTML學習筆記基礎表格 第二 (原創)

utf 空心圓 無序列表 har ble 學習 oot order 有序 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title

讀書筆記--《Python基礎教程第二版》--第七章 更加抽象

ja7.1 對象的魔力 多態 不同的類的對象使用同樣的操作 封裝 繼承7.1.1 多態 1、多態和方法 >>>object.getPrice() >>> ‘abc‘.count(‘a‘)1>>> [1,2,‘a‘].count(‘a‘)1>&

讀書筆記--《Python基礎教程第二版》--第十一章 文件素材

ja第十一章 文件和素材11.1 打開文件 open函數用來打開文件,語法如下: open(name[,mode[,buffering]]) f = open(r‘/home/python/somefile.txt‘)11.1.1 文件模式r 讀模式w 寫模式a 追加模式b 二進制模式(可添加到其他的模式

OpenGL第二繪制多個顏色四邊形

unsigned main.c 頂點 date() splay 二維 ltr width orm MyOpengGL.h://和前一節一樣。 MyUtil.h://添加 const int COLOR_MODE_CYAN = 0;//定義兩個顏色選擇const int

Python基礎教程筆記二運算符

.com 筆記 false 一個 二進制格式 UNC style AR 語言 Python算術運算符 實例: a = 21 b = 10 c = 0 c = a + b print(c) #31 c = a - b print(c)

Python基礎教程筆記十三元組

元素 traceback pre call 但我 使用下標 列表 class 不同之處 Python 元組 Python的元組與列表類似,不同之處在於元組的元素不能修改。 元組使用小括號,列表使用方括號。 元組創建很簡單,只需要在括號中添加元素,並使用逗號隔開即可。

第二創建模型,使用Code First,配置映射關系(一)

一個用戶 option hone review 加載 使用 定義 fig gin 這一節,實現模型的創建,配置映射關系 使用Code First數據遷移。 創建模型 一,首先創建幾個接口:實體接口,聚合根接口,值對象接口 1,實體接口: 2,聚合根接口: 3,值對象接口

linux入門-第二如何關機

family linux入門 this down 文檔 流程 背景 登陸用戶 告訴 如果你要關機,必須要保證當前系統中沒有其他用戶在線。可以下達 who 這個指令,而如果要看網絡的聯機狀態,可以下達 netstat -a 這個指令,而要看背景執行的程序可以執行 ps -au

第二FreeRTOS 任務的建立刪除掛起恢復

https://www.freertos.org/ https://download.csdn.net/download/zennaiheqiao/10665003 1.任務建立 1.1函式描述 BaseType_t xTaskCreate(TaskFunction_t pvT