最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android游戲開(kāi)發(fā)學(xué)習(xí)②焰火綻放效果實(shí)現(xiàn)方法

 更新時(shí)間:2015年10月14日 15:51:27   作者:w93223010  
這篇文章主要介紹了Android游戲開(kāi)發(fā)學(xué)習(xí)②焰火綻放效果實(shí)現(xiàn)方法,以實(shí)例形式詳細(xì)分析了Android中粒子對(duì)象類(lèi)Particle類(lèi)和粒子集合類(lèi)ParticleSet類(lèi)及物理引擎ParticleThread類(lèi) 的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下

本文實(shí)例講述了Android游戲開(kāi)發(fā)學(xué)習(xí)②焰火綻放效果實(shí)現(xiàn)方法。分享給大家供大家參考。具體如下:

本節(jié)介紹在游戲開(kāi)發(fā)中常用到的數(shù)學(xué)物理應(yīng)用——粒子系統(tǒng)。粒子系統(tǒng)與上一節(jié)的小球有類(lèi)似的地方,都是通過(guò)數(shù)學(xué)方法和物理公式模擬客觀世界中的物體的運(yùn)動(dòng)軌跡。不同的是小球更強(qiáng)調(diào)個(gè)體運(yùn)動(dòng),而焰火粒子等粒子系統(tǒng)更注重整體感覺(jué)。

一、焰火粒子效果

1.粒子對(duì)象類(lèi)Particle類(lèi)和粒子集合類(lèi)ParticleSet類(lèi)

每個(gè)粒子都為一個(gè)Particle類(lèi)的對(duì)象,程序中產(chǎn)生的所有Particle對(duì)象都由一個(gè)ParticleSet對(duì)象來(lái)管理。

Particle類(lèi):

package com.particle; 
public class Particle { 
  int color; // 粒子顏色 
  int r; // 粒子半徑 
  double vertical_v; // 垂直速度 
  double horizontal_v; // 水平速度 
  int startX; // 初始X坐標(biāo) 
  int startY; // 初始Y坐標(biāo) 
  int x; // 實(shí)時(shí)X坐標(biāo) 
  int y; // 實(shí)時(shí)Y坐標(biāo) 
  double startTime; // 起始時(shí)間 
  public Particle(int color, int r, double vertical_v, double horizontal_v, int x, int y, double startTime) { 
    super(); 
    this.color = color; 
    this.r = r; 
    this.vertical_v = vertical_v; 
    this.horizontal_v = horizontal_v; 
    this.startX = x; 
    this.startY = y; 
    this.x = x; 
    this.y = y; 
    this.startTime = startTime; 
  } 
}

ParticleSet類(lèi):

package com.particle; 
import java.util.ArrayList; 
import android.graphics.Color; 
public class ParticleSet { 
  ArrayList<Particle> particleSet; 
  public ParticleSet() { 
    particleSet = new ArrayList<Particle>(); 
  } 
  /** 
   * 向粒子集合中添加指定數(shù)量的粒子對(duì)象 
   */ 
  public void add(int count, double startTime) { 
    for (int i = 0; i < count; i++) { 
      int tempColor = this.getColor(i); 
      int tempR = 1; // 粒子半徑 
      double tempv_v = -30 + 10 * (Math.random()); // 隨機(jī)產(chǎn)生粒子豎直方向的速度
      double tempv_h = 10 - 20 * (Math.random()); // 隨機(jī)產(chǎn)生粒子水平方向的速度
      int tempX = 160; 
      int tempY = (int) (100 - 10 * (Math.random())); // 隨機(jī)產(chǎn)生粒子Y坐標(biāo),90到100之間 
      Particle particle = new Particle(tempColor, tempR, tempv_v,
          tempv_h, tempX, tempY, startTime); 
      particleSet.add(particle); 
    } 
  } 
  /** 
   * 獲取指定索引的顏色 
   */ 
  public int getColor(int i) { 
    int color = Color.RED; 
    switch (i%4) { 
    case 0: 
      color = Color.RED; 
      break; 
    case 1: 
      color = Color.GREEN; 
      break; 
    case 2: 
      color = Color.YELLOW; 
      break; 
    case 3: 
      color = Color.GRAY; 
      break; 
    } 
    return color; 
  } 
}

產(chǎn)生的粒子豎直初速度為-30至-20,方向向上;水平初速度為-10至10,方向向左或向右。

2.物理引擎ParticleThread類(lèi)

package com.particle; 
import java.util.ArrayList; 
public class ParticleThread extends Thread { 
  boolean flag; 
  ParticleView father; 
  int sleepSpan = 80; 
  double time = 0; // 物理引擎的時(shí)間軸 
  double span = 0.15; // 每次計(jì)算粒子位移時(shí)采用的時(shí)間間隔 
  public ParticleThread(ParticleView father) { 
    this.father = father; 
    this.flag = true; 
  } 
  @Override 
  public void run() { 
    while (flag) { 
      father.ps.add(5, time); // 每次添加5個(gè)粒子 
      ArrayList<Particle> tempSet = father.ps.particleSet; // 獲取粒子集合 
      for (int i = tempSet.size() - 1; i >= 0; i--) { 
        Particle particle = tempSet.get(i); 
        double timeSpan = time - particle.startTime; // 計(jì)算從程序開(kāi)始到現(xiàn)在經(jīng)過(guò)的時(shí)間 
        int tempX = (int) (particle.startX + particle.horizontal_v * timeSpan); 
        int tempY = (int) (particle.startY + 4.9 * timeSpan * timeSpan + particle.vertical_v * timeSpan); 
        if (tempY > ParticleView.DIE_OUT_LINE) { // 如果粒子超過(guò)屏幕下邊沿 
          tempSet.remove(particle); 
        } 
        particle.x = tempX; 
        particle.y = tempY; 
      } 
      time += span; 
      try { 
        Thread.sleep(sleepSpan); 
      } catch (Exception e) { 
        e.printStackTrace(); 
      } 
    } 
  } 
}

本例中的物理引擎沒(méi)有采用獲取系統(tǒng)時(shí)間的方式,而是自己定義了一個(gè)時(shí)間軸(成員變量time)。這樣可以自己確定時(shí)間軸行進(jìn)的快慢程度(通過(guò)改變成員變量span的值),而不必依賴于系統(tǒng)的時(shí)間。

3.視圖類(lèi)ParticleView類(lèi)

package com.particle; 
import java.util.ArrayList; 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.RectF; 
import android.view.SurfaceHolder; 
import android.view.SurfaceHolder.Callback; 
import android.view.SurfaceView; 
public class ParticleView extends SurfaceView implements Callback { 
  public static final int DIE_OUT_LINE = 300; 
  DrawThread dt; 
  ParticleSet ps; 
  ParticleThread pt; 
  String fps = "FPS:N/A"; 
  public ParticleView(Context context) { 
    super(context); 
    this.getHolder().addCallback(this); 
    dt = new DrawThread(this, getHolder()); 
    ps = new ParticleSet(); 
    pt = new ParticleThread(this); 
  } 
  public void doDraw(Canvas canvas) { 
    canvas.drawColor(Color.BLACK); // 清屏 
    ArrayList<Particle> particleSet = ps.particleSet; 
    Paint paint = new Paint(); 
    for (int i = 0; i < particleSet.size(); i++) { 
      Particle p = particleSet.get(i); 
      paint.setColor(p.color); 
      int tempX = p.x; 
      int tempY = p.y; 
      int tempRadius = p.r; 
      RectF oval = new RectF(tempX, tempY, tempX + 2 * tempRadius, tempY 
          + 2 * tempRadius); 
      canvas.drawOval(oval, paint); // 繪制橢圓粒子 
    } 
    paint.setColor(Color.WHITE); 
    paint.setTextSize(18); 
    paint.setAntiAlias(true); 
    canvas.drawText(fps, 15, 15, paint); 
  } 
  @Override 
  public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { 
  } 
  @Override 
  public void surfaceCreated(SurfaceHolder arg0) { 
    if (!dt.isAlive()) { 
      dt.start(); 
    } 
    if (!pt.isAlive()) { 
      pt.start(); 
    } 
  } 
  @Override 
  public void surfaceDestroyed(SurfaceHolder arg0) { 
    dt.flag = false; 
    dt = null; 
    pt.flag = false; 
    pt = null; 
  } 
}

4.繪圖類(lèi)DrawThread及Activity類(lèi)

基本與上節(jié)相同

DrawThread類(lèi):

package com.particle; 
import android.graphics.Canvas; 
import android.view.SurfaceHolder; 
public class DrawThread extends Thread { 
  ParticleView pv; 
  SurfaceHolder surfaceHolder; 
  boolean flag=false; 
  int sleepSpan=30; 
  long start =System.nanoTime(); //記錄起始時(shí)間,該變量用于計(jì)算幀速率
  int count=0 ; //記錄幀數(shù) 
  public DrawThread(ParticleView pv,SurfaceHolder surfaceHolder) { 
    this.pv=pv; 
    this.surfaceHolder=surfaceHolder; 
    this.flag=true; 
  } 
  public void run() { 
    Canvas canvas=null; 
    while(flag) { 
      try { 
        canvas=surfaceHolder.lockCanvas(null); //獲取BallView的畫(huà)布 
        synchronized (surfaceHolder) { 
          pv.doDraw(canvas); 
        } 
      } catch (Exception e) { 
        e.printStackTrace(); 
      } finally { 
        if(canvas!=null) { 
          surfaceHolder.unlockCanvasAndPost(canvas); // surfaceHolder解鎖,并將畫(huà)布傳回 
        } 
      } 
      this.count++; 
      if(count==20) { //計(jì)滿20幀時(shí)計(jì)算一次幀速率 
        count=0; 
        long tempStamp=System.nanoTime(); 
        long span=tempStamp-start; 
        start=tempStamp; 
        double fps=Math.round(100000000000.0/span*20)/100.0; 
        pv.fps="FPS:"+fps; 
      } 
      try { 
        Thread.sleep(sleepSpan); 
      } catch (InterruptedException e) { 
        e.printStackTrace(); 
      } 
    } 
  } 
}

MainActivity類(lèi):

package com.particle; 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.Window; 
import android.view.WindowManager; 
public class MainActivity extends Activity { 
  ParticleView pv; 
  @Override 
  public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); //設(shè)置不顯示標(biāo)題 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); //設(shè)置全屏 
    pv=new ParticleView(this); 
    setContentView(pv); 
  } 
}

效果圖:

二、瀑布粒子效果

瀑布粒子和焰火粒子十分類(lèi)似,二者的運(yùn)動(dòng)都是帶有初速度的下落運(yùn)動(dòng)。所不同的是焰火粒子水平方向和豎直方向的速度均不為零,而瀑布粒子只有水平方向初速度,豎直方向初速度為零。只需在焰火粒子的生成部分ParticleSet類(lèi)中修改即可。

ParticleSet類(lèi)add方法修改如下:

/** 
* 向粒子集合中添加指定數(shù)量的粒子對(duì)象(瀑布粒子效果) 
*/ 
public void add2(int count, double startTime) { 
    for (int i = 0; i < count; i++) { 
      int tempColor = this.getColor(i); 
      int tempR = 1; // 粒子半徑 
      double tempv_v = 0; // 粒子豎直方向的速度為0 
      double tempv_h = 10 + 20 * (Math.random()); // 隨機(jī)產(chǎn)生粒子水平方向的速度 
      int tempX = 50; 
      int tempY = (int) (50 - 10 * (Math.random())); // 隨機(jī)產(chǎn)生粒子Y坐標(biāo),90到100之間 
      Particle particle = new Particle(tempColor, tempR, tempv_v,
          tempv_h, tempX, tempY, startTime); 
      particleSet.add(particle); 
    } 
}

效果圖:

希望本文所述對(duì)大家的Android程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 使用TransitionDrawable實(shí)現(xiàn)多張圖片淡入淡出效果

    使用TransitionDrawable實(shí)現(xiàn)多張圖片淡入淡出效果

    這篇文章主要為大家詳細(xì)介紹了使用TransitionDrawable實(shí)現(xiàn)多張圖片淡入淡出效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Android 面試精華題目總結(jié)

    Android 面試精華題目總結(jié)

    本文主要介紹Android 面試題,這里整理了幾個(gè)經(jīng)典面試題,幫助大家學(xué)習(xí)相關(guān)知識(shí),有需要的小伙伴可以參考下
    2016-09-09
  • Android之小球自由碰撞動(dòng)畫(huà)示例

    Android之小球自由碰撞動(dòng)畫(huà)示例

    大家好,本篇文章主要講的是Android之小球自由碰撞動(dòng)畫(huà)示例,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • mac系統(tǒng)下載、安裝、使用AndroidStudio

    mac系統(tǒng)下載、安裝、使用AndroidStudio

    本文給大家介紹的是在Mac系統(tǒng)中下載安裝以及使用AndroidStudio的詳細(xì)教程,非常的實(shí)用,有需要的小伙伴可以參考下
    2017-10-10
  • Android學(xué)習(xí)之Fragment

    Android學(xué)習(xí)之Fragment

    Fragment是什么?碎片(Fragment)是一種可以嵌入在活動(dòng)(activity)當(dāng)中的UI片段,想要了解碎片的簡(jiǎn)單用法的朋友可以參考一下
    2016-01-01
  • Android實(shí)現(xiàn)支持進(jìn)度條顯示的短信備份工具類(lèi)

    Android實(shí)現(xiàn)支持進(jìn)度條顯示的短信備份工具類(lèi)

    這篇文章主要介紹了Android實(shí)現(xiàn)支持進(jìn)度條顯示的短信備份工具類(lèi),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-03-03
  • Android 改變圖標(biāo)原有顏色和搜索框的實(shí)例代碼

    Android 改變圖標(biāo)原有顏色和搜索框的實(shí)例代碼

    讓Android也能有iOS那么方便的圖片色調(diào)轉(zhuǎn)換,就像同一個(gè)圖標(biāo),但是有多個(gè)地方使用,并且顏色不一樣,就可以用這個(gè)方法了。 本文實(shí)現(xiàn)TextView圖片和文字居中,鍵盤(pán)搜索功能,具體實(shí)現(xiàn)代碼大家跟隨腳本之家小編看看吧
    2017-09-09
  • Kotlin fun函數(shù)使用方法

    Kotlin fun函數(shù)使用方法

    函數(shù)是執(zhí)行特定任務(wù)的一組相互關(guān)聯(lián)的代碼塊。函數(shù)用于將程序分解為不同的子模塊。它使代碼可重用,并使程序更易于管理,這篇文章主要介紹了Kotlin fun函數(shù)使用方法
    2022-12-12
  • flutter監(jiān)聽(tīng)app進(jìn)入前后臺(tái)狀態(tài)的實(shí)現(xiàn)

    flutter監(jiān)聽(tīng)app進(jìn)入前后臺(tái)狀態(tài)的實(shí)現(xiàn)

    在開(kāi)發(fā)app的過(guò)程中,我們經(jīng)常需要知道app處于前后臺(tái)的狀態(tài),本文主要介紹了flutter監(jiān)聽(tīng)app進(jìn)入前后臺(tái)狀態(tài)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Android 音樂(lè)播放器的開(kāi)發(fā)實(shí)例詳解

    Android 音樂(lè)播放器的開(kāi)發(fā)實(shí)例詳解

    本文主要講解Android 音樂(lè)播放器的開(kāi)發(fā),這里給大家提供一個(gè)簡(jiǎn)單的示例代碼,和實(shí)現(xiàn)效果圖,有需要開(kāi)發(fā)音樂(lè)播放器的朋友可以參考下
    2016-08-08

最新評(píng)論

资兴市| 丹东市| 察雅县| 鸡西市| 台前县| 连州市| 连山| 闵行区| 英吉沙县| 大埔县| 黔西县| 聂拉木县| 连云港市| 新邵县| 潮州市| 霍州市| 大港区| 宕昌县| 宁远县| 旌德县| 阿尔山市| 安义县| 乌海市| 嘉禾县| 中宁县| 美姑县| 北京市| 如东县| 宽城| 岑溪市| 靖江市| 阳新县| 临猗县| 通海县| 长汀县| 西藏| 万全县| 龙泉市| 收藏| 竹北市| 洛阳市|