Bài 16: Chuyển từ activity này sang activity khác và gửi kèm theo dữ liệu

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. Dạo này có chút việc nên up bài hơi chậm, các bạn thông cảm.

    Hôm này mình hướng dẫn các bạn làm 1 thứ mà trong game thực hiện rất nhiều, để chuyển các level trong game thì có nhiều cách,nhưng cách đơn giản nhất trong android là chuyển từ activity này sáng activity khác. Nội dung bài viết này đơn giản là: Khi bạn đang ở activity 1 bạn chạm vào màn hình thì ta chuyển sang activity 2. Số sprite vẽ trong activity 1 là 10 khi chuyển sang activity 2 sẽ là 50 sprite. Tắng số sprite để giúp các bạn thấy rằng dữ liệu ta chuyền theo là nhận được. Mình xử dụng lại code của bài 4 nhé.

    Code activity 1:

    PHP Code:

    PHP:
    package Bai_16_e3droid.gioi

    import android.content.Intent
    import android.view.MotionEvent

    import com.e3roid.E3Activity
    import com.e3roid.E3Engine
    import com.e3roid.E3Scene
    import com.e3roid.drawable.Sprite
    import com.e3roid.drawable.texture.AssetTexture
    import com.e3roid.drawable.texture.Texture
    import com.e3roid.event.SceneUpdateListener

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

        private final static 
    int WIDTH 320
        private final static 
    int HEIGHT 480

        
    // Khai báo mảng sprite có tên là robot 
        
    private Sprite[] robot

        
    // Khai báo 1 Texture. Đối tượng này để load ảnh lên 
        
    private Texture robotTexture

        
    // --------------------------------------------------------------------------------------- 
        
    @Override 
        
    public E3Engine onLoadEngine() { 
            
    E3Engine engine = new E3Engine(thisWIDTHHEIGHT); 
            
    engine.requestFullScreen(); 
            
    engine.requestPortrait(); 
            return 
    engine
        } 

        
    // --------------------------------------------------------------------------------------- 
        
    @Override 
        
    public E3Scene onLoadScene() { 

            
    E3Scene scene = new E3Scene(); 
            
    scene.addEventListener(this); 

            
    // Cứ 30ms là làm tươi màn hình 1 lần 
            
    scene.registerUpdateListener(30this); 

            
    // Khởi tạo đối tượng robot. 
            
    robot = new Sprite[10];// Khai báo mảng gồm 4 sprite 
            // Khởi tạo tứng sprite 
            
    for (int i 0robot.lengthi++) 
                
    robot[i] = new Sprite(robotTexture00);// Đặt toàn bộ ở vị trí 
                                                            // (0,0) 

            // add toàn bộ sprite vào màn hình. 
            
    for (int i 0robot.lengthi++) 
                
    scene.getTopLayer().add(robot[i]); 
            return 
    scene
        } 

        
    // --------------------------------------------------------------------------------------- 
        
    @Override 
        
    public void onLoadResources() { 
            
    // Load ảnh từ thư mục Asset 
            
    robotTexture = new AssetTexture("robot.png"this); 
        } 

        
    // --------------------------------------------------------------------------------------- 
        
    public void onUpdateScene(E3Scene arg0long arg1) { 
            
    runOnUiThread(new Runnable() { 
                public 
    void run() { 
                    
    dichuyen(robot);// Gọi phương thức di chuyển để làm cho 4 sprite 
                                    // di chuyển ngẫu nhiên nhưng 
                    // không di chuyển ra khỏi màn hình 
                

            }); 

        } 

        
    // --------------------------------------------------------------------------------------- 
        // Phương thức cho bạn 1 số ngẫu nhiên từ min->max. 
        
    public int getRandomIndex(int minint max) { 
            return (int) (
    Math.random() * (max min 1)) + min
        } 

        
    // --------------------------------------------------------------------------------------- 
        // Phương thức này sẽ làm di chuyển cả 4 sprite với hướng đi là ngẫu nhiên 
        
    public void dichuyen(Sprite[] sprite) { 
            for (
    int i 0sprite.lengthi++) { 
                
    int x getRandomIndex(-1010);// Ta lấy giá trị từ -10 -> 10 
                
    int y getRandomIndex(-1010); 

                
    // Kiểm tra xem nếu mà di chuyển theo x,y mà vẫn nằm trong màn hình 
                // thì cho di chuyển 
                
    if (sprite[i].getRealX() + getWidth() 
                        && 
    sprite[i].getRealX() + 
                        
    && sprite[i].getRealY() + getHeight() 
                        && 
    sprite[i].getRealY() + 0
                    
    sprite[i].moveRelative(xy); 
            } 

        } 

        @
    Override 
        
    public boolean onSceneTouchEvent(E3Scene sceneMotionEvent motionEvent) { 
             
            
    //Khi chạm vào màn hình thì tắt activity hiện tại và bật activity 2 lên 
            //Khi bật lên ta chuyền theo số sprite được vẽ 
             
            
    Intent i = new Intent(thisBai_16_e3droidActivity2.class); 
            
    i.putExtra("so_sprite"50);//Giá trị chuyền sang là 50 sprite 
            
    this.startActivity(i); 
            
    this.finish();//Tắt activity này 
            
    return false
        } 
    }
    Ở Activity 1 này chỉ có 1 chỗ cần quan tâm là:
    Intent i = new Intent(this, Bai_16_e3droidActivity2.class);
    i.putExtra("so_sprite", 50);//Giá trị chuyền sang là 50 sprite
    this.startActivity(i);
    this.finish();//Tắt activity này

    Ở đây là khai báo 1 intent là i, i.putextra là phương thức gắn kèm theo biến, ở đây là biến so_sprite, chú ý: đặt tên là gì thì phải nhớ, để khi sang activity 2 ta còn nhận dữ liệu.
    Khi ta chuyển sang activity 2 thì ta tắt activity 1 đi.

    Code activity 2:

    PHP Code:

    PHP:
    package Bai_16_e3droid.gioi

    import android.os.Bundle
    import android.view.MotionEvent

    import com.e3roid.E3Activity
    import com.e3roid.E3Engine
    import com.e3roid.E3Scene
    import com.e3roid.drawable.Sprite
    import com.e3roid.drawable.texture.AssetTexture
    import com.e3roid.drawable.texture.Texture
    import com.e3roid.event.SceneUpdateListener

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

        private final static 
    int WIDTH 320
        private final static 
    int HEIGHT 480

        
    // Khai báo mảng sprite có tên là robot 
        
    private Sprite[] robot

        
    // Khai báo 1 Texture. Đối tượng này để load ảnh lên 
        
    private Texture robotTexture

        
    // --------------------------------------------------------------------------------------- 
        
    @Override 
        
    public E3Engine onLoadEngine() { 
            
    E3Engine engine = new E3Engine(thisWIDTHHEIGHT); 
            
    engine.requestFullScreen(); 
            
    engine.requestPortrait(); 
            return 
    engine
        } 

        
    // --------------------------------------------------------------------------------------- 
        
    @Override 
        
    public E3Scene onLoadScene() { 

            
    E3Scene scene = new E3Scene(); 
            
    scene.addEventListener(this); 

            
    // Cứ 30ms là làm tươi màn hình 1 lần 
            
    scene.registerUpdateListener(30this); 

            
    //============================================================ 
            //Để nhận được dữ liệu từ activity 1 thì khai báo biến sau 
            
    Bundle b getIntent().getExtras();//Ta nhận lại intent activity 1 
            
    int so_sprite b.getInt("so_sprite");//Chú ý key phải giống nhau nhé 
             
            //============================================================ 
            // Khởi tạo đối tượng robot. 
            
    robot = new Sprite[so_sprite];//Khai báo số lượng sprite (50) 
            // Khởi tạo tứng sprite 
            
    for (int i 0robot.lengthi++) 
                
    robot[i] = new Sprite(robotTexture00);// Đặt toàn bộ ở vị trí 
                                                            // (0,0) 

            // add toàn bộ sprite vào màn hình. 
            
    for (int i 0robot.lengthi++) 
                
    scene.getTopLayer().add(robot[i]); 
            return 
    scene
        } 

        
    // --------------------------------------------------------------------------------------- 
        
    @Override 
        
    public void onLoadResources() { 
            
    // Load ảnh từ thư mục Asset 
            
    robotTexture = new AssetTexture("robot.png"this); 
        } 

        
    // --------------------------------------------------------------------------------------- 
        
    public void onUpdateScene(E3Scene arg0long arg1) { 
            
    runOnUiThread(new Runnable() { 
                public 
    void run() { 
                    
    dichuyen(robot);// Gọi phương thức di chuyển để làm cho 4 sprite 
                                    // di chuyển ngẫu nhiên nhưng 
                    // không di chuyển ra khỏi màn hình 
                

            }); 

        } 

        
    // --------------------------------------------------------------------------------------- 
        // Phương thức cho bạn 1 số ngẫu nhiên từ min->max. 
        
    public int getRandomIndex(int minint max) { 
            return (int) (
    Math.random() * (max min 1)) + min
        } 

        
    // --------------------------------------------------------------------------------------- 
        // Phương thức này sẽ làm di chuyển cả 4 sprite với hướng đi là ngẫu nhiên 
        
    public void dichuyen(Sprite[] sprite) { 
            for (
    int i 0sprite.lengthi++) { 
                
    int x getRandomIndex(-1010);// Ta lấy giá trị từ -10 -> 10 
                
    int y getRandomIndex(-1010); 

                
    // Kiểm tra xem nếu mà di chuyển theo x,y mà vẫn nằm trong màn hình 
                // thì cho di chuyển 
                
    if (sprite[i].getRealX() + getWidth() 
                        && 
    sprite[i].getRealX() + 
                        
    && sprite[i].getRealY() + getHeight() 
                        && 
    sprite[i].getRealY() + 0
                    
    sprite[i].moveRelative(xy); 
            } 

        } 

        @
    Override 
        
    public boolean onSceneTouchEvent(E3Scene sceneMotionEvent motionEvent) { 
             
                return 
    false
        } 
    }
    Phần quan trọng trong code activity 2 này là làm sao nhậ được giá trị từ activity 1:

    Code sau cho phép ta nhận dữ liệu từ activity 1:

    //Để nhận được dữ liệu từ activity 1 thì khai báo biến sau
    Bundle b = getIntent().getExtras();//Ta nhận lại intent activity 1
    int so_sprite = b.getInt("so_sprite");//Chú ý key phải giống nhau nhé

    Khá là đơn giản, bạn chỉ cần khai báo 1 biến kiểu Bundle sau đó getExtras , để nhận dữ liểu kiểu int thì ta dùng getInt. Khi activity
    put dạng string thì bạn dùng getString là ok.


    Để chạy được activity 2 thì các bạn cần có manifest như sau:
    PHP Code:

    PHP:
    <?xml version="1.0" encoding="utf-8"?> 
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
        package="Bai_16_e3droid.gioi" 
        android:versionCode="1" 
        android:versionName="1.0" > 

        <uses-sdk android:minSdkVersion="8" /> 

        <application 
            android:icon="@drawable/ic_launcher" 
            android:label="@string/app_name" > 
            <activity 
                android:name=".Bai_16_e3droidActivity" 
                android:label="@string/app_name" > 
                <intent-filter> 
                    <action android:name="android.intent.action.MAIN" /> 

                    <category android:name="android.intent.category.LAUNCHER" /> 
                </intent-filter> 
            </activity> 
            <!-- Thêm 1 activity mới --> 
            <activity android:name=".Bai_16_e3droidActivity2"></activity> 
        </application> 

    </manifest>
    Để chạy được ta thêm
    <!-- Thêm 1 activity mới -->
    <activity android:name=".Bai_16_e3droidActivity2"></activity>

    Như vậy với cách này chúng ta cỏ thể giái quyết vấn đề chuyển level, chuyển từ menu sang chơi game, từ game over sang hộp thoại nhập tên....Rất nhiều các dùng cái này.

    Mình cũng viết được 16 bài rồi nhưng toàn lý thuyết nên mình xin phép chạy trước. Sang bài 17 mình sẽ cùng các bạn xây dựng game đua xe đơn giản. Nội dung về game sẽ được mình gửi lên sớm nhất có thể. Chúc các bạn thành công.

    Link download project:
    http://www.mediafire.com/?s62vrzi33limm1i

    vangioicnt
    Nguồn: vietandroid





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

    HaiHack

    Tham gia ngày:
    15/1/13
    Bài viết:
    93
    Đã được thích:
    15
    Điểm thành tích:
    0
    Giới tính:
    Nam
    Nơi ở:
    Hanoi, Vietnam
    bài viết rất có ích, đang cần đoạn này
     

Chia sẻ trang này