Chuyển từ activity này sang activity khác và gửi kèm theo dữ liệu [e3droid]
07/08/2012
FacebookTwitterDeliciousStumbleuponDiggMyspaceLinkedInZingmegovnlinkhay


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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
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(this, WIDTH, HEIGHT);
        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(30, this);
        // 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 = 0; i < robot.length; i++)
            robot[i] = new Sprite(robotTexture, 0, 0);// Đặt toàn bộ ở vị trí
                                                        // (0,0)
        // add toàn bộ sprite vào màn hình.
        for (int i = 0; i < robot.length; i++)
            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 arg0, long 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 min, int 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 = 0; i < sprite.length; i++) {
            int x = getRandomIndex(-10, 10);// Ta lấy giá trị từ -10 -> 10
            int y = getRandomIndex(-10, 10);
            // 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() + x < getWidth()
                    && sprite[i].getRealX() + x > 0
                    && sprite[i].getRealY() + y < getHeight()
                    && sprite[i].getRealY() + y > 0)
                sprite[i].moveRelative(x, y);
        }
    }
    @Override
    public boolean onSceneTouchEvent(E3Scene scene, MotionEvent 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(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
        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:
code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
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(this, WIDTH, HEIGHT);
        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(30, this);
        //============================================================
        //Để 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 = 0; i < robot.length; i++)
            robot[i] = new Sprite(robotTexture, 0, 0);// Đặt toàn bộ ở vị trí
                                                        // (0,0)
        // add toàn bộ sprite vào màn hình.
        for (int i = 0; i < robot.length; i++)
            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 arg0, long 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 min, int 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 = 0; i < sprite.length; i++) {
            int x = getRandomIndex(-10, 10);// Ta lấy giá trị từ -10 -> 10
            int y = getRandomIndex(-10, 10);
            // 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() + x < getWidth()
                    && sprite[i].getRealX() + x > 0
                    && sprite[i].getRealY() + y < getHeight()
                    && sprite[i].getRealY() + y > 0)
                sprite[i].moveRelative(x, y);
        }
    }
    @Override
    public boolean onSceneTouchEvent(E3Scene scene, MotionEvent 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:
code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="utf-8"?>
    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. SourceCode