最近在模拟一個android遊戲,其中看到一個下雪的效果。到網上搜了很久發現大部分用的都是搜尋引擎用的粒子效果模拟的。
自己沒用過android的遊戲引擎,于是就決定自己寫一個吧。
下雪的效果,無非就是讓螢幕上的“雪花”的圖檔不停的被重繪。
這裡下雪的動作,需要用一個線程控制。
/*
* 負責做界面更新工作 ,實作下雪
*/
private RefreshHandler mRedrawHandler = new RefreshHandler();
class RefreshHandler extends Handler {
@Override
public void handleMessage(Message msg) {
//snow.addRandomSnow();
snow.invalidate();
sleep(100);
}
public void sleep(long delayMillis) {
this.removeMessages(0);
sendMessageDelayed(obtainMessage(0), delayMillis);
};
線程啟動的時候,初始化雪花圖檔,把圖檔加載到記憶體之中。
然後讓線程每隔一段時間重繪一次,重繪的時候增加y軸的距離,達到下雪的效果。
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
for (int x = 0; x < 10; x += 1) {
if (snows[x].y >= view_height) {
snows[x].y = 0;
addRandomSnow();
}
// 雪花下落的速度
snows[x].y += 5;
//雪花飄動的效果
if (RNG.nextBoolean()) {
// 随機産生一個數字,讓雪花有水準移動的效果
int rng = RNG.nextInt(3);
snows[x].x += 2 - rng;
canvas.drawBitmap(bitmap_snows[x / 6], ((float) snows[x].x),
((float) snows[x].y), mPaint);
}
雪花的初始位置是y軸的頂點,我這裡設定了10朵雪花。開始的時候,随機産生10個x軸方向的數字,作為雪花再x軸的起始位置。
當雪花“飄”出了螢幕之後,y坐标重新置0,x坐标也重新産生。其中為了達到雪花靈動的效果,随機産生一個x軸的飄動效果。
當然,做的效果不是太好,可以優化一下:比如,多增加雪花圖檔,達到下雪時雪花有近有遠的效果。
歡迎有興趣的朋友補充……