PIXI 分組 Sprite-PIXI文檔翻譯(5)

1、分組sprite
組可以創建遊戲場景,並將類似的精靈一起管理爲單個單元。Pixi有一個對象稱爲a Container ,讓你這樣做。讓我們來看看它是如何工作的。

想象一下,你想顯示三個精靈:貓,刺蝟和老虎。創建它們,並設置他們的位置 - 但不要將它們添加到舞臺上。


//The cat
var cat = new Sprite(id["cat.png"]);
cat.position.set(16, 16);

//The hedgehog
var hedgehog = new Sprite(id["hedgehog.png"]);
hedgehog.position.set(32, 32);

//The tiger
var tiger = new Sprite(id["tiger.png"]);
tiger.position.set(64, 64);


接下來,創建一個animals容器,將它們全部組合在一起,如下所示:

var animals = new Container();


然後使用addChild對精靈添加到該組。

animals.addChild(cat);
animals.addChild(hedgehog);
animals.addChild(tiger);


最後將組添加到舞臺。

stage.addChild(animals);
renderer.render(stage);


(你知道,stage對象也是一個Container。它是所有Pixi sprites的根容器。)
這裏是這段代碼產生:

[img]http://dl2.iteye.com/upload/attachment/0123/3415/2b6d2c10-77ff-3c35-9c2a-6b4831be4110.png[/img]

在該圖像中看不到animals的是包含精靈的不可見組。

[img]http://dl2.iteye.com/upload/attachment/0123/3417/bef4f033-f5f2-3e77-8f5b-8d8f746bbc6e.png[/img]

您現在可以將animals組視爲一個單元。你可以認爲a Container是一種沒有紋理的特殊類型的sprite。

如果你需要一個包含所有子sprite的列表animals,使用它的children數組來找出。


console.log(animals.children)
//Displays: Array [Object, Object, Object]


這告訴你animals有三個精靈作爲孩子。

由於該animals組就像任何其他的精靈,你可以改變它的x和y值alpha,scale和所有其他的精靈屬性。您在父容器上更改的任何屬性值將以相對方式影響子精靈。所以如果你設置組x和y位置,所有的子精靈將相對於組的左上角重新定位。如果你將animals's x和y位置設置爲64 會發生什麼?

animals.position.set(64, 64);


整組精靈會向右移動64像素,向下移動64像素。


[img]http://dl2.iteye.com/upload/attachment/0123/3419/d3a5ca9e-7fb0-32d7-85ea-8cdeb72d9a67.png[/img]

該animals組還具有其自己的維度,其基於由包含的精靈佔據的面積。你可以找到它width和 height值如下:


console.log(animals.width);
//Displays: 112

console.log(animals.height);
//Displays: 112


[img]http://dl2.iteye.com/upload/attachment/0123/3421/3940ec3f-4518-3433-9a09-6421c9a9d02b.png[/img]

如果更改組的寬度或高度會發生什麼?


animals.width = 200;
animals.height = 200;


所有的子sprite將縮放以適應這種變化。


[img]http://dl2.iteye.com/upload/attachment/0123/3423/aa52dd63-7aeb-379f-b0ea-dc7869da9938.png[/img]

你可以嵌套任意多的Containers在其他 Containers內你喜歡,創建深層次結構,如果你需要。然而,DisplayObject(像一個Sprite或另一個 Container)一次只能屬於一個父母。如果你使用addChild一個sprite是另一個對象的子對象,Pixi會自動將其從當前父對象中刪除。這是一個有用的管理,你不必擔心。

2、本地和全局位置
當您添加一個精靈到Container,其x與y 位置相對於集團的左上角。這是sprite的本地位置例如,你認爲貓的位置在這個圖像是什麼?

[img]http://dl2.iteye.com/upload/attachment/0123/3419/d3a5ca9e-7fb0-32d7-85ea-8cdeb72d9a67.png[/img]

讓我們來看看:

console.log(cat.x);
//Displays: 16

16?是! 這是因爲貓從該組的左上角只偏移了16個像素。16是貓的本地位置。

精靈也有一個全局位置。全局位置是從舞臺的左上角到精靈的錨點(通常是精靈的左上角)的距離。你可以在toGlobal方法的幫助下找到精靈的全局位置。就是這樣:


parentSprite.toGlobal(childSprite.position)

這意味着你可以在animals 組內找到貓的全局位置,如下所示:

console.log(animals.toGlobal(cat.position));
//Displays: Object {x: 80, y: 80...};


這給你一個x和y的80位這正是貓的相對於舞臺的左上角的全球地位。

如果你想找到一個精靈的全局位置,但不知道精靈的父容器是什麼?每個sprite有一個稱爲的屬性parent,將告訴你sprite的父母是什麼。如果你直接添加一個sprite到stage,那麼 stage就會是sprite的parent。在上面的例子中,cat父母是animals。這意味着你可以通過編寫代碼來獲得貓的全球位置:


cat.parent.toGlobal(cat.position);


即使你不知道當前的父容器是什麼,它也會工作。

還有一種方法來計算全球位置!而且,它實際上是最好的方式,所以挺身而出!如果你想知道從畫布的左上角到精靈的距離,並且不知道或不在乎精靈的父容器是什麼,請使用 getGlobalPosition方法。這裏是如何使用它來找到老虎的全球位置:


tiger.getGlobalPosition().x
tiger.getGlobalPosition().y


在我們使用的例子中,這將給你x和y值128。特別的getGlobalPosition是,它是高度精確的:它會給你精靈的準確的全球位置,只要它的本地位置變化。我要求Pixi開發團隊添加這個功能專門用於遊戲的準確碰撞檢測。

如果要將全局位置轉換爲本地位置,該怎麼辦?您可以使用該toLocal方法。它的工作方式類似,但使用這種一般格式:

sprite.toLocal(sprite.position, anyOtherSprite)


使用toLocal找到一個精靈和任何其他子畫面之間的距離。這裏是如何找到老虎的本地位置,相對於刺蝟。

tiger.toLocal(tiger.position, hedgehog).x
tiger.toLocal(tiger.position, hedgehog).y


個x值爲32,y值爲32.你可以在示例圖片中看到,老虎的左上角是32像素,左邊是刺蝟的左上角。

3、使用ParticleContainer來組合精靈

Pixi有一個替代的,高性能的方法來組合sprite稱爲ParticleContainer(PIXI.ParticleContainer)。任何精靈內部的 ParticleContainer渲染將比如果他們在一個常規的2至5倍快 Container。這是一個偉大的性能提升遊戲。

創建一個ParticleContainer這樣:
var superFastSprites = new ParticleContainer();


然後使用addChild添加精靈到它,就像你會與任何普通Container。

如果你決定使用,你必須做一些妥協 ParticleContainer。一個精靈裏面ParticleContainer只有幾個基本屬性: x,y,width,height,scale,pivot,alpha,visible-這就是它。此外,它包含的精靈不能有自己的嵌套的孩子。A ParticleContainer也不能使用Pixi的高級視覺效果,如過濾器和混合模式。每個都ParticleContainer可以只使用一個紋理(所以你必須使用spritesheet,如果你想要Sprite有不同的外觀)。但是對於你獲得的巨大的性能提升,這些妥協通常是值得的。您可以在同一個項目中同時使用 Containers和ParticleContainers,因此您可以微調優化。

爲什麼sprite在Particle Container這麼快?因爲sprite的位置是直接在GPU上計算的。Pixi開發團隊正在努力在GPU上卸載儘可能多的精靈處理,因此,您使用的最新版本的Pixi可能ParticleContainer比我在這裏描述的功能豐富得多。有關詳細信息,請查看當前ParticleContainer 文檔。

在您創建的位置ParticleContainer,您可以提供兩個可選參數:容器可容納的sprite的最大數量,以及一個options對象。

var superFastSprites = new ParticleContainer(size, options);


大小的默認值爲15,000。所以,如果你需要包含更多的精靈,設置它更高的數字。選項參數是可以設置5布爾值的對象:scale,position,rotation,uvs和 alpha。的默認值position是true,但其餘的人都設置爲false。這意味着,如果你想改變rotation, scale,alpha,或uvs在精靈的ParticleContainer,你要設置這些屬性true,就像這樣:


var superFastSprites = new ParticleContainer(
size,
{
rotation: true,
alpha: true,
scale: true,
uvs: true
}
);


但是,如果你不認爲你需要使用這些屬性,保持它們設置false爲擠出最大的性能。

有什麼uvs選擇?只有設置它,true如果你有粒子,當他們的動畫時改變他們的紋理。(所有的精靈的紋理也需要在相同的tileset圖像爲這個工作。)

(注:UV映射是一個三維圖形顯示的術語,指的是x與y正被映射到三維表面紋理(圖像)的座標。U是x軸和V是y軸WebGL的已經使用。x,y和z對於三維空間定位,因此U 和V被選爲代表x,並y爲2D圖像紋理。)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章