1. 程式人生 > >實現蝴蝶翩翩飛舞的效果

實現蝴蝶翩翩飛舞的效果

ava mat 答案 開發 vector 最重要的 translate 向量 技術分享

近期在做一個功能開發的時候,須要實現蝴蝶飛舞的效果。先看看效果圖吧!

技術分享技術分享



先問一個問題:要實現上面的蝴蝶紛飛的效果至少須要幾個蝴蝶的圖像? 答案是:4。不同顏色種類的蝴蝶須要一張就足夠。

要實現這個效果僅僅須要一行關鍵代碼:

canvas.drawBitmap(img_to_draw, view_player_matrix, mPaint);

這裏我們之關註這個參數:view_player_matrix。這是一個Matrix,通過設置這個Matrix,就能讓蝴蝶有位移,大小。拍動翅膀的效果變化!當中通過mPaint來配置蝴蝶的透明度能夠達到蝴蝶慢慢消失的效果!

位移能夠通過Matrix的setTranslate()來設置;大小能夠用postScale()來配置。那麽拍動翅膀呢?這就是我要說的重點。

要實現如上面效果圖的拍動翅膀。你須要細致觀察上面的蝴蝶!

事實上拍動翅膀的時候,從上往下看蝴蝶是不是變窄了。就像是被壓縮了。這就是我實現的辦法!

首先記住蝴蝶飛的方向!

用一個方向向量來表示,通過變化這個方向量來達到改變蝴蝶的飛行的方向!

最重要的是要計算出蝴蝶旋轉的角度。以下給出通過方向向量來計算其角度的方法:

	private static int get_vector_Radian (float vector_x, float vector_y){
		float lenth = (float) lineDis(0, 0, vector_x, vector_y);
		int degree = 0;
			

		if(vector_x > 0 && vector_y >= 0)
		{
			degree =  (int) (Math.asin(vector_y/lenth) * (TO_DEGREES));
		}
		else if(vector_x <= 0 && vector_y > 0)
		{
			degree = (int) (Math.asin(vector_y/lenth) * (TO_DEGREES));
			degree = 180 - degree;
		} 
		else if(vector_x < 0 && vector_y <= 0)
		{
			degree = (int) (Math.asin((-vector_y)/lenth) * (TO_DEGREES));
			degree += 180;
		}
		else
		{
			degree = (int) (Math.asin((-vector_y)/lenth) * (TO_DEGREES));
			degree = 360 - degree;
		}

		return degree;
	} 

代碼裏面的TO_DEGREES定義例如以下:

private static final float TO_DEGREES = ((180/(float)Math.PI));

這樣在Matrix的配置時候通過postScale()這種方法去改變蝴蝶寬度。也就是改變蝴蝶圖片y的大小,這樣就實現了。例如以下是關鍵代碼:

view_player_matrix.postScale(temp_parameters_float, temp_parameters_float+curr_player.img_player_scal_incre_y, curr_player.img_player_x, curr_player.img_player_y);

當中temp_parameters_float表示了這個蝴蝶的大小。curr_player.img_player_scal_incre_y就表示當前這一幀蝴蝶擺動翅膀的強度!




實現蝴蝶翩翩飛舞的效果