成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

HTML5游戲開發之將Easel.js和Box2d在畫布中結合起來

移動開發 游戲開發
開發HTML5游戲Luxahoy時遇到的比較大的困難之一是:如何將Easel.js和Box2d這兩個框架結合起來。在本指南中我們將介紹基本的actor對象,讓大家學會如何將box2d中的尺寸轉換成easel中的x、y坐標以及旋轉參數。

要想學習本指南,你應該具備box2d和easel的基本知識,知道它們是如何工作的。如何你從沒學習過box2d,請閱讀box2d orientation and tutorials。要想學習easel,請參考documentation,以學會如何往stage中添加對象,同時也會對顯示的層次結構有個整體了解。

現在我們開始吧。我們將要創建的是一個簡單的示例—粉紅色的“鳥雨”。(注意:本示例只有在較新版本的瀏覽器中才可能運行)

在瀏覽器中演示 – 下載源代碼

我們假定讀者已經具備了box2d和easel的基本知識,所以將跳過編寫代碼的步驟,直接介紹兩種框架是如何結合的。如何你想好好研究的話可以下載本示例的zip文件,也可以直接在本頁中查看相關代碼。

在Easel.js中,往stage中添加對象是很容易的。下面看一下ticker函數中是如何將鳥(對象)添加到屏幕的。(注意:下面這些代碼只是從demo.js中簡單摘錄過來的。如果你想運行這些代碼請下載zip.)

  1. var tick = function(dt, paused) { 
  2.     birdDelayCounter++; 
  3.     if(birdDelayCounter % 10 === 0) {  // delay so it doesn't spawn a bird on every frame 
  4.         birdDelayCounter = 0; 
  5.         birds.spawn(); 
  6.     } 
  1. var spawn = function() { 
  2.     var birdBMP = new Bitmap("images/bird.png"); 
  3.     birdBMP.x = Math.round(Math.random()*500); 
  4.     birdBMP.y = -30; 
  5.     birdBMP.regX = 25;   // important to set origin point to center of your bitmap 
  6.     birdBMP.regY = 25; 
  7.     stage.addChild(birdBMP); 

這看起來非常地相象。這些代碼的功能是:向stage中添加鳥(位圖對象),鳥出現的水平位置是隨機的,垂直位置在畫布的頂端。位圖對象可以具有很大的靈活性,你可以把它插到其它位圖中間,可以設置它的初始位置,也可以使它任意傾斜。

如果想把easel對象轉化為box2d對象,那么regX和regY(初始位置)是很重要的。因為,box2d對象的起始坐標在中心,而easel的起始坐標在左上方。

既然我們可以把圖像添加到stage中了,現在就來看一下box2d的迷人之處吧。

 box2d.createBird(birdBMP);

  1. var createBird = function(skin) { 
  2.     var birdFixture = new b2FixtureDef; 
  3.     birdFixture.density = 1; 
  4.     birdFixture.restitution = 0.6; 
  5.     birdFixture.shape = new b2CircleShape(24 / SCALE);   // half of bird.png width divided by world scale for right size 
  6.     var birdBodyDef = new b2BodyDef; 
  7.     birdBodyDef.type = b2Body.b2_dynamicBody; 
  8.     birdBodyDef.position.x = skin.x / SCALE;  // divide skin x and y by box2d scale to get right position 
  9.     birdBodyDef.position.y = skin.y / SCALE; 
  10.     var bird = world.CreateBody(birdBodyDef); 
  11.     bird.CreateFixture(birdFixture); 
  12.     bodies.push(bird); 

以上的代碼將會創建一個與鳥位圖對象具有相同大小和位置的圓形box2d body。但很可惜,鳥的皮膚沒有映射到box2d對象。如果不在調試狀態的話,你是看不到box2d的圓圈的,鳥也會保持靜止。這樣,我們怎么能讓皮膚隨著box2d body位置的改變而變化呢?

Actors! 在box2d的可視化示例中,Actors是必不可少的。在游戲中進行循環時以及將box2d對象的米制位置轉換成像素位置時,基本上都會運行Actors。下面我們就來創建一個Actor。

 

  1. var actor = new actorObject(bird, skin); 
  2. bird.SetUserData(actor);  // set actor as userdata of body so we can get at it later if we need to 
  3.   
  4.  
  5. var actorObject = function(body, skin) { 
  6.     this.body = body; 
  7.     this.skin = skin; 
  8.     this.update = function() { // translate box2d positions to pixels 
  9.         thisthis.skin.rotation = this.body.GetAngle() * (180 / Math.PI); 
  10.         thisthis.skin.x = this.body.GetWorldCenter().x * SCALE; 
  11.         thisthis.skin.y = this.body.GetWorldCenter().y * SCALE; 
  12.     } 
  13.     actors.push(this); 
  14. } 這是最基本的actor對象的例子,當然,你可以對它進行任意擴充。我們還需要告知actor在循環期間進行更新。 
  15.  
  16. // within physics loop before world.step 
  17. for(var i=0l=actors.length; i<l; i++) { 
  18.      actors<i>.update(); 

對于box2d body在物理模擬中所發生的一切變化,位圖皮膚都會對其進行映射。

如果你想把某點上的body和其皮膚一并去除的話,可以將該body加入到“即將被去除的”數組中。在每次執行world.step之前,這些bodies必須被去除掉。

  1. // before step 
  2. for(var i=0, l=bodiesToRemove.length; i<l; i++) { 
  3.     removeActor(bodiesToRemove<i>.GetUserData());  // get the actor object in the user data of the body and send to removeActor function 
  4.     bodiesToRemove<i>.SetUserData(null); 
  5.     world.DestroyBody(bodiesToRemove<i>); 
  6. // after step 
  7. if(bodies.length > 30) { 
  8.      bodiesToRemove.push(bodies[0]); 
  9.      bodies.splice(0,1); 
  10.  
  11. var removeActor = function(actor) { 
  12.     stage.removeChild(actor.skin); 
  13.     actors.splice(actors.indexOf(actor),1); 

就是這些了。當你理解諸如:命中次數、box2d 碰撞過慮器的改變、越界檢查等這樣的actors之后,可以實現更加強大的功能。我也希望在以后的指南中介紹更多這方面的知識。

觀看示例 – 下載源代碼

原文鏈接:http://www.luxanimals.com/blog/article/combining_easel_box2d?utm_source=html5weekly&utm_medium=email

作者:Son Tran ,發表于2012年4月22日

 

責任編輯:佚名 來源: Web App Trend
相關推薦

2023-07-31 00:14:28

2023-08-07 16:26:54

LinuxNautilus文件管理器

2023-05-26 00:28:33

PandasAIChatGPTOpenAI

2020-09-23 10:36:38

安全

2020-09-23 10:36:32

ASESD-WAN安全訪問服務邊緣

2021-11-01 17:14:28

物聯網區塊鏈技術

2019-12-19 14:07:33

IT運營CIO安全

2020-05-27 09:53:19

大數據機器翻譯冠狀病毒

2022-08-09 11:14:45

首席信息官企業

2017-08-07 11:15:34

人工智能神經科學神經網絡

2017-08-04 10:33:52

人工智能神經科學Deepmind

2015-10-23 13:44:14

巴巴獵

2012-11-07 09:43:58

IBMdw

2013-01-08 11:00:20

IBMdW

2023-07-18 11:23:55

2009-10-19 16:20:53

機房與拓撲管理

2013-12-06 10:22:42

Android游戲引擎libgdx教程

2014-11-26 13:31:34

2011-07-25 16:05:40

Sencha

2014-12-30 17:13:51

HTML5
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久毛片 | 国产一级片91 | 久久99网| 日韩在线一区二区 | 国产成人精品在线 | 亚洲一区综合 | 91精品久久久久久久久久小网站 | 国产美女精品视频 | 天天激情综合 | 成人伊人| 欧美视频在线播放 | 成人av免费 | 精品久久久久久亚洲精品 | 精品久久久久久久久久久久久久 | 夜夜爽99久久国产综合精品女不卡 | 日韩一区二区在线观看视频 | 久久综合一区二区三区 | 中文字幕亚洲无线 | 天天操夜夜看 | 久久一及片| 国产精品资源在线观看 | 91精品国产综合久久久久 | 国产精品爱久久久久久久 | 久久久久国产一区二区 | 日本成人在线播放 | 美女视频一区二区三区 | 国产视频第一页 | 日韩精品在线观看视频 | 国产不卡一 | 涩涩视频在线观看 | 韩国主播午夜大尺度福利 | 成人一区在线观看 | 日本黄色片免费在线观看 | 国产免费让你躁在线视频 | 国产清纯白嫩初高生在线播放视频 | 超碰在线免费公开 | 免费小视频在线观看 | 日韩黄色免费 | 亚洲精品亚洲人成人网 | 国产精品成人久久久久 | 91精品国产91久久综合桃花 |