Androidゲーム開発の爆発効果


AndroidゲームMagicBubbleの開発をしていた頃、2つのBubblesがつながっている間にBubbleが水泡で爆破される様子が消えてしまいました.この効果を実現するために、私は多くの資料を探して、いくつかの標準の実現の方面を見つけることができることを望んで、多くの時間を費やして、Androidがゲームの開発に関する資料が本当に少なすぎることに気づいて、更に標準のやり方は言うまでもなくて、仕方がなくて、自分の考えによってこの効果を実現するしかありません.
    私の考えはこうです(参考までに、もっと良い方法の友达が私たちと共有してほしい):FrameLayoutにImageViewを加えて、爆発のAnimationを定義して、必要がない时、ImageViewは隠れて、必要な时、ImageViewを必要な場所に移動して、startAnimation、このようにして、爆発の効果を実現することができます.
   以下は簡略化されたプログラムのコードで、プログラムの効果は以下の通りです:点中画面の任意の場所で、クリックした場所で爆発効果を表示します.
 
まず、アニメーションの定義です.フレームアニメーションを定義し、5フレームのアニメーションを順次再生します.1フレームあたりのアニメーションの持続時間は50ミリ秒です.
Xmlコード
  •     android:oneshot="true">  
  •       
  •       
  •       
  •       
  •          
  •   
  • <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
        android:oneshot="true">
        <item android:drawable="@drawable/explode1" android:duration="50" />
        <item android:drawable="@drawable/explode2" android:duration="50" />
        <item android:drawable="@drawable/explode3" android:duration="50" />
        <item android:drawable="@drawable/explode4" android:duration="50" />
        <item android:drawable="@drawable/explode5" android:duration="50" />  
    </animation-list>
    

     次にメイン・プログラム・コードです.
    Javaコード
  • package com.ray.bubble;   
  •   
  • import android.app.Activity;   
  • import android.content.Context;   
  • import android.graphics.drawable.AnimationDrawable;   
  • import android.os.Bundle;   
  • import android.view.MotionEvent;   
  • import android.view.View;   
  • import android.view.Window;   
  • import android.view.WindowManager;   
  • import android.view.View.OnTouchListener;   
  • import android.widget.FrameLayout;   
  • import android.widget.ImageView;   
  •   
  • public class BubbleExplosion extends Activity {   
  •     private FrameLayout fl;   
  •     private ExplosionView exv1;   
  •     private AnimationDrawable exa1;   
  •     public void onCreate(Bundle savedInstanceState) {   
  •         super.onCreate(savedInstanceState);   
  •         //set full screen   
  •         requestWindowFeature(Window.FEATURE_NO_TITLE);   
  •         getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN ,   
  •                       WindowManager.LayoutParams. FLAG_FULLSCREEN);   
  •         fl = new FrameLayout(this);   
  •         fl.setBackgroundResource(R.drawable.bg);   
  •            
  •         exv1 = new ExplosionView(this);   
  •         exv1.setVisibility(View.INVISIBLE);   
  •         exv1.setBackgroundResource(R.anim.explosion);   
  •         exa1 = (AnimationDrawable)exv1.getBackground();   
  •         fl.addView(exv1);   
  •         fl.setOnTouchListener(new LayoutListener());   
  •         setContentView(fl);   
  •     }   
  •        
  •     class ExplosionView extends ImageView{   
  •   
  •         public ExplosionView(Context context) {   
  •             super(context);   
  •         }   
  •         //handle the location of the explosion   
  •         public void setLocation(int top,int left){   
  •             this.setFrame(left, top, left+40, top+40);   
  •         }      
  •     }   
  •        
  •     class LayoutListener implements OnTouchListener{   
  •   
  •         public boolean onTouch(View v, MotionEvent event) {   
  •             //firstly, u have to stop the animation,if the animation   
  •             //is starting ,u can not start it again!   
  •             exv1.setVisibility(View.INVISIBLE);   
  •             exa1.stop();   
  •             float x = event.getX();   
  •             float y = event.getY();   
  •             exv1.setLocation((int)y-20, (int)x-20);   
  •             exv1.setVisibility(View.VISIBLE);   
  •             exa1.start();   
  •             return false;   
  •         }   
  •            
  •     }   
  • }  
  • package com.ray.bubble;
    
    import android.app.Activity;
    import android.content.Context;
    import android.graphics.drawable.AnimationDrawable;
    import android.os.Bundle;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.Window;
    import android.view.WindowManager;
    import android.view.View.OnTouchListener;
    import android.widget.FrameLayout;
    import android.widget.ImageView;
    
    public class BubbleExplosion extends Activity {
    	private FrameLayout fl;
    	private ExplosionView exv1;
    	private AnimationDrawable exa1;
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //set full screen
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN ,
                          WindowManager.LayoutParams. FLAG_FULLSCREEN);
            fl = new FrameLayout(this);
            fl.setBackgroundResource(R.drawable.bg);
            
            exv1 = new ExplosionView(this);
    		exv1.setVisibility(View.INVISIBLE);
    	    exv1.setBackgroundResource(R.anim.explosion);
    	    exa1 = (AnimationDrawable)exv1.getBackground();
    		fl.addView(exv1);
    		fl.setOnTouchListener(new LayoutListener());
            setContentView(fl);
        }
        
        class ExplosionView extends ImageView{
    
    		public ExplosionView(Context context) {
    			super(context);
    		}
    		//handle the location of the explosion
    		public void setLocation(int top,int left){
    			this.setFrame(left, top, left+40, top+40);
    		}	
        }
        
        class LayoutListener implements OnTouchListener{
    
    		public boolean onTouch(View v, MotionEvent event) {
    			//firstly, u have to stop the animation,if the animation
    			//is starting ,u can not start it again!
    			exv1.setVisibility(View.INVISIBLE);
    			exa1.stop();
    			float x = event.getX();
    			float y = event.getY();
    			exv1.setLocation((int)y-20, (int)x-20);
    			exv1.setVisibility(View.VISIBLE);
    			exa1.start();
    			return false;
    		}
        	
        }
    }

     AndroidのSurface Viewに合わせて、Animationは良い移行効果を実現できます.Surface Viewの使い方は簡単です.参考にしてください.
    http://rayleung.javaeye.com/blog/420410
  • BubbleExplosion.rar (163.5 KB)