徐家破鏡昏如霧。半面人間露。等閒相約是看燈。誰料人間天上、似流星。朱門簾影深深雨。憔悴新人舞。天涯海角賞新晴。惟有橋邊賣鏡、是閒行。
——宋·劉辰翁·《虞美人》
流星出現的時候,人們都喜歡對着它們許願,因爲傳說對着流星許下願望後,願望就能實現。不過流星很少見,至少我沒有見到過,因此從來沒有對着它許願。最近出於興趣,製作一個拖尾效果,後來想到可以通過拖尾效果來實現一下流星雨的效果。因此今天就來實現一下,也好讓我等沒有看到過流星的童鞋長長見識。
先發幾個截圖吧:
偶美工不好,所以看上去沒什麼感覺,不過把背景圖換一換,就好看了(就是沒有找到合適的圖片)。
測試鏈接:http://www.cnblogs.com/yorhom/articles/3237944.html
大家不妨對着流星許個願吧,說不定願望能實現呢。
一,準備工作
本次開發需要用到開源引擎lufylegend.js,引擎的下載地址&詳細信息如下
引擎官方網站:
http://lufylegend.com/lufylegend
引擎API網站:
http://lufylegend.com/lufylegend/api
二,拖尾效果
實現流星雨,要用到拖尾效果,但lufylegend中沒有添加拖尾的功能,所以只有自己寫了,其實實現起來也不難,就是lufy太懶了,沒有封裝而已(願lufy不要看到這句話啊……)。今天我就幫他老人家來實現一下這個效果。
拖尾這個效果在遊戲中很常見,比如人物移動時的幻影,子彈等。因此我們把它封裝爲一個Smearing類,這個類主要負責實現拖尾效果。代碼如下:
/**
* Smearing
* @param $object 添加拖尾的對象
*/
function Smearing($object){
var self = this;
base(self,LSprite,[]);
self.x = 0;
self.y = 0;
self.mode = "";
self.smearingSprite = new LSprite();
self.addChild(self.smearingSprite);
self.object = $object;
self.originalSprite = new LSprite();
self.addChild(self.originalSprite);
self.originalSprite.addChild(self.object);
self.addEventListener(LEvent.ENTER_FRAME,self.smeared);
}
代碼清單1
接下來由我逐字逐句地解釋一番。
第一行代碼就不講解了,地球上的IT人都知道。因此從第二行開始說起。
首先我們將這個類用base繼承自LSprite,如代碼清單2(至於base和LSprite是什麼,可以到API文檔裏去看看,或者看看我以前的文章)。
base(self,LSprite,[]);
接下來,我們加入一個用來添加拖尾的層。如代碼清單3
self.smearingSprite = new LSprite();
self.addChild(self.smearingSprite);
然後我們保存一下添加拖尾效果的對象,這樣方便以後使用。如代碼清單4所示
self.object = $object;
self.originalSprite = new LSprite();
self.addChild(self.originalSprite);
self.originalSprite.addChild(self.object);
最後添加一個時間軸事件,方便添加拖尾。
self.addEventListener(LEvent.ENTER_FRAME,self.smeared);
到這裏,Smearing構造器就寫完了,也解釋完了,看不懂的話可能是你不瞭解lufylegend,裏面的addChild,LSprite都是lufylegend中封裝的。
我們在上面的代碼中已經加入了時間軸事件。爲什麼要加入呢?因爲我不妨說一下拖尾的原理。拖尾其實就是不斷地將原對象克隆出來,然後放在現在所在的位置上,相當於不斷地向畫面上蓋章。當原對象移開時,我們克隆的對象並沒有移開,而原對象移開了,如果我們增加的對象有很多,那就會形成一條鏈接原對象的線。這時我們再遍歷一下這個線裏的每個成員,通過緩動來改變當前對象的透明度。然後判斷該對象的透明度是否爲0,如果是就移除,避免佔太多空間。因此,我們添加時間軸事件用來不斷添加拖尾對象。
Smearing成員函數smeared起到這點作用,代碼如下:
Smearing.prototype.smeared = function(self){
var smearingChild = new SmearingChild(self.originalSprite,self.object);
self.smearingSprite.addChild(smearingChild);
for(var key in self.smearingSprite.childList){
LTweenLite.to(self.smearingSprite.childList[key],0.5,{
alpha: 0,
onComplete:function(o){
self.smearingSprite.removeChild(o);
}
});
}
};
主要是上面兩行代碼,如代碼清單8:
var smearingChild = new SmearingChild(self.originalSprite,self.object);
self.smearingSprite.addChild(smearingChild);
/**
* SmearingChild
* @param $parent 確定拖尾位置的對象
* @param $object 要添加拖尾效果的對象
*/
function SmearingChild($parent,$object){
var self = this;
base(self,LSprite,[]);
self.addChild($object);
self.x = $parent.x;
self.y = $parent.y;
self.alpha = 0.8;
}
講了一通,大夥應該也明白了些。後面放出代碼,大家可以拿下去研究,或者在文章下方提出問題或者用新浪微博@Yorhom,還可以用郵箱,郵箱地址:[email protected]。(聯繫方式多多啊 (^o^))
Smearing這個類還差個功能,那就是讓對象緩緩移動,實現起來也很簡單,加入to函數:
Smearing.prototype.to = function($duration,$vars){
var self = this;
$vars.onComplete = function(){
self.mode = "complete";
}
LTweenLite.to(self.originalSprite,$duration,$vars);
};
Smearing這個類封裝好了,使用起來就簡單了,如下:
init(10,"mylegend",500,400,main);
var back;
function main(){
LStage.setDebug(true);
back = new LSprite();
back.graphics.drawRect(0,"",[0,0,50,50],true,"blue");
smearing = new Smearing(back);
smearing.to(2,{
x: 200,
y: 200
});
addChild(smearing);
}
測試鏈接:http://www.cnblogs.com/yorhom/articles/3237266.html
三,炫麗的流星雨效果
有了,Smearing這個類,我們的流星雨就簡單多了。首先把所有代碼展示一下:
init(10,"mylegend",500,400,main);
var backLayer,meteorLayer;
var back,meteor;
var maxFrame = 40,indexFrame = 0;
function main(){
LStage.setDebug(true);
//加入底板層
backLayer = new LSprite();
addChild(backLayer);
//加入流星層
meteorLayer = new LSprite();
addChild(meteorLayer);
//畫一個黑色矩形作爲背景
back = new LGraphics();
back.drawRect(0,"",[0,0,LStage.width,LStage.height],true,"black");
backLayer.addChild(back);
//畫一個黃色矩形作爲一顆流星
meteor = new LSprite();
meteor.graphics.drawRect(0,"",[0,0,10,10],true,"yellow");
backLayer.addEventListener(LEvent.ENTER_FRAME,onframe);
}
function onframe(){
if(indexFrame > maxFrame){
indexFrame = 0;
//爲每個流星添加一個拖尾
var smearing = new Smearing(meteor,50);
smearing.x = Math.floor(Math.random() * 250);
smearing.y = 0;
smearing.to(2,{
x: Math.floor(Math.random() * (500 - 480) + 480),
y: 400
});
meteorLayer.addChild(smearing);
}
for(var key in meteorLayer.childList){
if(meteorLayer.childList[key].mode == "complete"){
meteorLayer.removeChild(meteorLayer.childList[key]);
}
}
indexFrame ++;
}
最後是代碼打包,下載地址:http://files.cnblogs.com/yorhom/Smearing.rar
本篇文章就到此結束了。文章如有什麼地方寫得不妥,歡迎提出。另外,如果有任何不解的地方,可以在博客下方留言,我會盡我所能幫你解決。
支持就是最大的鼓勵!
----------------------------------------------------------------
歡迎大家轉載我的文章。
轉載請註明:轉自Yorhom's Game Box
http://blog.csdn.net/yorhomwang
歡迎繼續關注我的博客