Lập trình đa phương tiện (Multimedia) trên nền tảng Android

Mục tiêu của đề tài là xây dựng chương trình minh họa trò chơi đối kháng (cờ caro) giữa hai người trên hai máy điện thoại android tận dụng server IRC, vì thế đỏi hỏi phải xây dựng được con robot hỗ trợ các giao thức cho game đối kháng và cụ thể là game cờ ca rô sử dụng giao thức trên. Con bot đóng vai trò là client IRC, nó sẽ giải quyết vấn đề quản lý người dùng game online trên server IRC và truyền tải thông tin đến user. Ứng dụng demo là một chương trình chơi game đánh cờ ca rô, sử dụng giao thức cài đặt trên con bot và kết nối vào server irc để chơi game. Ứng dụng phải nối kết vào đúng server và đúng channel của bot khởi tạo. Nhược điểm lớn nhất của chương trình là khi server irc chết hoặc con robot thoát khỏi channel thì toàn bộ hệ thống chơi game bị tê liệt, và đó cũng là nhược điểm lớn chung của game online.

docx102 trang | Chia sẻ: lvcdongnoi | Lượt xem: 4264 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Lập trình đa phương tiện (Multimedia) trên nền tảng Android, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
hoặc onDestroy() nếu activity đang bỏ. Trạng thái của activity có thể bị giết bởi hệ thống. Phương thức: onDestroy() Được gọi trước khi activity bị hủy. Đó là lần gọi cuối cùng mà activity này được nhận. Nó được gọi khác bởi vì activity đang hoàn thành, hoặc bởi vì hệ thống tạm thời hủy để tiết kiệm vùng nhớ. Bạn có thể phân biệt giữa hai kịch bản với phương isFinshing(). Trạng thái của activity có thể được giết bởi hệ thống. XML TRONG ANDROID Không giống như lập trình java thông thường, lập trình Android ngoài các lớp được viết trong *.java còn sử dụng XML để thiết kế giao diện cho ứng dụng. Nền tảng Android là một nền tảng phát triển di động mã nguồn mở. Nó giúp bạn truy cập vào tất cả các khía cạnh của thiết bị di động mà nó chạy trên đó, từ các đồ họa cấp thấp, đến phần cứng như là thiết bị camera trên điện thoại. Với rất nhiều thứ có thể sử dụng Android, có thể bạn sẽ tự hỏi tại sao bạn cần tìm hiểu đến XML. Đó không phải vì làm việc với XML rất thú vị, mà là nó đang làm việc với những thứ mà nó kích hoạt. XML thường được dùng như là một định dạng dữ liệu trên Internet. Nếu bạn muốn truy cập dữ liệu từ Internet, các khả năng có thể là dữ liệu sẽ ở dạng XML. Nếu bạn muốn gửi dữ liệu đến một dịch vụ Web, có thể bạn cũng cần gửi cả dữ liệu XML. Nói ngắn gọn là nếu ứng dụng Android của bạn thúc đẩy Internet, thì có thể bạn sẽ cần phải làm việc với XML. Thật may mắn là bạn có rất nhiều lựa chọn có sẵn để làm việc với XML trên Android. Một trong những ưu điểm lớn nhất của nền tảng Android chính là việc nó thúc đẩy ngôn ngữ lập trình Java. Android SDK không hoàn toàn cung cấp sẵn mọi thứ cho Môi trường Thời gian chạy Java (JRE) chuẩn của bạn, nhưng nó lại hỗ trợ một phần rất đáng kể cho nó. Nền tảng Java đã và đang hỗ trợ rất nhiều cách khác nhau để làm việc với XML trong thời gian nhất định, và hầu hết các API có liên quan đến XML của Java đều được hỗ trợ đầy đủ trên Android. Ví dụ, Simple API của Java cho XML (SAX) và Document Object Model (DOM) hiện đều có sẵn trên Android. Nhiều năm qua, cả hai API này là một phần của công nghệ Java. Sản phẩm Streaming API mới đây cho XML (StAX) hiện chưa có trong Android. Tuy nhiên, Android lại cung cấp một thư viện tương đương về mặt chức năng. Điều cuối cùng là Java XML Binding API cũng không có sẵn trong Android. Chắc chắn có thể thực hiện API này trong Android. Tuy nhiên, nó lại có xu hướng là một API nặng ký, với rất nhiều thể hiện khác nhau thuộc các lớp khác nhau thường cần việc trình bày một tài liệu XML. Do vậy mà nó không lý tưởng lắm cho một môi trường bị ràng buộc chẳng hạn như thiết bị cầm tay mà Android được thiết kế để chạy trên đó. Cũng giống như các ứng dụng WPF trong .NET hiện nay (XAML), khi lập trình ứng dụng ta thiết kế giao diện bằng XML và cài đặt các xử lý khi tương tác với giao diện trong code. Tất nhiên bạn hoàn toàn có thể thiết kế 1 giao diện như ý muốn mà không cần tới bất cứ 1 dòng XML nào, nhưng sử dụng XML sẽ đơn giản công việc đi rất nhiều. Đồng thời sử dụng XML sẽ giúp việc chỉnh sửa ứng dụng sau này trở nên dễ dàng. Trong Android, các Layout được dùng để quản lý các thành phần giao diện khác theo 1 trật tự nhất định. Bạn có thể sử dụng các Layout để dễ dàng đặt các đối tượng cần thiết vào ứng dụng. · FrameLayout: FrameLayout được dùng để bố trí các đối tượng theo kiểu giống như là các Layer trong Photoshop. Những đối tượng nào thuộc Layer bên dưới thì sẽ bị che khuất bởi các đối tượng thuộc Layer nằm trên. FrameLayer thường được sử dụng khi muốn tạo ra các đối tượng có khung hình bên ngoài chẳng hạn như contact image button. Ví dụ: <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Day la dong thu 1" android:textSize="10dip" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Day la dong thu 2" android:textSize="20dip" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Day la dong thu 3" android:textSize="30dip" /> Kết quả: Hình 2.22: FrameLayout · LinearLayout: thêm các thành phần con theo 1 chiều nhất định (ngang hoặc dọc). Đây là layout được sử dụng nhiều nhất. Ví dụ: <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Day la dong thu 1" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Day la dong thu 2" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Day la dong thu 3" /> Kết quả: Hình 2.23: LinearLayout · RelativeLayout: Layout này cho phép bố trí các widget theo một trục đối xứng ngang hoặc dọc. Để đặt được đúng vị trí thì các widget cần được xác định một mối ràng buộc nào đó với các widget khác. Các ràng buộc này là các ràng buộc trái, phải, trên, dưới so với một widget hoặc so với layout parent. Dựa vào những mối ràng buộc đó mà RetaliveLayout cũng không phụ thuộc vào kích thước của screen thiết bị. Ngoài ra, nó còn có ưu điểm là giúp tiết kiệm layout sử dụng nhằm mục đích giảm lượng tài nguyên sử dụng khi load đồng thời đẩy nhanh quá trình xử lý. Hình 2.24: RelativeLayout Ví dụ: Kết quả: Hình 2.25: RelativeLayout · TableLayout: Layout này được sử dụng khi cần thiết kế một table chứa dữ liệu hoặc cần bố trí các widget theo các row và column. Chẳng hạn như, giao diện của một chiếc máy tính đơn giản hoặc một danh sách dữ liệu. Hình 2.26: TableLayout Ví dụ: Kết quả: Hình 2.27: TableLayout AbsoluteLayout: Layout này được sử dụng để bố trí các widget vào một vị trí bất kì trong layout dựa vào 2 thuộc tính toạ độ x, y. Tuy nhiên, kiểu layout này rất ít khi được dùng bởi vì toạ độ của các đối tượng luôn cố định và sẽ không tự điều chỉnh được tỷ lệ khoảng cách giữa các đối tượng. Khi chuyển ứng dụng sang một màn hình có kích thước với màn hình thiết kế ban đầu thì vị trí của các đối tượng sẽ không còn được chính xác như ban đầu. Layout được sử dụng nhằm mục đích thiết kế giao diện cho nhiều độ phân giải. Thường khi lập trình nên kết hợp nhiều layout với nhau để tạo ra giao diện bạn mong muốn. MULTIMEDIA Ngày nay, người sử dụng điện thoại di động không chỉ để thực hiện những cuộc gọi thông thường mà họ còn sử dụng điện thoại cho nhiều việc khác như: chatting, lướt web, nghe nhạc, xem video và xem tivi trực tuyến. Trong phần này chúng ta sẽ nghiên cứu thiết bị di động sử dụng hệ điều hành Android để phát một tập tin audio, xem video, và ghi âm. Nền tảng Android cung cấp sẵn bộ mã hóa và giải mã đa dạng cho các định dạng phương tiện truyền thông. Do đó bạn có thể dễ dàng tích hợp âm thanh, video, và hình ảnh vào các ứng dụng của bạn. Việc truy cập vào nền tảng các phương tiện truyền thông là khá đơn giản bằng cách sử dụng các thành phần tạo nên Android như Intent và Activity. Android cho phép bạn phát âm thanh và video từ một số kiểu nguồn dữ liệu. Bạn có thể phát âm thanh và video từ các tập tin media được lưu trữ trong nguồn tài nguyên của ứng dụng (raw resources), từ các tập tin độc lập trong hệ thống tập tin, hoặc từ một dòng dữ liệu nhận được từ một kết nối mạng. Để phát âm thanh, video và hình ảnh từ những ứng dụng ta sử dụng lớp MediaPlayer (MediaPlayer class). Nền tảng Android cũng cho phép ta ghi lại âm thanh và video, nơi được hỗ trợ bởi phần cứng của thiết bị di động. Để ghi âm thanh hoặc video ta sử dụng MediaRecorder class. Lưu ý rằng các bộ giả lập không có các phần cứng để hỗ trợ ghi lại âm thanh hoặc video nhưng trên thực tế các thiết bị di động hỗ trợ các khả năng này rất tốt và được truy cập thông qua MediaRecorder class. Android hỗ trợ các định dạng đa phương tiện như sau: Phát lại, tải về và xử lí các định dạng âm thanh, hình ảnh bao gồm: 3GPP, MPEG-4, AAC, MP3. Mã hóa và giải mã các định dạng video, hình ảnh ảnh với các định dạng: MPEG-4, H.263, AVC(H.264), và JPEG. Bộ mã hóa/giải mã tiếng nói ảnh với các định dạng: AMR-NB và AMR-WB. Bộ mã hóa/giải mã âm thanh ảnh với các định dạng: MP3, AAC, và AAC+, WMA. Ghi lại video, hình ảnh với các định dạng: 3GPP, MPEG-4, JPEG. Trong thực tế thì chỉ có OGG, WMA, và MP3 làm việc tốt trong bộ giả lập, nhưng WMA thì có dung lượng và tốc độ rất lớn nên ít được sử dụng. Vì vậy, để phát triển tốt các ứng dụng trên bộ giả lập ta nên sử dụng hai định dạng: OGG và MP3 (mono cho thoại và stereo cho âm nhạc) OGG sẽ làm việc tốt cho các video clip ngắn và âm thanh cho trò chơi. Về khả năng tương thích, thiết bị sử dụng hệ điều hành Android sẽ hỗ trợ tốt các multimedia codecs sau. Name Encoder Decoder Details File/Container format Audio AAC LC/LTP X Mono/Stereo content in any combination of standard bit rates up to 160 kbps and sampling rates between 8 to 48kHz 3GPP (.3gp) and MPEG-4 (.mp4, .m4a). No support for raw AAC (.aac) HE-AACv1 ( AAC+) X HE-AACv2(ehanced AAC+) X AMR-NB X X 4.75 to 12.2 kbps sampled @ 8kHz 3GPP (.3gp) AMR-WB X 9 rates from 6.60 kbit/s to 23.85 kbit/s sampled @ 16kHz 3GPP (.3gp) MP3 X Mono/Stereo 8-320Kbps constant (CBR) or variable bit-rate (VBR) MP3 (.mp3) MIDI X MIDI Type 0 and 1. DLS Version 1 and 2. XMF and Mobile XMF. Support for ringtone formats RTTTL/RTX, OTA, and iMelody Type 0 and 1 (.mid, .xmf, .mxmf). Also RTTTL/RTX (.rtttl, .rtx), OTA (.ota), and iMelody (.imy) Ogg Vorbis X Ogg (.ogg) PCM X 8- and 16-bit linear PCM (rates up to limit of hardware) WAVE (.wav) Image JPEG X X base+progressive GIF X PNG X X BMP X Video H.263 X X 3GPP (.3gp) files H.264 X 3GPP (.3gp) and MPEG-4 (.mp4) files MPEG4 Simple Profile X 3GPP (.3gp) file Giới thiệu gói android.media Cung cấp các lớp quản lý giao diện truyền thông khác nhau. Media APIs được sử dụng để phát tập tin MP3, và các tập tin media khác như: nhạc chuông, hiệu ứng âm thanh trò chơi. Về video: nó được sử dụng để phát một đoạn video xem trực tiếp từ web hoặc từ bộ lưu trữ cục bộ. Và trong một số trường hợp nó sẽ cho phép ghi lại các tập tin media. Các lớp đặc biệt khác trong gói android.media cung cấp khả năng nhận dạng khuôn mặt người dùng trong file ảnh (FaceDetector), điều khiển âm thanh định tuyến. Và đưa ra các cảnh báo điều khiển như: nhạc chuông và thiết bị rung (AudioManager). Một số lớp quan trọng hỗ trợ lập trìnnh multimedia trong gói android.media Tên lớp Mô tả AudioFormat Lớp này được sử dụng để truy cập vào một số định dạng âm thanh các hằng số cấu hình của kênh âm thanh. AudioManager Cung cấp các phương thức truy cập để điều khiển âm lượng và chế độ chuông. AudioRecord Hỗ trợ ghi lại âm thanh từ phần cứng của thiết bị. CamcorderProfile Được sử dụng để thiết lập cấu hình cho camera, cho các ứng dụng máy ảnh. CameraProfile Được sử dụng để lưu lại những hình ảnh chụp bằng camera của thiết bị với định dạng và chất lượng ảnh chụp được thiết lập trong ứng dụng máy ảnh. JetPlayer Cung cấp các phương thức truy cập để kiểm soát và phát tập tin media với JET engine. MediaMetadataRetriever Hỗ trợ trao đổi dữ liệu với đa phương tiện với các thiết bị khác. MediaPlayer Kiểm soát việc phát các tập tin media và các dòng dữ liệu media. MediaRecorder Hỗ trợ ghi lại audio và video. Ringtone Cung cấp các phương thức nhanh nhất để phát một nhac chuông, thông báo, hoặc các dạng khác của âm thanh. RingtoneManager Cung cấp các phương thức để truy cập, kiểm soát việc phát nhạc chuông, thong báo hoặc các dạng khác của âm thanh. SoundPool Quản lý và phát tài nguyên âm thanh cho các ứng dụng. Giới thiệu class android.media.MediaPlayer Sơ đồ dưới đây cho thấy các chu kỳ sống và các hàm chức năng được cài đặt sẵn trong lớp MediaPlayer để điều khiển việc phát các tập tin audio/video. Các hình bầu dục sẽ đại diện cho các trạng thái của các hàm chức năng trong lớp MediaPlayer. Có hai loại vòng cung, loại vòng cung với một mũi tên đại diện cho phương thức gọi đồng bộ, loại vòng cung với hai mũi tên đại diện cho phương thức gọi không đồng bộ. Hình 2.28: Sơ đồ lớp android.media.MediaPlayer Từ sơ đồ trạng thái trên người ta có thể thấy một đối tượng MediaPlayer có các trạng thái sau đây: Tên trạng thái Mô tả Idle Khi một đối tượng MediaPlayer được tạo mới hoặc sau khi gọi hàm reset() nó sẽ ở trạng thái Idle, đó là trạng thái rỗi. Intialized Sau khi gọi hàm setDataSource() để thiết lập dữ liệu, thiết bị sẽ chuyển sang trạng thái khởi tạo. Prepairing Trạng thái đang chuẩn bị. Gọi các hàm hệ thống để thiết bị chuyển sang trạng thái sẵn sàng phục vụ. Prepaired Trạng thái đã được chuẩn bị. Thiết bị đã sẵn sàng phục vụ. Started Trạng thái bắt đầu thực hiện việc phát lại một tập tin media. Paused Trạng thái tạm dừng phát tập tin media. Stopped Trạng thái dừng phát tập tin media. Playback Completed Hoàn thành việc phát lại tập tin media. Từ đây ta có thể thực hiện việc phát lại hoặc chuyển tới trạng thái dừng. End Trạng thái kết thúc. Giải phóng các tài nguyên hệ thống phục vụ việc phát tập tin media. Error Trạng thái lỗi. Một số phương thức thường được sử dụng: Giá trị trả về Tên phương thức chức năng static MediaPlayer create(Context context, int resid) Phương thức khởi tạo đối tượng MediaPlayer cho một tài nguyên nhất định. static MediaPlayer create(Context context, Uri uri) Phương thức khởi tạo đối tượng MediaPlayer cho một Uri. int getAudioSessionId() Trả về ID của phiên audio. Id sẽ là 0 nếu xảy ra lỗi. int getCurrentPosition() Lấy về vị trí hiện tại khi đang phát tập tin media. Vị trí này cho ta biết phát tập tin media đã phát được bao nhiêu mili giây. int getDuration() Lấy về tổng thời gian phát của tập tin media. int getVideoHeight() Trả về chiều cao của tập tin video. Giá trị sẽ là 0 nếu không có tập tin video nào được thiết lập cho đối tượng MediaPlayer. int getVideoWidth() Trả về chiều rộng của tập tin video. Giá trị sẽ là 0 nếu không có tập tin video nào được thiết lập cho đối tượng MediaPlayer. boolean isLooping() Kiểm tra đối tượng MediaPlayer có đang được thiết lập vòng lặp hay không. boolean isPlaying() Kiểm tra đối tượng MediaPlayer có đang được phát hay không. void pause() Tạm dừng việc phát lại. void prepare() Chuẩn bị, đồng bộ thiết bị để thực hiện phát tập tin media. void prepareAsync() Chuẩn bị, đồng bộ thiết bị để thực hiện phát tập tin media. Khi bạn gọi prepareAsync() việc phát tập tin media sẽ được phát mà không sử dụng bộ đệm. void release() Giải phóng các nguyên của đối tượng MediaPlayer. void reset() Khởi tạo lại đối tượng MediaPlayer. void seekTo(int msec) Thực hiện phát tập tin media tại một vị trí thời gian mong muốn. Giá trị là 0 tại thời điểm bắt đầu phát. void setDataSource(String path) Thiết lập nguồn dữ liệu. void setDataSource(Context context, Uri uri) Thiết lập nguồn dữ liệu gồm: bối cảnh phát lại, và địa chỉ URI của nguồn dữ liệu void setLooping(boolean looping) Thiết lập việc phát lặp lại hay không lặp lại. void setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener) Thiết lập kích cỡ hiển thị video. void setVolume(float leftVolume, float rightVolume) Thiết lập âm lượng cho thiết bị. void start() Bắt đầu phát hoặc tiếp tục phát sau khi dừng. void stop() Dừng phát tập tin media. Playing audio, video Android hỗ trợ âm thanh và phát các tập tin media bởi lớp MediaPlayer trong gói android.media. Bây giờ chúng ta thử làm một ví dụ để phát một tập tin âm thanh trên Android. Phần mềm sẽ có chức năng phát một tập tin media có sẵn trong ứng dụng ở đây là tập tin tên take.mp3 đã được đưa vào thư mục res/raw. Bấm phím giữa để phát bài hát, bấm phím xuống để dừng. Chúng ta bắt đầu tạo một Android project với các thông số như sau: Project name: Audio Build target: Android 1.6 Application name: Audio Package name: cit.lean Creative activity: Audio Hình 2.29: new android project Sau khi tạo xong project, ta chép tập tin mp3 vào thư mục res/raw bằng cách kéo tập tin và thả vào thư mục res/raw. Đoạn code ví dụ: import android.app.Activity; import android.media.AudioManager; import android.media.MediaPlayer; import android.os.Bundle; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; public class Audio extends Activity { MediaPlayer mp = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); setVolumeControlStream(AudioManager.STREAM_MUSIC); } @Override // bat su kien tu cac nut bam public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_DPAD_DOWN: mp.pause(); break; case KeyEvent.KEYCODE_DPAD_CENTER: play(); break; default: return super.onKeyDown(keyCode, event); } return true; } public void play(){ if(mp!=null){mp.stop();} mp = MediaPlayer.create(this, R.raw.take); mp.start(); } } Trong ví dụ trên ta khai báo biến mp để kế thừa lớp MediaPlayer. Khai báo mp = MediaPlayer.create(this, R.raw.take); dùng để lấy tập tin take.mp3 từ nguồn tài nguyên của phần mềm, sau đó sử dụng hàm start() để phát bài hát, dùng hàm pause() để tạm dừng bài hát và dùng hàm release() để giải phóng tài nguyên. Ngoài ra ta còn sử dụng phương thức onKeyDown() để bắt lấy sự kiện nhấn các phím trên bàn phím của điện thoại. Để phát một tập tin media từ tài nguyên hệ thống (bộ nhớ điện thoại, thẻ nhớ) hay từ một tập tin trên web cũng tương tự như phát từ tài nguyên của phần mềm chỉ khác ở điểm ta sẽ sử dụng hàm setDataSource(PATH_TO_FILE). Để đưa đường dẫn đến tập tin cần phát, sau khi sử dụng setDataSource() ta phải sử dụng try – catch để bắt lỗi. Và sử prepare() để gọi thiết bị sẵn sàng phát âm thanh. Đoạn code sẽ có thay đổi như sau: import java.io.IOException; import android.app.Activity; import android.media.AudioManager; import android.media.MediaPlayer; import android.os.Bundle; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; public class Audio extends Activity { MediaPlayer mp = new MediaPlayer(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); setVolumeControlStream(AudioManager.STREAM_MUSIC); } @Override // bat su kien tu cac nut bam public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_DPAD_DOWN: mp.pause(); mp.release(); break; case KeyEvent.KEYCODE_DPAD_CENTER: try { play(); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } break; default: return super.onKeyDown(keyCode, event); } return true; } public void play() throws Exception, IllegalStateException, IOException{ mp.setDataSource("/sdcard/take.mp3"); mp.prepare(); mp.start(); } } Một ví dụ về phát tập tin video từ thẻ nhớ của thiết bị. Lưu ý trong file XML dùng để thiết kế giao diện phải có thẻ thẻ này là khung hình video dùng để hiển thị lên màn hình: Code main.xml: <FrameLayout xmlns:android="" android:layout_width="fill_parent" android:layout_height="fill_parent"> <VideoView android:id="@+id/video" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_gravity="center" /> Code lớp Video: import android.app.Activity; import android.os.Bundle; import android.widget.VideoView; public class Video extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Fill view from resource setContentView(R.layout.main); VideoView video = (VideoView) findViewById(R.id.video); // Load and start the movie video.setVideoPath("/sdcard/samplevideo.3gp"); video.start(); } } Giới thiệu lớp android.media.MediaRecorder Để ghi lại một tập tin audio ta sử dụng lớp MediaRecorder. Tương tự lớp MediaPlayer ta có sơ đồ sau: Hình 2.30: sơ đồ lớp android.media.Mediarecorder Các phương thức được sử dụng để ghi lại audio hoặc video: Giá trị trả về Tên phương thức Chức năng int getAudioFormat() Trả về định dạng âm thanh. int getAudioSource() Trả về nguồn ghi âm thanh. Có thể là VOICE_CALL, MIC, CAMCORDER. int getChannelConfiguration() Trả về cấu hình của kênh âm thanh. static int getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat) Trả về kích thước bộ đệm tối thểu, cần thiết để tạo thành công một đối tượng AudioRecord. void release() Giải phóng các tài nguyên thuộc AudioRecord. void startRecording() Bắt đầu ghi. void stop() Kết thúc ghi. int getState() Trả về trạng thái ghi âm. Điều này cho ta biết tài nguyên phần cứng đã đảm bảo hỗ trợ việc ghi lại hay chưa. Để ghi lại một tập tin media từ thiết bị ta thực hiện các bước sau: Khởi tạo một đối tượng android.media.MediaRecorder. Thiết lập nguồn âm thanh được sử dụng để ghi âm. Nếu phương thức này không được gọi, các tập tin kết quả sẽ không chứa các rãnh âm thanh (audio track). Sử dụng MediaRecorder.setAudioSource(). Thiết lập định dạng tập tin đầu ra sử dụng MediaRecorder.setOutputFormat(). Thiết lập tên tập tin đầu ra sử dụng MediaRecorder.setOutputFile(). Thiết lập mã hóa audio sử dụng MediaRecorder.setAudioEncoder(). Gọi MediaRecorder.prepare(), nhằm làm cho thiết bị sẵn sàng để mã hóa dữ liệu. Bắt đầu ghi âm, gọi hàm MediaRecorder.start(). Dừng ghi âm, gọi hàm MediaRecorder.stop(). Khi bạn hoàn thành làm việc với đối tượng MediaRecorder thì gọi hàm MediaRecorder.release() để giải phóng nguồn tài nguyên hệ thống ngay tức thì. GIỚI THIỆU VỀ ANDROID GRAPHICS Đồ họa Android được hỗ trợ bởi một thư viện đồ họa tùy chỉnh 2D và OpenGL ES1.0 làm cho đồ họa 3D đạt hiệu suất cao. Phổ biến nhất là đồ họa 2D APIs có thể tìm thấy trong các gói dựng sẵn. OpenGL APIs có sẵn từ các gói Khronos OpenGL ES, cộng với một số tiện ích Android OpenGL. Khi bắt đầu một dự án, điều quan trọng nhất để xem xét là nhu cầu đồ họa trong dự án của bạn cần đạt được những gì. Mỗi một nhu cầu đồ họa khác nhau sẽ được thực hiện tốt nhất với một kỹ thuật khác. Ví dụ như: đồ họa và hình ảnh động trong một ứng dụng tĩnh sẽ được thực hiện rất khác so với đồ họa và hình ảnh động cho một trò chơi tương tác hoặc sự biểu diễn hình ảnh 3D. Ở đây tôi chỉ thảo luận một vài trong số các tùy chọn và nhiệm vụ mà bạn có để vẽ đồ họa trên Android. Các thông tin dưới đây đề cập đến việc làm thế nào để vẽ với một Canvas. Để biết thêm các thông tin về tiện ích đồ họa 3D của Android (cung cấp bới OpenGL ES API), bạn nên tham khảo các tài liệu OpenGL khác. Các lựa chọn khi vẽ đồ họa Khi vẽ đồ họa 2D trên Android bạn thường lựa chọn một trong hai cách sau: - Cách thứ nhất: Vẽ đồ họa hoặc hình ảnh động của bạn thành một đối tượng View từ layout của bạn. Theo cách này, các bản vẽ và hình ảnh động sẽ được xử lý bởi quá trình vẽ phân cách của lớp View. Ở đây bạn chỉ cần xác định các đồ họa đi vào bên trong các View. Cách này là sự lựa chọn tốt nhất khi bạn muốn vẽ một đồ họa đơn giản không thay đổi thường xuyên, và không phải là một phần của trò chơi cần nhiều hiệu suất. Ví dụ: bạn nên vẽ đồ họa của bạn thành một View khi bạn muốn hiển thị một hình ảnh đồ họa tĩnh hoặc một hình ảnh động đã được xác định, trong một ứng dụng tĩnh. - Cách thứ hai: vẽ đồ họa của bạn trực tiếp đến một Canvas. Bằng cách này bạn phải gọi các phương thức thuộc những lớp vẽ thích hợp. Ta sử dụng cách này khi các ứng dụng của bạn thường xuyên được vẽ. Về cơ bản, bất kỳ trò chơi nào cũng được vẽ với Canvas. Vẽ với Canvas Khi bạn viết một ứng dụng mà bạn muốn thực hiện bảng vẽ chuyên ngành và kiểm soát các hoạt hình đồ họa bạn nên vẽ thông qua một Canvas. Một Canvas như là một giao diện, với bề mặt giao tiếp là các hình vẽ đồ họa của bạn đã được đưa lên phía trên và bản vẽ đồ họa của bạn thực sự được thực hiện khi các Bitmap được đặt vào màn hình. Các phương thức trong Canvas cho phép bạn vẽ các đường thẳng, các hình chử nhật, các hình tròn, hoặc các đồ họa khác tùy ý. Hệ thống trục tọa độ Hệ thống tọa độ cho lớp Canvas có tâm tọa độ là điểm trái trên của thiết bị. Giá trị x tăng dần về phía phải, giá trị y tăng dần khi đi xuống phía dưới. Khi vẽ độ dày bút vẽ là một điểm ảnh. Các phương thức sau đây sẽ giúp xác định chiều rộng và chiều cao của canvas: int getWidth(): xác định chiều rộng của canvas. int getHeight (): xác định chiều cao của canvas. Chiều rộng và chiều cao của Canvas cũng đại diện cho toàn bộ diện tích khung vẽ có thể trên thiết bị trình bày. Nói cách khác, bạn không thể chỉ định kích thước cho canvas, mà phần mềm trên một thiết bị sẽ trả về diện tích lớn nhất có thể có đối với một thiết bị cho trước. Các thành phần cơ bản Vẽ trên Canvas, bạn cần bốn thành phần cơ bản để vẽ, các thành phần này thuộc gói android.graphics: + Một Bitmap để giữ các điểm ảnh. + Một Canvas để gọi các hàm vẽ. + Một bản vẽ gốc như: Rect, Path, text, Bitmap. + Một Paint chứa các option liên quan để mô tả màu sắc, kiểu dáng cho các hình vẽ, độ dày nét vẽ, khử răng cưa hay không, chế độ vẽ FILL (tô đầy cả hình) hay chế độ vẽ STROKE (chỉ vẽ đường bao ngoài). Để sử dụng Canvas để vẽ bạn cần tạo ít nhất hai class. Một class là Activity đây là class chính. Ví dụ: class GoMoKuGame.java package lean.game.gomoku; import android.app.Activity; import android.os.Bundle; public class GoMoKuGame extends Activity {     @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);     //Gán nội dung khung nhìn là thể hiện của lớp GraphicsView         setContentView(new GoMoKuView(this));     } }  Một class chứa các lệnh để vẽ trên Canvas. Ví dụ: class GoMoKuView.java import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Bitmap; import android.graphics.Paint.Style; import android.view.View; public class GoMoKuView extends View {  public GraphicsView(Context context) { //Contructor để tạo một View từ CODE   super(context);  } } Sử dụng đối tượng Bitmap android.graphics.BitmapFactory khởi tạo đối tượng Bitmap từ các nguồn khác nhau như: tập tin lưu trữ, dòng dữ liệu nhận từ mạng hay từ các mảng byte. Ví dụ: khởi tạo một Bitmap BitmapFactory bt = new BitmapFactory(); Ta có phương thức sau dùng để gán một tài nguyên hình ảnh vào Bitmap. public static Bitmap decodeResource (Resources res, int id) res: các đối tượng tài nguyên có chứa hình ảnh (có thể là tài nguyên của phần mêm, tài nguyên của thiết bị hoặc dòng dữ liệu từ mạng). id: id của dữ liệu hình ảnh. Ví dụ: Khởi tạo đối tượng Bitmap từ tập tin hình ảnh có tên là a64 được lưu trữ trong Drawable. Bitmap img = BitmapFactory.decodeResource(getResources(), R.drawable.a64); Sử dụng đối tượng Paint Khởi tạo biến Paint: Paint cPaint = new Paint(); Khởi tạo biến Paint cho phép khử răng cưa: Paint picpaint = new Paint(Paint.ANTI_ALIAS_FLAG); Thông số: Paint.ANTI_ALIAS_FLAG cho phép đối tượng của Paint có khả năng khử răng cưa. Sử dụng phương thức để thiết đặt màu sắc cho biến Paint: public void setColor (int color); Thông số: int color giá trị màu sắc được cài đặt sẵn trong lớp Color hoặc giá trị được định nghĩa bởi người lập trình trong XML. Ví dụ: cPaint.setColor(Color.YELLOW); Thông số: Color.YELLOW giá trị màu đã được cài đặt sẵn trong lớp Color. Hoặc: cPaint.setColor(getResources().getColor(R.color.background2)); Thông số: getResources().getColor(R.color.background2) giá trị về màu sắc được khai báo trong XML. Set cỡ chữ: public void setTextSize (float textSize); Thông số: float textSize kích cỡ của chữ. Ví dụ: tPaint.setTextSize(20); Tạo phong cách cho Paint: public void setStyle (Paint.Style style); Thông số: Paint.Style Phong cách sẽ được qui định cụ thể có thể là FILL, STROKE hoặc cả hai. Mặc định là FILL. Ví dụ: cPaint.setStyle(Style.STROKE); Tạo một thể hiện của lớp Path Lớp PATH dùng để bao quanh vùng cần vẽ. Path circle = new Path(); Thêm một đường tròn public void addCircle (float x, float y, float radius, Path.Direction dir); Thông số: float x, float y dựa vào x, y để xác định tâm của đường tròn. float radius bán kính đường tròn. Path.Direction dir Chiều vẽ của đường tròn . Theo chiều kim đồng hồ Direction.CW ngược chiều kim đồng hồ là Direction.CCW. Thêm một đường hình bầu dục public void addOval (RectF oval, Path.Direction dir); Thông số: RectF oval các giới hạn của của hình bầu dục. Path.Direction dir Chiều vẽ của hình bầu dục . Theo chiều kim đồng hồ Direction.CW ngược chiều kim đồng hồ là Direction.CCW. Thêm một hình chữ nhật public void addRect (RectF rect, Path.Direction dir); Thông số: RectF oval: các giới hạn của của hình chữ nhật. Path.Direction dir: Chiều vẽ của hình chữ nhật . Theo chiều kim đồng hồ Direction.CW ngược chiều kim đồng hồ là Direction.CCW. Phương thức thêm một hình chữ nhật với các vị trí xác định: public void addRect (float left, float top, float right, float bottom, Path.Direction dir); Thông số: float left vị trí cạnh trái của hình chữ nhật. float top vị trí cạnh trên của hình chữ nhật. float right vị trí cạnh phải của hình chữ nhật. float bottom vị trí cạnh dưới của hình chữ nhật. Path.Direction dir Chiều vẽ của hình chữ nhật . Theo chiều kim đồng hồ Direction.CW ngược chiều kim đồng hồ là Direction.CCW. Ví dụ: Thêm một đường tròn và theo chiều kim đồng hồ cho PATH có tâm tại tọa độ x=150, y =150 với bán kính là 100px. Theo chiều kim đồng hồ Direction.CW circle.addCircle(150,150,100,Direction.CW); Sử dụng Canvas để vẽ các đường hình học Các phương thức cơ bản thường sử dụng trên lớp Canvas: Tên phương thức Mô tả void drawARGB(int a, int r, int g, int b) Điền toàn bộ khung vẽ Canvas với các giá màu ARGB. void drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint) Vẽ một hình vòng cung, vòng cung này sẽ nằm bên trong một hình bầu dục. void drawBitmap(int[] colors, int offset, int stride, float x, float y, int width, int height, boolean hasAlpha, Paint paint) Xử lý mảng quy định màu sắc như Bitmap và vẽ nó. void drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint) Vẽ bitmap theo quy định của đối tượng matrix. void drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint) Vẽ đối tượng bitmap theo quy định và tự động chia tỷ lệ để điền vào hình chử nhật đích. void drawBitmap(Bitmap bitmap, float left, float top, Paint paint) Vẽ bitmap theo quy định tại vị trí phía trên và bên trái. void drawCircle(float cx, float cy, float radius, Paint paint) Vẽ vòng tròn, với các đặc tính của Paint. void drawColor(int color) Lấp kín tòan bộ Canvas với một màu quy định. void drawLine(float startX, float startY, float stopX, float stopY, Paint paint) Vẽ một đừơng thẳng với tọa độ điểm bắt đầu và kết thúc của trục tung, trục hòanh xác định, mang các đặc tính của Paint. void drawLines(float[] pts, Paint paint) void drawLines(float[] pts, int offset, int count, Paint paint) Vẽ một lọat các đường thẳng void drawOval(RectF oval, Paint paint) Vẽ hình bầu dục mang các đặc tính của Paint void drawPaint(Paint paint) Lấp kín tòan bộ Canvas với đặc tính của Paint. void drawPath(Path path, Paint paint) Vẽ đường PATH với các đặc tính của Paint. void drawPicture(Picture picture, RectF dst) Vẽ hình ảnh, điều chỉnh kích thước để lắp đầy hình chữ nhật. void drawPicture(Picture picture) Lưu lại trạng thái canvas, vẽ hình ảnh, và khôi phục lại trình trạng canvas. void drawPoint(float x, float y, Paint paint) Vẽ một điểm duy nhất với các đặc tính của Paint. void drawPoints(float[] pts, int offset, int count, Paint paint) Vẽ một chuỗi các điểm, với đặc tính của Paint. void drawPoints(float[] pts, Paint paint) Vẽ toàn bộ mảng. void drawPosText(String text, float[] pos, Paint paint) Vẽ tất cả các văn bản trong mảng, vị trí của mỗi ký tự được quy định trong mảng pos và mang các đặc tính của Paint. void drawRGB(int r, int g, int b) Lấp kín toàn bộ canvas bởi giá trị màu RGB. void drawRect(float left, float top, float right, float bottom, Paint paint) Vẽ hình chử nhật với toạ độ vị trí của phía bên trái, trên, phải, dưới và mang các đặc tính của Paint. void drawRect(RectF rect, Paint paint) Vẽ hình chữ nhật với, với đặc tính của Paint được tô đầy hình chử nhật. void drawRoundRect(RectF rect, float rx, float ry, Paint paint) Vẽ hình chử nhật với các bóc được làm tròn. void drawText(String text, float x, float y, Paint paint) Vẽ văn bản với x,y là toạ độ vị trí vẽ chuỗi. chuỗi được vẽ mang các đặc tính của Paint. void drawText(CharSequence text, int start, int end, float x, float y, Paint paint) Vẽ chuỗi ký tự với chỉ số của ký tự đầu tiên và chỉ số ký tự cuối cùng được vẽ. Quy định toạ độ của điểm xuất phát. Chuỗi được vẽ theo quy định của Paint. void drawText(char[] text, int index, int count, float x, float y, Paint paint) Vẽ mảng ký tự. Quy định toạ độ của điểm xuất phát. Chuỗi được vẽ theo quy định của Paint. void drawText(String text, int start, int end, float x, float y, Paint paint) Vẽ văn bản với chỉ số của ký tự đầu tiên và chỉ số ký tự cuối cùng được vẽ. Quy định toạ độ của điểm xuất phát. Chuỗi được vẽ theo quy định của Paint. void drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint) Vẽ văn bản với đặc tính của Paint và dọc theo Path. void drawTextOnPath(char[] text, int index, int count, Path path, float hOffset, float vOffset, Paint paint) Vẽ văn bản với đặc tính của Paint và dọc theo Path. void drawVertices(Canvas.VertexMode mode, int vertexCount, float[] verts, int vertOffset, float[] texs, int texOffset, int[] colors, int colorOffset, short[] indices, int indexOffset, int indexCount, Paint paint) Vẽ mảng của các đỉnh của tam giác. final Rect getClipBounds() Lấy giới hạn clip. boolean getClipBounds(Rect bounds) Lấy giới hạn clip. Trả về giá trị true, false. void getMatrix(Matrix ctm) Trả về ma trận được chuyển đổi hiện tại. final Matrix getMatrix() Trả về một ma trận mới là bản sao của ma trận hiện hành trên lớp Canvas. int getWidth() Trả về giá trị chiều ngang của màn hình thiết bị. boolean isHardwareAccelerated() Cho biết canvas này có sử dụng tăng tốc phần cứng hay không. void restore() Được sử dụng để loại bỏ tất cả các trạng thái clip/ma trận kể từ lần gọi hàm save() lần cuối cùng. void rotate(float degrees) Xoay ma trận. final void rotate(float degrees, float px, float py) Xoay ma trận. int save() Giữ ma trận và clip hiện tại vào hàng đợi riêng. int save(int saveFlags) Giữ ma trận và clip hiện tại vào hàng đợi riêng ở một thời điểm nhất định. void setBitmap(Bitmap bitmap) Chỉ định một bitmap để vẽ vào canvas void setDensity(int density) Chỉ đinh mật độ bitmap cho canvas void skew(float sx, float sy) Làm nghiêng ma trận. void translate(float dx, float dy) Dịch chuyển tịnh tiến ma trận hiện tại. CHƯƠNG 3 PHẦN ỨNG DỤNG ĐẶC TẢ BÀI TÓAN Nếu như vài năm trước đây, người dùng điện thoại di động thường chỉ có các trò đơn giản như rắn ăn táo hay xếp hình trên những mẫu điện thoại Nokia hay Sony Ericsson thông dụng thì giờ đây mọi việc đã hoàn toàn khác biệt. Những người dùng hiện nay không còn phải chơi những trò chơi trên giấy như cờ ca rô mà đã có cả một thế giới game di động với hàng trăm ngàn tựa hấp dẫn. Ngày nay hệ thống mạng Internet được phát triển rộng khắp, việc sử dụng điện thoại để truy cập vào Internet có thể thực hiện thật dễ dàng nên việc chơi game online trên điện thoại di động không chỉ là nhu cầu giải trí đơn thuần, mà đang dần trở thành một xu hướng. Song song với đó là sự ra đời của vô vàn những thiết bị với bộ xử lý ngày càng nhanh hơn và bộ xử lý đồ họa rời sẽ tạo điều kiện cho những trò chơi có hình ảnh đẹp hơn và phong phú hơn về nội dung tạo sức hút cao đến người dùng. Nhằm tận dụng sức mạnh của hệ thống server IRC (Internet Relay Chat) miễn phí, cùng với sự ra đời nền tảng Android hỗ trợ game di động với độ phân giải cao, màn hình rộng, kết nối Internet mọi nơi mọi lúc và chức năng cảm ứng trên điện thoại di động. Bài toán đặt ra là: xây dựng một game đối kháng đánh cờ ca rô online chạy trên nền tảng Android và tận dụng sức mạnh của hệ thống IRC server. Tôi sẽ thực hiện bài toán trên cùng với nhóm thực hiện luận văn đã nêu trên (ở chương 1) công việc cụ thể của tôi là thiết kế giao diện người dùng và xây dựng game đánh cờ ca rô. TRÒ CHƠI ĐÁNH CỜ CA RÔ Đánh cờ ca rô là một trò chơi đối kháng khá quen thuộc đối với chúng ta, rất thích hợp để giải trí nhẹ nhàng dành cho cho mọi người từ các bé, học sinh, sinh viên, giới công chức văn phòng,... Game đánh cờ ca rô, một trò chơi rất đơn giản nhưng lại đòi hỏi nhiều sự thông minh và tính toán nước đi khéo léo ở người chơi. Cờ carô là một trò chơi rất thông dụng trên toàn thế giới dưới những cái tên khác nhau: cờ carô, gomoku, renju, nought and crosses, croix-zero, five-in-a-row, connect5, itsutsu-ishi, gobang, piskvorky, kolko i kyzyk. Luật chơi cũng có đôi chỗ khác nhau, nhưng luật cơ bản là hai bên thay phiên nhau đi những nước đi bằng các dấu X, O (hoặc bằng các quân cờ đen, trắng, xanh, đỏ) trên bàn cờ 15x15 ô, bên nào có đường 5 quân liền nhau trên một hàng, một cột hoặc một đường chéo là thắng. MỤC TIÊU CẦN ĐẠT ĐƯỢC Xây dựng game đánh cờ ca rô hỗ trợ hai người chơi. Tích hợp âm thanh vào game. Thiết kế các hàm, phương thức trong game hỗ trợ nhận dữ liệu từ mạng, hướng đến chức năng chơi đối kháng game ca rô online trên thiết bị. Thiết kế các form hỗ trợ việc đăng ký, đăng nhập, thay đổi mật khẩu, danh sách người chơi, … phục vụ cho chơi game online. Cài đặt thành công giao thức trò chơi đối kháng dựa trên khung nền IRC. HƯỚNG GIẢI QUYẾT Làm quen với lập trình trên nền tảng Android. Xây dựng kịch bản game, các chức năng của hệ thống. Thiết kế các form, giao diện cho ứng dụng. Xây dựng game đánh cờ ca rô. Xây dựng các hàm chức năng hỗ trợ chơi online. SƠ ĐỒ USECASE, SƠ ĐỒ CLASS Sơ đồ user case, sơ đồ class giữa các thành phần giao diện Hình 3.1: Sơ đồ usecase của hệ thống Hình 3.2: Sơ đồ class mức khái niệm mối quan hệ giữa các Activity Thông tin các Class Class GoMoKu Đây là class hiển thị giao diện menu chính của game. Tại class này ứng dụng sẽ tự động kết nối với server IRC bằng một nickname ngẫu nhiên. Class BackgroundProgress Class thực hiện các service xử lý việc lưu thông dữ liệu trên mạng. Class BackgroundProgress Class thực hiện các service xử lý việc lưu thông dữ liệu trên mạng. Class About Class dùng để hiển thị thông tin liên quan đến phiên bản ứng dụng, thông tin về những người thực hiện ứng dụng này. Class Register Class dùng để đăng ký thông tin thành viên. Tại class này bạn sẽ vào kênh đăng ký trên server IRC và thực hiện các lệnh trong protocol để đăng ký thành viên. Class Login Class dùng để đăng nhập hệ thống chơi game. Tại class này bạn sẽ vào kênh đăng nhập trên server IRC và thực hiện các lệnh trong protocol để đăng nhập hệ thống chơi game. Class Online Hiển thị danh sách người chơi, và cho phép người dùng sử dụng các chức năng như: mời chơi, xem thông tin những người khác và chat. Class ChangePass Thực hiện các lệnh trong protocol để thay đổi mật khẩu thành viên. Class GetPass Thực hiện các lệnh trong protocol để lấy lại mật khẩu thành viên. Class Chat Thực hiện các lệnh trong protocol để các các thành viên có thể chat với nhau trên server IRC. Class TabPlay Hiển thị dưới dạng tab. Class GoMoKuGame Hình 3.3: Class GoMoKuGame Class này sẽ thông qua các phương thức để thực hiện việc lưu tọa độ quân cờ, kiểm tra thắng thua và đổi lượt đi. Các phương thức quan trọng trong class GoMoKuGame: doNewGame(): khởi tạo một mảng rổng để chứa tọa độ các quân cờ. winner(): Kiểm tra nước cờ vừa đi có dẫn đến chiến thắng hay không. count(): đếm số quân cờ theo chiều dọc, ngang, và đường chéo hỗ trợ cho hàm winner. getTile(): lấy tọa độ quân cờ tại vị trí nào đó trên màn hình thiết bị. setTile(): định một con cờ vào một vị trí nhất định. checkWin(): gọi hiển thị giao diện chào mừng và gởi tin nhắn thông báo kết quả cho BOT. gamePlay(): nhận tọa độ con cờ, ghi con cờ vào mảng và gọi hàm kiểm tra chiến thắng. Class GoMoKuView Đây là cửa sổ giao diện của ứng dụng. Nhận tọa độ từ mạng thông qua các lớp xử lý mạng sau đó vẽ lại bàn cờ. Class Tool Thay đổi kích thước hình ảnh cho phù hợp với bàn cờ. ĐẶC TẢ CHỨC NĂNG Chức năng đăng ký thông tin Mô tả chức năng: Cho phép người dùng đăng ký làm thành viên của hệ thống chơi game đánh cờ ca rô online trên thiết bị Android. Mô tả hoạt động: Người dùng sẽ điền đầy đủ thông tin vào form Register. Sau đó ứng dụng sẽ tổng hợp thông tin gởi lên kênh Register (đây là một kênh chat trên server IRC). Tại kênh Register này BOT (IRC client: làm nhiệm vụ lưu trữ thông tin, điều khiển việc đăng ký đăng nhập và chơi cờ trên server IRC) sẽ nhận thông tin đăng ký, kiểm tra nếu thông tin mà thiết bị gởi lên hợp lệ BOT sẽ lưu trữ thông tin vào cơ sở dữ liệu. Chức năng đăng nhập Mô tả chức năng: Giúp người dùng chứng thực thông tin đăng nhập vào hệ thống chơi game ca rô online. Mô tả hoạt động: Người dùng điền thông tin đăng nhập bao gồm: username và password vào form LOGIN, ứng dụng sẽ lấy thông tin gửi lên BOT, BOT kiểm tra thông tin đăng và gửi thông báo trạng thái đăng nhập về cho người dùng. Chức năng lấy lại mật khẩu đã mất Mô tả chức năng: Cho phép người dùng lấy lại thông tin mật khẩu khi người dùng quên hoặc bị mất mật khẩu đã đăng ký với hệ thống trước đó. Mô tả hoạt động: Người dùng sẽ điền đầy đủ thông tin vào form Get Password, ứng dụng sẽ gửi thông tin này lên BOT kiểm tra, nếu thông tin hợp lệ, BOT sẽ thay thể mật khẩu hiện có trên hệ thống bằng một mật khẩu mới, sau đó gửi thông tin mật khẩu và tên đăng nhập về Email của người dùng. Chức năng thay đổi mật khẩu Mô tả chức năng: Giúp người dùng thay đổi mật khẩu đăng nhập vào hệ thống để chơi game. Mô tả hoạt động: Người dùng sẽ điền đầy đủ thông tin username, password, confirm password. Sau đó ứng dụng sẽ gởi thông tin lên BOT và cập nhật lại mật khẩu. Chức năng chơi cờ ca rô online Mô tả chức năng: Chơi cờ ca rô online trên server IRC với người dùng khác trên hai thiết bị sử dụng nền tảng Android. Chức năng chat Người dùng có thể chat với nhau thông qua hệ thống IRC được tích hợp sẵn trên ứng dụng. Chức năng xem thông tin người chơi Người dùng có thể xem thông tin như: cấp độ, nickname, email những người cùng chơi. QUÁ TRÌNH ĐÁNH CỜ CA RÔ ONLINE CỦA HAI NGƯỜI CHƠI Bước Me: chính mình You: bạn cùng chơi cờ 1 Đồng ý chơi cờ. Đồng ý chơi cờ. 2 Bàn cờ rỗng sẽ được khởi tạo. Bàn cờ rỗng sẽ được khởi tạo. 3 Đánh một quân cờ Chờ quân cờ từ me. 4 Gởi tọa độ quân cờ cho you Nhận quân cờ, hiển thị lên màn hình. 5 Chờ nhận quân cờ từ you. Đánh một quân cờ. 6 Nhận quân cờ và hiển thị lên màn hình. Gởi tọa độ quân cờ cho me. 7 Lặp lại các bước trên cho đến khi một bên giành được thắng lợi sẽ gởi tin nhắn báo kết quả lên BOT xử lý kết quả. VẼ BÀN CỜ Vẽ bàn cờ khi ở chế độ online Hình 3.3: Sơ đồ tuần tự vẽ bàn chơi game online Bước Nội dung 1 Tại class GoMoKuGame.java: Gọi hàm doNewGame(int i) để khởi tạo bàn cờ, với i là giá trị người chơi hiện tại, i sẽ có 2 giá trị tồn tại là RED = 1 và BLUE = 2. Sử dụng lớp MediaPlayer để phát nhạc nền. Đưa các giá trị trong mảng board về empty, các giá trị trong mảng này bao gồm các giá trị 1 và 2 tương ứng với từng quân cờ được thể hiện trên bàn cờ. 2 Khai báo biến Gameview là một đối tượng của lớp GoMoKuView. Gọi setContentView(gameView); gán nội dung khung nhìn là thể hiện của lớp GoMoKuView. 3 Class GoMoKuView: chứa các phương thức, các hàm dùng để vẽ giao diện game, các hàm bắt xsự kiện, các phương thức để gửi nhận dữ liệu qua socket. 4 Nhận một luồng dữ liệu. Xác nhận việc đồng ý chơi cờ với đối phương và kiểm tra xem đối phương có được quyền đánh quân cờ đầu tiên hay không: Nếu phải thì tiến hành nhận tọa độ quân cờ và gọi hàm để vẽ bàn cờ với sự xuất hiện của quân cờ đối phương. Ngược lại sẽ gọi phương thức onDraw(Canvas canvas) để vẽ lên canvas một bàn cờ rỗng. 5 Tại phương thức onDraw(Canvas canvas) sẽ thực hiện: Vẽ bàn cờ. Gọi phương thức getTile(int i, int j) để lấy các giá trị trong mảng board[] (mảng chứa giá trị là vị trí quân cờ trên bàn cờ) vẽ lên bàn cờ hình ảnh của các quân cờ tương ứng. Vẽ một hình vuông nhỏ là ô định vị bằng với ô đánh cờ cho biết vị trí nơi ta vừa đánh cờ hoặc sắp đánh cờ. 6 Bắt các sự kiện từ phím cứng và chạm vào màn hình: Khi bấm các phím cứng: lên, xuống, qua, lại ô định vị sẽ di chuyển và lấy tọa độ. Khi bấm phím cứng giữa hoặc phím enter hoặc chạm vào màn hình. Hàm select() sẽ được gọi để lấy tọa độ tại nơi đó, sau đó truyền tọa độ vào phương thức playGame (int selX, int selY) với selX, selY lần lượt là tọa độ trên màn hình x, y. 7 Gọi phương thức playGame(int selX, int selY) Trong phương thức playGame() sẽ diễn ra các sự kiện sau: Gán quân cờ hiện tại vào mảng board[]. Kiểm tra xem nước cờ đó người chơi có thắng hay không. Nếu thắng thì hiện thông báo thắng thua, gởi tin nhắn kết quả đên bot xử lý kết quả -> dừng game. Ngược lại thì tiếp tục các bước sau. Xem bàn cờ còn ô trống không, nếu không thì -> ván cờ hòa. Nếu người chơi hiện tại là 1 thì chuyển thành 2 và ngược lại. Sau khi chạy xong hàm playGame(), ta dùng hàm invalidate(); để gọi lại onDraw() để vẽ lại bàn cờ với giá trị mảng board[] mới được cập nhật từ hàm playGame(); bàn cờ sẽ hiện thêm quân cờ mà ta vừa đánh. 8 Ứng dụng sẽ gửi một tin nhắn: TURN selX selY đến người cùng chơi. 9 Trên ứng dụng của mình sẽ tạo một thread mới để chờ tin nhắn trả lời từ người cùng chơi. Khi nhận được tin nhắn của người cùng chơi dạng TURN selX selY thì ta sẽ phân tích tin nhắn lấy tọa độ, gọi lại phương thức playGame(), gọi hàm invalidate() giống như trên để hiển thị con cờ của người cùng chơi lên màn hình. 10 Lặp lại bước 6 GIỚI THIỆU CON ROBOT (BOT) Mục tiêu của đề tài là xây dựng chương trình minh họa trò chơi đối kháng (cờ caro) giữa hai người trên hai máy điện thoại android tận dụng server IRC, vì thế đỏi hỏi phải xây dựng được con robot hỗ trợ các giao thức cho game đối kháng và cụ thể là game cờ ca rô sử dụng giao thức trên. Con bot đóng vai trò là client IRC, nó sẽ giải quyết vấn đề quản lý người dùng game online trên server IRC và truyền tải thông tin đến user. Ứng dụng demo là một chương trình chơi game đánh cờ ca rô, sử dụng giao thức cài đặt trên con bot và kết nối vào server irc để chơi game. Ứng dụng phải nối kết vào đúng server và đúng channel của bot khởi tạo. Nhược điểm lớn nhất của chương trình là khi server irc chết hoặc con robot thoát khỏi channel thì toàn bộ hệ thống chơi game bị tê liệt, và đó cũng là nhược điểm lớn chung của game online. GIAO DIỆN GAME ĐÁNH CỜ CA RÔ Form đăng ký thành viên. Form đăng nhập. Form dùng để thay đổi mật khẩu. Form lấy lại mật khẩu mới nếu bạn quên mật khẩu. Giao diện chơi game ở chế độ chơi online Khi chơi online bạn có thể chat với bạn cùng chơi bằng cách chọn tab Chat. Giao diện cửa sổ chat Form thông báo quân cờ giành chiến thắng Form giới thiệu nhóm phát triển PHẦN KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN Kết luận Qua một thời gian tìm hiểu và thực hiện đề tài, nhóm chúng tôi đã có những cố gắng để triển khai bài toán và cũng có những kết quả như mong đợi. 1.1. Kết quả đạt được của nhóm Đề tài yêu cầu phải xây dựng trò chơi đối kháng giữa hai người trên hai máy điện thoại android. Chúng tôi đã đạt được những kết quả như sau: Đã xây dựng hoàn thành ứng dụng trò chơi ca rô trên điện thoại và chạy tốt trên Emulator, và thiết bị. Xây dựng hoàn chỉnh giao thức cho trò chơi đối kháng, tận dụng tốt sức mạnh của hệ thống server IRC. Tiếp thu được nhiều kinh nghiệm lập trình mạng, lập trình đồ họa, lập trình đa phương tiện dưới android. Mỗi thành viên trong nhóm đều đã hoàn thành tốt đề tài của mình. 1.2. Kết quả đạt được của cá nhân 1.2.1. Kết quả Về đề tài luận văn “tìm hiểu lập trình đa phương tiện (multimedia) trên nền tảng Android” tôi đã tìm hiểu được các vấn đề sau: Cài đặt thành công bộ công cụ SDK phiên bản Windows để hỗ trợ việc lập trình trên Android. Hiểu và có khả năng xây dựng các ứng dụng đa phương tiện trên android. Có thể sử dụng kỹ năng lập trình đồ họa xây dựng được những trò chơi đơn giản. Hiểu và có khả năng lập trình mạng trên android. Có thêm kinh nghiệm và hiểu biết về hệ thống server IRC. Tích lũy thêm nhiều kinh nghiệm và sự hỗ trợ nhau khi làm việc nhóm. 1.2.2. Hạn chế Dù đã đạt được một số kết quả thuận lợi nhưng đề tài cũng không tránh khỏi những hạn chế đáng kể: Trò chơi vẫn còn một số lỗi phát sinh khi sử dụng thực tế. Giao diện chò trơi chưa đẹp và thân thiện với người sử dụng cho lắm. Hướng phát triển Khắc phục một số lỗi còn mắc phải. Xây dựng lại giao diện. Tận dụng nền tảng game vừa xây dựng để xây dựng các game mới. Thêm vào một số chức mới như: phần thưởng khi lên cấp, người dùng có thể tùy chỉnh hình ảnh quân cờ theo ý thích của mình (nhưng hai người cùng chơi quân cờ sẽ khác nhau), hai người cùng chơi có thể thỏa thuận thời gian chờ sau mỗi lượt đánh cờ. TÀI LIỆU THAM KHẢO EBOOK [1] Copyright © 2009 by Mark L.Murphy. Beginning Android. Springer-Verlag New York, Inc., [2] Copyright © 2009 by Sayed Y.Hashimi and Satya Komatineni. Pro Android. Springer-Verlag New York, Inc., [3] Copyright © 2008 by Ed Burnette. Hello, Android – introducing Google’s Mobile Development Platform. The Pragmatic Bookshelf. [4] Copyright © 2009 by Reto Meier. Professional AndroidTM Application Development. Wiley Publishing, Inc.,Indianapolis, Indiana. WEBSITE [5] [6] [7] [8]

Các file đính kèm theo tài liệu này:

  • docxLập trình đa phương tiện (Multimedia) trên nền tảng Android.docx