首頁  >  文章  >  web前端  >  html5遊戲開發-憤怒的小鳥-開源講座(二)-跟著小鳥的鏡頭

html5遊戲開發-憤怒的小鳥-開源講座(二)-跟著小鳥的鏡頭

黄舟
黄舟原創
2017-03-02 13:44:331970瀏覽

上一講中介紹瞭如何讓小鳥旋轉跳上彈弓,以及利用外部力使小鳥彈飛出去,但是如果不做任何處理的話,小鳥就這麼直沖沖的飛出螢幕了,這次我們就要讓鏡頭時刻跟著小鳥來移動。下面是上一講的連接,沒有看過上一講的朋友們請先了解一下。

html5遊戲開發-憤怒的小鳥-開源講座(一)-跳入彈出的小鳥

http://blog.csdn.net/lufy_legend/article/details/7765599

關於如何讓鏡頭跟隨某一物體,我一開始的想法就是循環所有物理世界裡的物體,以小鳥作為參照物,然後來計算其他物體的相對座標,從而實現鏡頭跟隨。但我覺得每次循環所有物體都有些麻煩,於是我專門請教了box2djs的作者technohippy(因為box2dweb和box2djs的原理相同),得出的結論和我的想法一樣,需要循環所有物體,technohippy表示坐標計算在遊戲中很平常,不用太過在意。於是我將座標計算封裝為synchronous函數,加到了1.4.1的擴充js中,下面說一下這個函數的用法。

在上一講中,當滑鼠彈起的時候,在彈起事件的偵聽函數downOver裡給小鳥加了一個力,使得小鳥彈飛了出去。下面給downOver函數加一行程式碼

backLayer.addEventListener(LEvent.ENTER_FRAME,onframe);

然後,循環播放函數如下

function onframe(){
	backLayer.x = LGlobal.width*0.5 - (bird.x + bird.getWidth()*0.5);	
	if(backLayer.x > 0){
		backLayer.x=0;
	}else if(backLayer.x < LGlobal.width - 1600){
		backLayer.x = LGlobal.width - 1600;
	}
	LGlobal.box2d.synchronous();
	if(bird && bird.x > backLayer.getWidth()){
		backLayer.removeChild(bird);
		bird = null;
	}
}

解釋一下程式碼,先透過小鳥的座標,來計算backLayer層的相對座標,下面的if是為了不讓backLayer的座標移出遊戲的畫面。

然後關鍵就是下面一行程式碼

LGlobal.box2d.synchronous();

它實現了物理世界裡所有物體的座標的重新計算
最後,當小鳥移出螢幕之後,將小鳥消除。

上面的1600是為了看出效果所以將遊戲世界設定的長了一點。

下面是效果圖和測試連接,你可以將小鳥射出,看看鏡頭是不是跟著小鳥一起移動起來了?

http://lufy.netne.net/lufylegend-js/lufylegend-1.4/box2d/sample03/index.html

##為了讓效果更明顯一些,下面來加入一個豬和幾個物件

#先新建一個Pig類別

function Pig(){
	base(this,LSprite,[]);
	var self = this;
	var bitmap = new LBitmap(new LBitmapData(imglist["pig1"]));
	self.addChild(bitmap);
	self.addBodyCircle(bitmap.getWidth()*0.5,bitmap.getHeight()*0.5,bitmap.getWidth()*0.5,1,.5,.4,.5);
}

再新建一個setStage函數,來創建物體

function setStage(img,x,y,rotate,m){
	var stageLayer = new LSprite();
	backLayer.addChild(stageLayer);
	var bitmap = new LBitmap(new LBitmapData(imglist[img]));
	stageLayer.addChild(bitmap);
	stageLayer.x = x;
	stageLayer.y = y;
	stageLayer.addBodyPolygon(bitmap.getWidth(),bitmap.getHeight(),1,m,.4,.2);
	if(rotate != 0)stageLayer.setRotate(rotate*Math.PI/180);
}

有了上面的準備,下面給遊戲加入幾個物體就很簡單了,在遊戲開始時的gameInit函數裡加入下面代碼

	setStage("stage03",1070,430,0,10);
	setStage("stage01",995,300,90,1);
	setStage("stage01",1140,300,90,1);
	setStage("stage02",1070,200,0,1.5);
	setStage("stage04",1090,200,0,2);
	var pig = new Pig();
	pig.x = 1150;
	pig.y = 400;
	backLayer.addChild(pig);

表示加入5個物體和一隻豬,效果如圖

但是,只是這樣的話,上面這張圖其實是看不到的,因為我把這些物體都加到了遊戲畫面的右邊,而遊戲開始時座標是(0,0),我們看到的畫面是遊戲畫面左邊的部分,所以我一開始先將鏡頭移到遊戲畫面的右邊。

backLayer.x = LGlobal.width - 1600;
LGlobal.box2d.synchronous();

改變backLayer的座標就不用說了,呼叫synchronous函數的作用依然是將物理世界的座標重新計算。

然後,當畫面出現後,稍作停頓後,就將鏡頭拉回小鳥坐在位置,實現方法如下

LTweenLite.to(backLayer,1,
		{ 
			x:0,
			delay:2,
			onUpdate:function(){
				LGlobal.box2d.synchronous();
			},
			onComplete:run,
			ease:Sine.easeIn
		}
	);

大家可以看到,我還是用了LTweenLite緩動,參數delay:2表示,緩動延時2秒後執行,然後透過緩動將backLayer的x座標變回0,在緩動的過程中呼叫synchronous,計算物理世界的座標,這樣就實現了鏡頭一開始顯示的是螢幕右邊,然後再快速移動到左邊,廢話不多說,現在看看效果吧。

http://lufy.netne.net/lufylegend-js/lufylegend-1.4/box2d/sample03/index02.html



#大家可以看到,用lufylegend庫件結合box2dweb製作實體遊戲竟然如此簡單,還不快嘗試一下html5遊戲開發-憤怒的小鳥-開源講座(二)-跟著小鳥的鏡頭

下面給出本次教學的源碼,老規矩,lufylegend庫件和box2dweb需要自己下載設定一下,庫件1.4.1的擴充部分請到第一講下載。

http://fsanguo.comoj.com/download.php?i=AngryBirds2.rar


本次就寫到這裡,碰撞偵測還是留到下一講吧,在第三講中會讓小鳥展示自己的威力,將螢幕上的豬豬撞得腦袋開花,敬請期待。

 以上就是html5遊戲發展-憤怒的小鳥-開源講座(二)-跟隨小鳥的鏡頭的內容,更多相關內容請關注PHP中文網(www.php.cn)!


#
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn