這次的外一篇需要大家先掌握一些簡單的libgdx的知識看起來才更加容易些:
android遊戲開發架構libgdx的使用(四)--舞台和演員http://www.apkbus.com/android-19750-1-1.html
libgdx 學習筆記二繪製映像http://www.apkbus.com/android-44573-1-1.html我們先建立一個ProgressBar的類,這個類繼承自Libgdx中的演員Actor類,並實現了我在第二講中提到過的Disposable介面,為的是能及時釋放記憶體。
- public class ProgressBar extends Actor implements Disposable{
- Texture platform;
- Texture bar;
- int height;
- int width;
- float progress;
- //做了一個簡單的適配,powerx和powery分別當前裝置解析度的權重,以現在主流的800*480為基準
- float powerx;
- float powery;
- @Override
- public void draw(SpriteBatch batch, float arg1) {
- // TODO Auto-generated method stub
- batch.draw(platform, (Gdx.graphics.getWidth()-bar.getWidth()*powerx)/2, 0,platform.getWidth()*powerx,platform.getHeight()*powery);
- batch.draw(bar,(Gdx.graphics.getWidth()-bar.getWidth()*powerx)/2,0,bar.getWidth()*progress/100f*powerx,bar.getHeight()*powery);
- }
- @Override
- public Actor hit(float arg0, float arg1) {
- // TODO Auto-generated method stub
- return null;
- }
- public ProgressBar(int x,int y) {
- super();
- //設定Actor的位置,這裡並沒有什麼用,純粹為了和大家介紹一下
- this.x=x;
- this.y=y;
- platform=new Texture(Gdx.files.internal("black.png"));
- bar=new Texture(Gdx.files.internal("green.png"));
- height=Gdx.graphics.getHeight();
- width=Gdx.graphics.getWidth();
- //做了一個簡單的適配,powerx和powery分別當前裝置解析度的權重,以現在主流的800*480為基準
- powerx=Gdx.graphics.getWidth()/800f;
- powery=Gdx.graphics.getHeight()/480f;
- }
- public void setProgress(float progress){
- this.progress=progress;
- }
- public void dispose() {
- // TODO Auto-generated method stub
- platform.dispose();
- bar.dispose();
- }
-
- }
複製代碼這裡對上面的變數和語句都做一個簡單的說明:Texture platform;Texture bar;前者是進度條的底座的圖片,而bar則代表進度條的圖片。 至於Actor中的draw()方法,這是一個系統自動調用的方法,描述這個演員Actor執行個體怎麼繪製,draw()方法並不需要我們人工去調用,而是在把Actor加入舞台Stage中後,在ApplicationListener的render()函數中不停地調用stage.draw(),系統會自動調用已經加入stage中的actor的draw()方法,也就將actor一起繪製出來了。具體請看:android遊戲開發架構libgdx的使用(四)--舞台和演員http://www.apkbus.com/android-19750-1-1.html
剩下的語句也很簡單,draw()中用SpriteBatch畫出了兩張圖,其中bar的繪製長度根據進度progress變化,也就產生了進度條的效果。
這次我們重寫一個ApplicationListener,再用AndroidApplication啟動,源碼還是在第三講的基礎上進行修改和添加。
- public class Progress implements ApplicationListener {
- ProgressBar bar;
- Stage stage;
- @Override
- public void create() {
- // TODO Auto-generated method stub
- bar=new ProgressBar(0,0);
- //建立一個舞台
- stage=new Stage(Gdx.graphics.getWidth(),Gdx.graphics.getHeight(), true);
- stage.addActor(bar);
- }
- @Override
- public void dispose() {
- // TODO Auto-generated method stub
- bar.dispose();
- }
- @Override
- public void pause() {
- // TODO Auto-generated method stub
- }
- @Override
- public void render() {
- // TODO Auto-generated method stub
- Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
- Gdx.gl.glClearColor(1f,1f,1f,0f);
- stage.act(Gdx.graphics.getDeltaTime());
- stage.draw();
- if(bar.progress<100)
- bar.progress+=0.5;
- //重新置零
- if(bar.progress==100)
- bar.progress=0;
- }
- @Override
- public void resize(int arg0, int arg1) {
- // TODO Auto-generated method stub
- }
- @Override
- public void resume() {
- // TODO Auto-generated method stub
- }
- }
複製代碼這裡相比之前的demo有一處變化:Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);Gdx.gl.glClearColor(1f,1f,1f,0f);大家可以看到我將清屏後的顏色置為(1,1,1,0),即為白色,大家可以在下面看到效果。再用AndroidApplication啟動:
- public class MyGame implements ApplicationListener {
- SpriteBatch batch;
- BitmapFont bf;
- ParticleEffect particle;
- ParticleEffect tem;
- ParticleEffectPool particlepool;
- ArrayList<ParticleEffect> particlelist;
- public void create () {
- // STUB
- batch=new SpriteBatch();
- bf=new BitmapFont();
- //初始化粒子變數
- particle = new ParticleEffect();
- particle.load(Gdx.files.internal("particle.p"), Gdx.files.internal(""));
- particlepool=new ParticleEffectPool(particle, 5, 10);
- particlelist=new ArrayList<ParticleEffect>();
- }
- public void render () {
- // STUB
- Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
- Gdx.gl.glClearColor(0f,0f,0f,0f);
- batch.begin();
- bf.draw(batch, "Testin Mkey libgdx(3)",Gdx.graphics.getWidth()*0.4f, Gdx.graphics.getHeight()/2);
- batch.end();
- if(true){
- if(Gdx.input.isTouched()){
- //當此觸摸點與上一觸摸點距離大於一定值的時候觸發新的粒子系統,由此減小系統負擔
- tem=particlepool.obtain();
- tem.setPosition(Gdx.input.getX(),Gdx.graphics.getHeight()-Gdx.input.getY());
- particlelist.add(tem);
- }
- batch.begin();
- for(int i=0;i<particlelist.size();i++){
- particlelist.get(i).draw(batch, Gdx.graphics.getDeltaTime());
- }
- batch.end();
-
- //清除已經播放完成的粒子系統
- ParticleEffect temparticle;
- for(int i=0;i<particlelist.size();i++){
- temparticle=particlelist.get(i);
- if(temparticle.isComplete()){
- particlelist.remove(i);
- }
- }
- }
- }
- public void resize (int width, int height) {
- // STUB
- }
- public void pause () {
- // STUB
- }
- public void resume () {
- // STUB
- }
- public void dispose () {
- // STUB
- batch.dispose();
- bf.dispose();
- //千萬別忘了釋放記憶體
- particle.dispose();
- if(tem!=null)
- tem.dispose();
- particlepool.clear();
- }
- }
複製代碼
運行即可,大功告成!附
福利圖:哈哈,下面是我的用libgdx寫的一個比較大的遊戲,還沒有完全寫好,可以先泄露一點諜照哦,如果大家喜歡Libgdx的話,請多多支援我的Testin杯libgdx系列教程,如果支援的人多而且大家都想要源碼的話,我考慮把源碼放出來供大家學習學習。
遊戲其實就是寵物養成遊戲,可以普通對戰及藍芽對戰,寵物進化等等。不知道大家能不能從源碼的名字中看出什麼功能來呢?哈哈這就是我用本篇的進度條寫的一個非同步載入的等待頁面,還沒有完善,先意思意思。諜照!!!