Bài 14: Tạm dừng Game và điều chỉnh âm lượng trong Game.

Thảo luận trong 'Điện thoại, viễn thông' bắt đầu bởi g08ct, 2/9/12.

  1. g08ct New Member

    g08ct

    Tham gia ngày:
    15/8/12
    Bài viết:
    1,116
    Đã được thích:
    55
    Điểm thành tích:
    0
    Giới tính:
    Nam
    Hi. Chào các bạn.

    Mấy hôm nhà không có mạng nên lần này post hơi chậm chút, mong cả nhà thông cảm.

    Bài này mình hướng dẫn các bạn cách tạm dừng game và điểu chỉnh âm lượng.

    Nội dung đơn giản như sau: Khi game đang chạy ta chạm vào màn hình, khi đó sẽ có 1 Dialog hiện thị ra cho bận chỉnh âm lượng, sau khi chỉnh xong ta nhấn OK đẻ kết thúc và game lại tiếp tục.

    Code:
    Main

    PHP Code:
    PHP:
    package Bai_14_e3droid.gioi
    import java.util.ArrayList

    import android.media.AudioManager
    import android.view.MotionEvent

    import com.e3roid.E3Activity
    import com.e3roid.E3Engine
    import com.e3roid.E3Scene
    import com.e3roid.drawable.sprite.AnimatedSprite
    import com.e3roid.drawable.texture.TiledTexture
    import com.e3roid.event.SceneUpdateListener

    //Để tạo được vòng lặp trong game ta cần implements SceneUpdateListener 
    public class Bai_14_e3droidActivity extends E3Activity implements SceneUpdateListener 

        private final static 
    int WIDTH  320
        private final static 
    int HEIGHT 480
         
        public 
    boolean isPause false
        public 
    int volume 15;//Max volume là 15 
        
    public AudioManager audioManager;//biến này đung để định lại âm thanh 
         
        //Khai báo 2 biến đê quản lý nhạc nền và âm thanh nổ 
        
    private Sound nhac_nen
        private 
    Sound no

         
        private 
    TiledTexture sunmonster;//Biến này để load ảnh nhé 
        
    private TiledTexture explosion
        private 
    AnimatedSprite[] sprite;// Cái này là cái mới nè.Mình khai báo 1 mảng AnimatedSprite.  
        //Cái này sẽ dùng để vẽ 1 cái mặt kiểu Yahoo ý, và 1 vụ nổ. 
         
         
        //Cài này dùng để cắt cái ảnh của mình ra để lấy từng Frame 1 
        
    private ArrayList<AnimatedSprite.FrameFrames_sunmonster  = new ArrayList<AnimatedSprite.Frame>(); 
        private 
    ArrayList<AnimatedSprite.FrameFrames_explosion  = new ArrayList<AnimatedSprite.Frame>(); 
         
        
    //--------------------------------------------------------------------------------------- 
        
    @Override 
        
    public E3Engine onLoadEngine() { 
            
    E3Engine engine = new E3Engine(thisWIDTHHEIGHT); 
            
    engine.requestFullScreen(); 
            
    engine.requestPortrait(); 
            return 
    engine
        } 

        
    //--------------------------------------------------------------------------------------- 
        
    @Override 
        
    public E3Scene onLoadScene() { 
             
            
    //Khởi tạo 2 biến quản lý âm thanh 
            
    nhac_nen = new Sound(thisR.raw.nhacnen); 
            
    no = new Sound(thisR.raw.no); 
             
            
    audioManager = (AudioManagerthis.getSystemService(Bai_14_e3droidActivity.AUDIO_SERVICE); 
             
            
    E3Scene scene = new E3Scene(); 
            
    scene.addEventListener(this); 
             
            
    //Cứ 30ms là làm tươi màn hình 1 lần 
            
    scene.registerUpdateListener(30this); 

            
    //Giờ ta sẽ khởi tạo các AnimatedSprite 
            
    sprite =  new AnimatedSprite[3];//Khai bảo mảng này có 3 phần tử 
             
            //Đặt các ảnh và các sprite và khởi tạo vị trí của sprite này 
            //Đặt cả 2 đối tượng này ở giữa theo trục x nhé. 
            
    int centerX = (getWidth()  - sunmonster.getTileWidth())  / 2;         
            
    sprite[0] = new AnimatedSprite(sunmonstercenterX50);//Cái này đặt vị trí y=50 
             
            
    centerX = (getWidth()  - explosion.getTileWidth())  / 2;     
            
    sprite[1] = new AnimatedSprite(sunmonstercenterXgetHeight()-50);//Cái này đặt ở cuối màn hình - 50 để bạn thấy nó luôn
             
             
            //Ở trên ta đã khởi tạo và đặt vị trí cho 2 sprite 
            //Giờ ta add frame vào cho sprite 
            
    sprite[0].animate(100Frames_sunmonster);//Cứ 100ms là vẽ 1 cái ảnh 
            
    sprite[1].animate(100Frames_sunmonster); 
             
            
    //Add xong frame rồi. giờ ta cho nó hiện thị thôi. 
            
    scene.getTopLayer().add(sprite[0]); 
            
    scene.getTopLayer().add(sprite[1]); 
             
            
    //Phần trên ta mới tạo ra 2 cái mặt cưới thồi. Giờ ta thêm 1 cái để làm vụ nổ nhé. 
            
    sprite[2] = new AnimatedSprite(explosion, (getWidth()  - explosion.getTileWidth())  / 2, (getHeight() - explosion.getTileWidth())  / 2);//Đặt nó vào vị trí trung tâm 
            //Add frame 
            
    sprite[2].animate(100Frames_explosion); 
             
            
    //Hiện thị 
            
    scene.getTopLayer().add(sprite[2]); 
            
    //Tạm thời ta cho ẩn sprite[2]ẩn đi. 
            
    sprite[2].hide(); 
             
            
    //Bắt đầu game thì ta bật nhạc nền. 
            
    nhac_nen.play(); 
            return 
    scene
        } 

        
    //--------------------------------------------------------------------------------------- 
        
    @Override 
        
    public void onLoadResources() { 
            
    /*TiledTexture(java.lang.String name, 
                    *int width, 
                    *int height, 
                    *int xindex, 
                    *int yindex, 
                    *int border, 
                    *Context context) 
            */ 
            //Tại sao lại là 192/6: chiều rộng thực tế của ảnh là 192 và trong đó có 6 cái ảnh nhỏ, mỗi ảnh nhỏ là 1 sprite 
            //nên ta mang chia cho 6 để lấy chiều rộng của 1 sprite 
            
    sunmonster = new TiledTexture("sunmonster.png"192/632000this);//Load ảnh mặt cười nè. 
             
             
            
    explosion = new TiledTexture("explosion.png"162/532000this);//Cái này là ảnh tạo ra vụ nổ. 
             
             
            //Ở đây ta thực hiện cắt lấy từng frame của 2 bức ảnh trên 
            
    Frames_sunmonster = new ArrayList<AnimatedSprite.Frame>(); 
            
    //Ta dùng phương thức add để lấy từng phần của bức ảnh nhé 
            //.add(new AnimatedSprite.Frame(chỉ số cột, chỉ số hàng)); Chỉ số bắt đầu là 0 nhé. 
            
    Frames_sunmonster.add(new AnimatedSprite.Frame(00));//Cột 0, hàng 0 
            
    Frames_sunmonster.add(new AnimatedSprite.Frame(10));//Cột 1, hàng 0 
            
    Frames_sunmonster.add(new AnimatedSprite.Frame(20));//Cột 2, hàng 0 
            
    Frames_sunmonster.add(new AnimatedSprite.Frame(30));//Cột 3, hàng 0 
            
    Frames_sunmonster.add(new AnimatedSprite.Frame(40));//Cột 4, hàng 0 
            
    Frames_sunmonster.add(new AnimatedSprite.Frame(50));//Cột 5, hàng 0 
             
             
            // cái này tương tự cái trên nhé. 
            
    Frames_explosion = new ArrayList<AnimatedSprite.Frame>(); 
            
    Frames_explosion.add(new AnimatedSprite.Frame(00)); 
            
    Frames_explosion.add(new AnimatedSprite.Frame(10)); 
            
    Frames_explosion.add(new AnimatedSprite.Frame(20)); 
            
    Frames_explosion.add(new AnimatedSprite.Frame(30)); 
            
    Frames_explosion.add(new AnimatedSprite.Frame(40)); 
             
        } 
        
    //--------------------------------------------------------------------------------------- 
        
    public boolean onSceneTouchEvent(E3Scene sceneMotionEvent motionEvent) { 
            
    //Khi chạm vào màn hình thì tắt nhạc nền 
            
    if(motionEvent.getAction() == MotionEvent.ACTION_DOWN){ 
                
    CusTomDialog dialog = new CusTomDialog(thisthis); 
                
    isPause true
                
    dialog.show(); 
            } 
            return 
    false
        } 
        
    //--------------------------------------------------------------------------------------- 
         
        /* 
         * Trong vòng lặp này ta sẽ cho 2 mặt cười di chuyển. một mặt di chuyển từ trên xuống, một mặt di chuyển từ dưới 
         * lên. Khi 2 mặt này chạm vào nhau thì có 1 vụ nổ. Khi sảy ra vụ nổ này thì 2 cái mặt cười sẽ biến mất*/ 
        
    @Override 
        
    public void onUpdateScene(E3Scene arg0long arg1) { 
            
    runOnUiThread(new Runnable() {             
                public 
    void run() { 
                    if(!
    isPause){ 
                        
    sprite[0].moveRelativeY(2); 
                        
    sprite[1].moveRelativeY(-2);//Mỗi lần ta di chuyển 2px 
                         
                         
                        
    if(sprite[0].collidesWith(sprite[1])){//Kiểm tra va chạm 
                            //Khi 2 mặt cười này chạm vào nhau ta ẩn 2 mặt cười này đi 
                            
    sprite[0].hide(); 
                            
    sprite[1].hide(); 
                             
                            
    //Ta cho hiện thị cái vụ nổ lên 
                            
    sprite[2].show(); 
                            
    //Khi hiện thị bom thì ta cho phát tiếng nổ.(Cho phép lặp lại) 
                            
    no.loop(); 
                        } 
                    } 
                } 
            }); 
             
        } 
    }  
    Điều đáng quan tâm trong dòng code trên là :
    public boolean isPause = false;
    public int volume = 15;//Max volume là 15
    public AudioManager audioManager;//biến này đung để định lại âm thanh

    Biến audioManager dùng để điều chỉnh âm lượng media.
    Muốn điều chỉnh âm lượng media các bạn cần gọi cái này
    audioManager = (AudioManager) this.getSystemService(Bai_14_e3droidActivity.AUDIO_SERVICE);


    Khi bạn click vào màn hình thì ta cho hiện thị dialog:
    CusTomDialog dialog = new CusTomDialog(this, this);// ở đây ta chuyền kèm theo lớp Bai_14...
    isPause = true;
    dialog.show();

    ta gán isPause = true để tạm dừng game tạm thời.

    File dialog.xml ta thiết kế như sau.
    PHP Code:
    PHP:
    package Bai_14_e3droid.gioi

    import android.app.Dialog
    import android.content.Context
    import android.media.AudioManager
    import android.view.View
    import android.widget.Button
    import android.widget.SeekBar
    import android.widget.SeekBar.OnSeekBarChangeListener

    public class 
    CusTomDialog extends Dialog implements android.view.View.OnClickListenerOnSeekBarChangeListener
        
    Bai_14_e3droidActivity activity
        
    Button ok
        
    SeekBar volume
        public 
    CusTomDialog(Context context Bai_14_e3droidActivity activity ) { 
            
    super(context); 
             
            
    this.activity activity
            
    setContentView(R.layout.dialog); 
             
            
    this.setTitle("Điều chỉnh âm lượng"); 
            
    ok = (Button)findViewById(R.id.ok); 
            
    ok.setText("Ok"); 
            
    ok.setOnClickListener(this);//Add sự kiện khi người dùng click vào button ok 
            
    volume = (SeekBar)findViewById(R.id.volume); 
            
    volume.setMax(15); 
            
    volume.setProgress(this.activity.volume); 
            
    volume.setOnSeekBarChangeListener(this); 
             
             
             
        } 
        @
    Override 
        
    public void onClick(View view) { 
            if(
    view.getId() ==R.id.ok){ 
                
    this.activity.isPause false
                
    CusTomDialog.this.dismiss();//Tắt bỏ dialog này 
            

             
        } 
        @
    Override 
        
    public void onProgressChanged(SeekBar arg0int arg1boolean arg2) { 
            
    //Khi bạn khéo hay click mà làm thay đổi trạng thái của Seekbar thì ta cập nhật lại giá trị volume 
            
    this.activity.volume volume.getProgress(); 
            
    this.activity.audioManager.setStreamVolume(AudioManager.STREAM_MUSICvolume.getProgress(), 1); 
             
        } 
        @
    Override 
        
    public void onStartTrackingTouch(SeekBar arg0) { 
            
    // TODO Auto-generated method stub 
             
        

        @
    Override 
        
    public void onStopTrackingTouch(SeekBar arg0) { 
            
    // TODO Auto-generated method stub 
             
        


    }  
    khi ta chuyền Bai_14... thì ta gán nó vào mà biến ta khai bào this.activity = activity;

    Âm lượng max của Android là 15 nên mình để mặc định thanh SeekBar là max.

    Khi bạn click vào button OK thì
    this.activity.isPause = false;//Game được chạy tiếp
    CusTomDialog.this.dismiss();//Tắt bỏ dialog này


    Hi. Có gì các bạn cứ comment mình sẽ commet trả lời nhé.

    Link download project:
    http://www.mediafire.com/?1lr5cybx7nb94m8

    Bài sau mình sẽ nói đế vấn đề sử dụng layout. Tại sao lại nói đến vấn đề này . Ví dụ bạn muốn viết 1 game nhưng nó chỉ hoạt động ở 1/10 của màn hình, còn 1 phần còn lại bạn dùng làm việc khác. Cái này là tùy biến.(Hihi).

    vangioicnt
    Nguồn: vietandroid


     
    2 people like this.
    Đang tải...
  2. tieutu_ht New Member

    tieutu_ht

    Tham gia ngày:
    7/4/13
    Bài viết:
    7
    Đã được thích:
    0
    Điểm thành tích:
    0
    Giới tính:
    Nam
    cái này là điều chỉnh mỗi âm lượng trong game, trong khi âm lượng của điện thoại ko thay đổi ah bạn ???
     

Chia sẻ trang này