Cấu hình: là đặc tả định nghĩa một môi trường phần mềm cho một dòngcác thiết bị được phân loại bởi tập hợp các đặc tính, ví dụ như :- CLDC Connected Limited Device Configuration - Cấu
Trang 1LỜI CẢM ƠNSau một thời gian tìm hiểu đề tài “Xây dựng trò chơi đua xe ô tô trên điện thoại di động với J2ME” Em đã hoàn thành tiến độ dự kiến Để đạt được
kết quả này, em đã nỗ lực thực hiện và đồng thời cũng nhận được rất nhiều sựgiúp đỡ, quan tâm, ủng hộ của các thầy cô bạn bè và gia đình
Em xin chân thành cảm ơn giáo viên hướng dẫn: ThS Lê Tuấn Anh - Bộ
môn Mạng và Truyền Thông - Khoa công nghệ thông tin - Đại học công nghệthông tin và truyền thông - Đại học Thái Nguyên đã tận tình giúp đỡ em hoànthành đồ án tốt nghiệp này
Em xin chân thành cảm ơn các thầy, cô giáo thuộc bộ môn Mạng vàTruyền thông đã trang bị cho em những kiến thức chuyên ngành rất hữu ích để
em hoàn thành đồ án và phục vụ cho công việc của em sau này
Vì thời gian có hạn nên đề tài của em không thể tránh khỏi những thiếusót, em rất mong được sự đóng góp ý kiến từ phía thầy cô và các bạn
Em xin chân thành cảm ơn!
Thái Nguyên, tháng 6 năm 2012
Sinh Viên
Lưu Anh Tuấn
Trang 2LỜI CAM ĐOAN
Đồ án này đã được hoàn thành sau một thời gian nghiên cứu, tìm hiểu cácnguồn tài liệu, sách báo chuyên ngành và thông tin trên mạng mà theo em là hoàntoàn tin cậy Nội dung đồ án được em tổng hợp lại từ các tài liệu tham khảo,không sao chép toàn bộ các đồ án và các công trình nghiên cứu của các tác giảkhác Em xin chịu trách nhiệm về nội dung trong đồ án mình
Thái Nguyên, tháng 6 năm 2012
Sinh Viên
Lưu Anh Tuấn
Trang 3MỤC LỤC
LỜI CẢM ƠN 1
LỜI CAM ĐOAN 2
MỤC LỤC 3
DANH MỤC BẢNG 8
DANH MỤC TỪ VIẾT TẮT 9
LỜI NÓI ĐẦU 10
CHƯƠNG I: CƠ SỞ LÝ THUYẾT 11
1.1 Giới thiệu về Java và công nghệ J2ME 11
1.1.1 Giới thiệu về java 11
1.1.2 Giới thiệu về J2ME và lập trình cho thiết bị di động 11
1.1.3 Những hạn chế của lập trình di động 17
1.2 Lập trình J2ME 17
1.2.1 MIDLet và vòng đời của 1 MIDLet 17
1.2.2 Cách quản lý màn hình của ĐTDĐ : 18
1.2.3 Đồ họa trong J2ME 18
1.3 Lập trình game trên J2ME 30
1.3.1 J2ME game API 31
1.4 Hệ thống quản lý bản ghi RMS (Record Management System) 37
1.4.1 Lưu trữ cố định thông qua Record Store 37
1.4.2 Các vấn đề liên quan đến RMS 39
1.5 Bluetooth API – JSR 82 40
1.5.1 API java cho Bluetooth 40
1.5.2 Bluetooth Protocol 41
1.5.3 Mô hình kết nối client-server 42
CHƯƠNG II: PHÂN TÍCH, THIẾT KẾ TRÒ CHƠI ĐUA Ô TÔ TRÊN ĐIỆN THOẠI DI ĐỘNG 46
2.1 Bài toán 46
2.2 Yêu cầu bài toán 46
2.3 Phân tích và thiết kế ứng dụng 47
Trang 42.3.1 Tác nhân và các Use case – UC 47
2.3.2 Biểu đồ UC 48
2.3.3 Thiết kế lớp 63
Chương III: XÂY DỰNG TRÒ CHƠI ĐUA XE Ô TÔ 65
TRÊN ĐIỆN THOẠI DI ĐỘNG 65
3.1 Môi trường thực hiện ứng dụng 65
3.2 Giới thiệu về NetBeans 65
3.3 Xây dựng trò chơi đua xe ôtô 67
3.3.1 Các vấn đề cần giải quyết 67
3.3.2 Phương pháp lập trình 68
3.4 Một số hình ảnh của trò chơi 71
3.3.1 Màn hình splash 71
3.3.2 Menu chính 72
3.3.3 Màn hình Chơi game 74
3.3.4 Màn hình Chơi 2 người 75
3.3.5 Màn hình Luyện tập 78
3.3.6 Màn hình Thiết lập 79
3.3.7 Màn hình Lưu kỉ lục 80
3.3.8 Màn hình Kỉ lục 81
3.3.9 Màn hình Help 82
3.3.10 Màn hình About 83
KẾT LUẬN 84
TÀI LIỆU THAM KHẢO 85
NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN 86
Trang 5DANH MỤC HÌNH
Hình 1.1 Các tầng J2ME được xây dựng trên CLDC 11
Hình 1.2 Kiến trúc của J2ME 12
Hình 1.3 Vòng đời của một midlet 16
Hình 1.4 quản lý màn hình của ĐTDĐ 17
Hình 1.5 Đối tượng displayable 17
Hình 1.6 Sơ đồ phân cấp chức năng đồ họa MIDP 18
Hình 1.7 Đồ họa mức cao 18
Hình 1.8 Hệ trục tọa độ 22
Hình 1.9 Điểm neo 27
Hình 1.10 Vị trí ảnh 29
Hình 1.11 Sprite 32
Hình 1.12 Tiled layer 34
Hình 1.13 MIDLET Suite One 37
Hình 2.1 Biểu đồ Use – Case 47
Hình 2.2 Biểu đồ trình tự UC- ChoiGame 48
Hình 2.3 Biểu đồ cộng tác UC- ChoiGame 49
Hình 2.4 Biểu đồ trình tự UC- ChoiHaiNguoi 50
Hình 2.5 Biểu đồ cộng tác UC - ChoiHaiNguoi 51
Hình 2.6 Biểu đồ trình tự UC- LuyenTap 52
Hình 2.7 Biểu đồ cộng tác UC-LuyenTap 53
Hình 2.8 Biểu đồ trình tự UC-LuuKiLuc 54
Hình 2.9 Biểu đồ cộng tác UC-LuuKiLuc 55
Hình 2.10 Biểu đồ trình tự UC- XemKiLuc 56
Hình 2.11 Biểu đồ cộng tác UC-XemKiLuc 57
Hình 2.12 Biểu đồ trình tự UC 58
Hình 2.13 Biểu đồ cộng tác UC- ThietLap 59
Hình 2.14 Biểu đồ trình tự UC- TroGiup 60
Hình 2.15 Biểu đồ cộng tác UC- TroGiup 60
Hình 2.16 Biểu đồ trình tự UC-About 61
Trang 6Hình 2.17 Biểu đồ Cộng tác UC-About 62
Hình 2.18 Biểu đồ lớp 62
Hình 3.1 Khởi động Netbeans 64
Hình 3.2 Máy ảo chạy chương trình 65
Hình 3.3: Giới hạn vị trí x 67
Hình 3.4 TiledLayer 69
Hình 3.5 Tiled sắp xếp theo ma trận 69
Hình 3.6 Màn hình splash 70
Hình 3.7 Menu chính 71
Hình 3.8 Menu con chức năng chơi game 72
Hình 3.9 Màn hình new game 73
Hình 3.10 Menu con chơi hai người 74
Hình 3.11 Màn hình chọn xe để đua 75
Hình 3.12 Màn hình chơi hai người 76
Hình 3.13 Màn hình luyện tập 77
Hình 3.14 Màn hình Thiết lập 78
Hình 3.15 Màn hình Lưu kỉ lục 79
Hình 3.16 Màn hình kỉ lục 80
Hình 3.17 Màn hình Hướng dẫn 81
Hình 3.18 Màn hình About 82
Trang 7DANH MỤC BẢNG
Bảng 1.1 So sánh các thông số kỹ thuật của CDC và CLDC 13
Bảng 1.2 Mô hình hoạt động của Client và Server trong J2ME Bluetooth 41
Bảng 2.1 Danh sách một số lớp chính 63
Bảng 3.1 Chức năng chính của trò chơi 66
Bảng 3.2 Chức năng trong giao diện chơi game 66
Bảng 3.3 Dữ liệu điểm trong RMS 67
Bảng 3.4 Dữ liệu Thiết lập lưu trong RMS 68
Trang 8DANH MỤC TỪ VIẾT TẮT
MIDP Mobile Information Device Profile
CLDC Connected Limitted Device Configuration
Trang 9LỜI NÓI ĐẦU
Với sự phát triển mạnh mẽ của thông tin di động hiện nay, chiếc điệnthoại di động đã trở thành một vật dụng không thể thiếu của đa số mọi người.Các thiết bị di động ngày càng thể hiện rõ những ưu thế nổi bật của nó
Số lượng thiết bị di động ở Việt Nam cũng như trên thế giới ngày càngtăng Chiếc điện thoại di động ngày nay được hỗ trợ nhiều tính năng cao cấp, nógiống như một chiếc máy tính thu nhỏ, có thể chạy được nhiều ứng dụng như tra
từ điển, nghe nhạc, chơi game Điện thoại di động đã giúp ích rất nhiều cho conngười trong công việc cũng như đáp ứng nhu cầu gải trí Xuất phát từ nhu cầuthực tế đồng thời để góp phần tăng tính giải trí và khả năng ứng dụng trên điện
thoại di động, nay em chọn đề tài "xây dựng game đua xe trên điện thoại di động với J2ME".
Sau thời gian nghiên cứu và phát triển cùng với sự giúp đỡ, chỉ bảo củathầy cô, bạn bè, sự hướng dẫn tận tình của thầy Lê Tuấn Anh Em đã hoàn thành
đồ án tốt nghiệp của mình Tuy nhiên do kinh nghiệm và vốn kiến thức của em cònnhiều hạn chế nên đề tài của em còn nhiều thiếu sót Kính mong nhận được sự góp
ý và chỉ bảo của quý thầy cô và các bạn để đề tài của em được hoàn thiện hơn
Trang 10CHƯƠNG I: CƠ SỞ LÝ THUYẾT1.1 Giới thiệu về Java và công nghệ J2ME
1.1.1 Giới thiệu về java
Java là một công nghệ được hãng Sun Microsystems xây dựng từ cuốinăm 1990 với tên gọi Oak và hiện nay đang phát triển vượt bậc với sự đóng gópcủa hàng vạn lập trình viên trên thế giới Ban đầu, Oak được kỹ sư JamesGosling và các cộng sự xây dựng với mục đích lập trình cho các mặt hang điệndân dụng với mục tiêu nhỏ gọn và tương thích được với nhiều loại thiết bị phầncứng khác nhau Sau đó Oak được sử dụng trong nhiều dự án như dự án Xanh(Blue Project), dự án Phim theo yêu cầu (Video on demand Project) Sau mộtchuyến du lịch tới đảo Java của Indonesia, nhóm phát triển Oak đã đổi tên Oakthành Java
Hiện nay Java có các phiên bản sau:
J2SErM (Java 2 Platform, Standart Edition): Phiên bản chuẩngồm bộ công cụ thông dụng dùng để chạy trên các máy PC hoặc các mạngmáy tính nhỏ
J2EE™ (Java 2 Platform, Enterprise Edition): Phiên bản dành chocác máy chủ với bộ nhớ lớn Bao gồm các kiến trúc nâng cao như Web,EJB, Transaction… Dùng để xây dựng các ứng dụng có quy mô lớn
1.1.2 Giới thiệu về J2ME và lập trình cho thiết bị di động
J2ME được phát triển từ kiến trúc JavaCard, EmbededJava vàPersonalJava của phiên bản Java1.1 Sau sự ra đi của phiên bản Java 2 thì Sunquyết định thay thế PersonalJava bằng một phiên bản mới có tên Java 2 MicroEdition, viết tắt là J2ME J2ME được sử dụng cho các thiết bị nhỏ gọn với dunglượng bộ nhớ nhỏ bé và khả năng xử lý thấp
Mục tiêu của Java là cho phép người lập trình viết các ứng dụng độc lậpvới thiết bị di động, không cần quan tâm đến phần cứng thực sự Để làm được
Trang 11như vậy, J2ME được xây dựng bằng các tầng khác nhau để che giấu đi việctương tác trực tiếp với phần cứng của thiết bị Các tầng của J2ME được xây dựngtrên CLDC (Connected Limited Device Configuration):
Hình 1.1 Các tầng J2ME được xây dựng trên CLDC
Tầng dưới cùng là tầng phần cứng thiết bị - đây là tầng vật lý bao gồmphần cứng của thiết bị di động Các tầng bên trên tầng Phần cứng thiết bị là cáctầng trừu tượng, chúng cung cấp cho lập trình viên nhiều giao diện lập trình thânthiện và dễ dàng hơn mà không cần quan tâm đến phần cứng Nói các khác chúngđóng vai trò trung gian giúp cho lập trình viên tương tác được với phần cứng màkhông cần quan tâm đến các chi tiết thực sự của phần cứng của thiết bị
Tầng phần cứng thiết bị (Device Hardware Layer): đây là thiết bị diđộng thật sự với bộ nhớ và tốc độ xử lý cụ thể Các thiết bị di động khác nhau cóthể có bộ vi xử lý và các tập lệnh rất khác nhau Mục tiêu của J2ME là cung cấpcho lập trình viên khả năng giao tiếp giống nhau với tất cả các loại thiết bị diđộng khác nhau
Tầng máy ảo Java (Java Virtual Machine Layer): đây là tầng đóng vaitrò thông ngôn giữa chương trình và thiết bị Nó sẽ thông dịch các mã bytecode(mã có được sau khi biên dịch mã nguồn chương trình) thành mã máy của cácthiết bị di động Tầng này bao gồm KVM (K Virtual Machine) là bộ biên dịch
mã bytecode thành mã máy Nó cung cấp một sự chuẩn hóa cho các thiết bị diđộng để ứng dụng J2ME sau khi biên dịch có thể chạy được trên bất kỳ thiết bị diđộng nào hỗ trợ KVM
Trang 12 Tầng cấu hình (Configuration Layer): Tầng này cung cấp các hàm API
cơ bản là nhân của J2ME Lập trình viên có thể sử dụng các lớp và các phươngthức của các API này tuy nhiên nó không thực sự phong phú bằng tập API củatầng hiện trạng
Tầng hiện trạng (Profile Layer): Tầng này cung cấp các hàm API hữudụng hơn cho việc lập trình Mục đích của tầng này xây dựng nên lớp cấu hình vàcung cấp nhiều thư viện ứng dụng hơn
1.1.2.1 Kiến trúc của J2ME
Hình 1.2 Kiến trúc của J2ME
Kiến trúc J2ME bao gồm các thành phần: Cấu hình (configuration), hiệntrạng (profile), các gói tuỳ chọn (optional package) cho việc xây dựng hoàn thiệnmôi trường thực thi Java mà đáp ứng các yêu cầu cho một phạm vi lớn của cácthiết bị và thị trường đích Các nhà sản xuất thiết bị phát triển các tính năng mớitrong các thiết bị của họ hoặc cung cấp các dịch vụ, ứng dụng Các cấu hình cóthể được mở rộng với các thư viện bổ sung cho từng thiết bị
Trang 13 Cấu hình: là đặc tả định nghĩa một môi trường phần mềm cho một dòngcác thiết bị được phân loại bởi tập hợp các đặc tính, ví dụ như :
- CLDC (Connected Limited Device Configuration - Cấu hình thiết bị kếtnối giới hạn): được thiết kế để nhắm vào thị trường các thiết bị cấp thấp (low-end), các thiết bị này thông thường là máy điện thọai di động và PDA với khoảng
512 KB bộ nhớ Vì tài nguyên bộ nhớ hạn chế nên CLDC được gắn với Javakhông dây (Java Wireless ), dạng như cho phép người sử dụng mua và tải về cácứng dụng Java, ví dụ như là Midlet
- CDC (Connected Device Configuration - Cấu hình thiết bị kết nối): CDCđược đưa ra nhắm đến các thiết bị có tính năng mạnh hơn dòng thiết bị thuộcCLDC nhưng vẫn yếu hơn các hệ thống máy để bàn sử dụng J2SE Những thiết
bị này có nhiều bộ nhớ hơn (thông thường là trên 2Mb) và có bộ xử lý mạnh hơn.Các sản phẩm này có thể kể đến như các máy PDA cấp cao, điện thoại web, cácthiết bị gia dụng trong gia đình …
Bảng dưới là sự so sánh các thông số kỹ thuật của CDC và CLDC
Bảng 1.1 So sánh các thông số kỹ thuật của CDC và CLDC
Trang 14- PDA Profile: tương tự MIDP, nhưng với thị trường là các máy PDA vớimàn hình và bộ nhớ lớn hơn.
- Foundation Profile: cho phép mở rộng các tính năng của CDC với phầnlớn các thư viện của bộ Core Java2 1.3
Ngoài ra còn có Personal Basis Profile, Personal Profile, RMI Profile,Game Profile
Gói tuỳ chọn:
Nền tảng J2ME có thể được mở rộng hơn nữa bằng các gói tùy chọn vớicấu hình CLDC, CDC, và các hình trạng tương ứng Các gói tuỳ chọn đưa ra cácchuẩn cho việc sử dụng cả công nghệ đã có và công nghệ đang được sử dụngrộng rãi là Bluetooth, dịch vụ Web, nhắn tin không dây, đa phương tiện, và kếtnối cơ sở dữ liệu Các nhà sản xuất thiết bị có thể kèm theo các gói tùy chọn đểthúc đẩy các tính năng của các thiết bị
1.1.2.2 Sơ lược về MIDP
Đây là Profile được định nghĩa dành riêng cho các thiết bị di động và làthành phần chính trong J2ME MIDP cung cấp các chức năng cơ bản cho hầu hếtcác dòng thiết bị di động phổ biến nhất như các máy điện thoại di động và các
Trang 15máy PDA Tuy nhiên MIDP không phải là tất cả những gì lập trình viên cần vìMIDP được thiết kế cho các máy di động có cấu hình rất thấp.
Những chức năng MIDP cung cấp
- Các lớp và kiểu dữ liệu: Phần lớn các lớp mà các lập trình viên Javaquen thuộc vẫn còn được giữ lại ví dụ như các lớp trong gói java.util như Stack,Vector và Hastable cũng như Enumeration
- Hỗ trợ đối tượng Display: Đúng như tên gọi một chương trình MIDP sẽ
hỗ trợ duy nhất một đối tượng Display là đối tượng quản lý việc hiển thị dữ liệutrên màn hình điện thoại
- Hỗ trợ Form và các giao diện người dùng
- Hỗ trợ Timer và Alert
- Cung cấp tính năng Record Management System (RMS) cho việc lưu trữ
dữ liệu
Những chức năng hạn chế của MIDP:
- Phép tính dấu phẩy động (floating point): Phép tính này đòi hỏi rất nhiềutài nguyên CPU và phần lớn các CPU cho các thiết bị di động không hỗ trợ phéptính này, do đó MIDP cũng không có
- Bộ nạp class (Class Loader)
- Hỗ trợ từ khóa finalize() như trong J2SE: Việc “dọn dẹp” tài nguyêntrước khi nó bị xóa được đẩy về phía các lập trình viên
Trang 161.1.3 Những hạn chế của lập trình di động
Sự khác nhau lớn nhất giữa lập trình cho di động so với lập trình cho PC
đó là bộ nhớ, kích thước màn hình hay thậm chí là màu sắc của thiết bị Ngoài racòn có sự khác nhau giữa các hãng sản xuất cũng như dòng máy di động củahãng Các dòng máy khác nhau sẽ có bộ nhớ, kích thước, màu sắc màn hình và cả
hỗ trợ cho lập trình cũng khác nhau
Các loại bộ nhớ:
Bộ nhớ làm việc hay còn gọi là heap memory là phần bộ nhớ được dùngtrong suốt quá trình chạy và được giải phóng khi ứng dụng kết thúc Ứng dụngdành cho di động phải có bô nhớ nhỏ hơn vùng nhớ này mới có thể chạy được
RMS là bộ nhớ mà thông tin vẫn còn được lưu khi tắt ứng dụng Lấy một
ví dụ trong game, RMS được sử dụng để lưu top những người chơi cao điểmnhất Các thông tin đó vẫn được cập nhật cho lần chơi tiếp theo
1.2 Lập trình J2ME
1.2.1 MIDLet và vòng đời của 1 MIDLet
Giống như dạng chương trình Applet trên J2SE, một Midlet luôn luôn kếthừa javax.microedition.midlet Hàm cơ bản nhất trong mọi Midlet là startApp(),hàm này sẽ khởi tạo Midlet cũng như vận hành các thành phần hoặc đối tượngkhác, ngoài startApp(), mỗi Midlet còn có pauseApp() và destroyApp(), mỗi hàmnày sẽ đựợc gọi thực thi tương ứng khi user chọn dừng hoặc thoát chương trình
Trang 171.2.2 Cách quản lý màn hình của ĐTDĐ :
Điện thoại di động không quản lý trực tiếp trên màn hình như máy tính
mà phải thông qua một đối tượng Display được lấy qua từ câu lệnh:
Display.getDisplay(this).
Hình 1.4 quản lý màn hình của ĐTDĐ
Mặc dù mỗi MIDlet chỉ có duy nhất một đối tượng Display nhưng nó lại
có thể có rất nhiều đối tượng Displayable Điều đó có nghĩa là một đối tượngDisplay có thể hiển thị bao nhiêu đối tượng Displayable tùy ý Đối tượngDisplayable là đối tượng có thể nhìn thấy được một cách trực quan trên mànhình Bản thân MIDP có chứa 2 lớp con của Displayable là Screen và Canvas
Hình 1.5 Đối tượng displayable
1.2.3 Đồ họa trong J2ME
Các lớp MIDP cung cấp hai mức đồ họa: đồ họa mức thấp và đồ họa mứccao Đồ họa mức cao dùng cho văn bản hay form Đồ họa mức thấp dùng cho cácứng dụng games Dưới đây là sơ đồ thể hiện mức phân cấp chức năng đồ họatrong MIDP
Trang 18Hình 1.6 Sơ đồ phân cấp chức năng đồ họa MIDP.
Cả hai lớp đồ họa mức thấp và lớp đồ họa mức cao đều là lớp con của lớpDisplayable Trong MIDP chỉ có một lớp Displayable được hiển thị tại một thờiđiểm
1.2.3.1 Đồ họa mức cao
Các thành phần đồ họa mức cao là lớp con của lớp Screen Nó cung cấpcác thành phần như Textbox, List, Form, Alert Việc sắp xếp phụ thuộc vào nhàsản xuất
Hình 1.7 Đồ họa mức cao
TextBox: Lớp TextBox cho phép người dùng nhập và soạn thảo vănbản Lập trình viên có thể định nghĩa số ký tự tối đa, giới hạn loại dữ liệu nhập(số học, mật khẩu, email,…) và hiệu chỉnh nội dung của textbox Kích thước thật
Trang 19sự của textbox có thể nhỏ hơn yêu cầu khi thực hiện thực tế (do giới hạn của thiếtbị) Kích thước thật sự của textbox có thể lấy bằng phương thức getMaxSize().
List: Lớp List là một Screen chứa danh sách các lựa chọn chẳng hạn nhưcác radio button Người dùng có thể tương tác với list và chọn một hay nhiều item
Có 3 loại danh sách đó là: IMPICIT, EXCLUSIVE, MULTIPLE
Alert: Alert hiển thị một màn hình pop-up trong một khoảng thời gian.Nói chung nó dùng để cảnh báo hay báo lỗi Thời gian hiển thị có thể được thiếtlập bởi ứng dụng Alert có thể được gán các kiểu khác nhau (alarm, confirmation,error, info, warning), các âm thanh tương ứng sẽ được phát ra
Có hai loại Alert:
- Modal: hộp thoại thông báo được trình bày đến khi người dùng ấn nútđồng ý
- Non-modal: hộp thoại thông báo chỉ được trình bày trong một số giâynhất định
AlertType sử dụng âm thanh để thông báo cho người dùng biết có một sựkiện xảy ra AlertType bao gồm 5 loại âm thanh định sẵn là: thông báo, xác nhận,báo lỗi, thông báo và cảnh báo Các phương thức dựng của Alert cho biết là Alert
có thể bao gồm 1 tham chiếu đến một đối tượng AlertType
Form: là lớp hữu dụng nhất của các lớp Screen bởi vì nó cho phép chứanhiều item trên cùng một màn hình Các item có thề là DateField, TextField,ImageItem, TextItem, ChoiceGroup
- DateField: Thành phần DateField cung cấp một phương tiện trực quan đểthao tác đối tượng Date được định nghĩa trong java.util.Date Khi tạo một đốitượng DateField, bạn cần chỉ rõ là người dùng chỉ có thể chỉnh sửa ngày, chỉnhsửa giờ hay đồng thời cả hai
- Gauge: Một thành phần Gauge là một kiểu giao diện thường được dùng
để mô tả mức độhoàn thành một công việc Có 2 loại Gauge là loại tương tác và
Trang 20loại không tương tác Loại đầu cho phép người dùng có thể thay đổi Gauge, loại
2 thì đòi hỏi người phát triển phải cập nhật Gauge
- Stringltem: Một thành phần StringItem được dùng để hiển thị một nhãnhay chuỗi văn bản Người dùng không thể thay đổi nhãn hay chuỗi văn bản khichương trình đang chạy
- TextField: Một thành phần TextField thì tương tự như bất kỳ các đốitượng nhập văn bản tiêu biểu nào Bạn có thể chỉ định một nhãn, số ký tự tối đađược phép nhập, và loại dữliệu được phép nhập Ngoài ra TextField còn chophép bạn nhập vào mật khẩu với các ký tự nhập vào sẽ được che bởi các ký tựmặt nạ
MIDP định nghĩa các tham số ràng buộc sau cho thành phần TextField:.ANY: cho phép nhập bất kỳ ký tự nào
.EMAILADDR: chỉ cho phép nhâp vào các địa chỉ email hợp lệ
.NUMERIC: chỉ cho phép nhập số
.PHONENUMBER: Chỉ cho phép nhập sốđiện thoại
.URL: Chỉ cho phép nhập các ký tự hợp lệ bên trong URL
.PASSWORD: che tất cả các ký tự nhập vào
- ChoiceGroup: Thành phần ChoiceGroup cho phép người dùng chọn từmột danh sách đầu vào đã được định nghĩa trước ChoiceGroup có 2 loại:
+ multi-selection (cho phép chọn nhiều mục)
+ checkbox exclusive-selection (chỉ được chọn một mục)
- Spacer: là thành phần không nhìn thấy, được dùng để định vị trí cho cácđối tượng khác trên màn hình hiển thị Spacer dùng để chỉ rõ khoảng trắng theochiều dọc và chiều ngang giữa các thành phần, đơn giản bằng cách chỉ ra chiềudài và chiều rộng cho từng cái Vì Spacer là thành phần không nhìn thấy nên nókhông có sự kiện
Trang 21- Customltem: Thành phần CustomItem cho phép bạn tạo ra những thànhphần Item của chính bạn Những thành phần này cũng giống như những Itemkhác là cũng có thể được đặt vào trong Form và có thể nhận biết và xử lý sự kiệnCustomItem được vẽ lên màn hình hiển thị bằng phương thức paint() Vì thế nó
sẽ tùy thuộc vào đoạn mã được bạn hiện thực bên trong phương thức paint() Quátrình tạo ra một đối tượng CustomItem cũng không khác các đối tượng có sẵntrên nền Java
- Image and Imageltem: Hai lớp được dùng để hiển thị hình ảnh là: Image
và ImageItem Image được dùng để tạo ra một đối tượng hình ảnh và giữ thôngtin như là chiều cao và chiều rộng, và dù ảnh có biến đổi hay không LớpImageItem mô tả một tấm ảnh sẽ được hiển thị như thế nào
MIDP đưa ra 2 loại hình ảnh là loại ảnh không biến đổi và ảnh biến đổi.Một tấm ảnh không biến đổi thì không thể bị thay đổi kể từ lúc nó đượctạo ra Đặc trưng của loại ảnh này là được đọc từ một tập tin
Một tấm ảnh biến đổi về cơ bản là một vùng nhớ
PNG là loại ảnh duy nhất được hỗ trợ bởi bất kỳ thiết bị MIDP nào
1.2.3.2 Đồ họa mức thấp
Mặc dù các hàm API cấp cao cung cấp một tập đầy đủ các thành phần đểxây dựng giao diện ứng dụng người dùng Tuy nhiên các thành phần cấp caokhông cung cấp phương tiện để vẽ trực tiếp lên thiết bị thể hiện Vì thiếu khảnăng này nên các ứng dụng được tạo ra sẽ gặp nhiều giới hạn
Canvas và Graphics là 2 lớp con của các hàm API cấp thấp Canvas là mộtkhung vẽ cho phép người phát triển có khả năng vẽ lên thiết bị trình bày cũngnhư là việc xử lý sự kiện Còn lớp Graphics cung cấp các công cụ thật sự để vẽnhư drawRoundRect() và drawString()
a) Lớp Canvas và kỹ thuật xử lý đồ họa:
Lớp Canvas cung cấp một khung vẽ cho phép tạo ra giao diện tùy biếnngười dùng Một số lượng lớn các phương thức trong lớp này được dùng để xử lý
Trang 22sự kiện, vẽ ảnh và chuỗi lên thiết bị hiển thị Trong phần này sẽ bao gồm cácmục:
- Hệ thống tọa độ
- Tạo đối tượng Canvas
- Vẽ lên trên đối tượng Canvas
Hình 1.8 Hệ trục tọa độ
Chiều rộng và chiều cao của Canvas cũng đại diện cho toàn bộ diện tíchkhung vẽ có thể trên thiết bị trình bày
Trang 23 Tạo một đối tượng Canvas
Bước đầu tiên để làm việc với một lớp Canvas là tạo ra một lớp thừa kế từlớp Canvas:
class TestCanvas extends Canvas implements CommandListener {
protected voidpaint(Graphics g) { // Draw onto the canvas
}
}
TestCanvas canvas = new TestCanvas(this);
Vẽ trên đối tượng Canvas
Phương thức paint của lớp Canvas cho phép vẽ các hình dạng, vẽ ảnh,xuất chuỗi Ví dụ:
protected voidpaint(Graphics g) {
// Set background color to white
g.setColor(255, 255, 255);
// Fill the entire canvas
g.fillRect(0, 0, getWidth(), getHeight());
Có thể sử dụng một tham chiếu đến một đối tuợng Graphics bên trongthân phương thức paint() để thực hiện công việc vẽ thực sự
Sự kiện hành động
Cũng như các thành phần Form, List, và TextBox, một Canvas có thể xử
lý các sự kiện Command
Ví dụ:
class TestCanvas extends Canvas implements CommandListener {
private Command cmdExit;
Trang 24KEYNUM0, KEYNUM1, KEYNUM2, KEYNUM3, KEYNUM4, KEYNUM5, KEYNUM6, KEY_NUM7, KEYNUM8, KEYNUM9, KEYSTAR, KEYPOUND
Các hành động trong xử lý các trò chơi
MIDP thường được sử dụng để tạo các trò chơi trên nền Java Các hằng sốsau đã được định nghĩa để xử lý các sự kiện có liên quan đến trò chơi trongMIDP UP, DOWN, LEFT, RIGHT, FIRE, GAME_A, GAME_B, GAME_C,GAME_D Nói một cách đơn giản thì các giá trị này được ánh xạ thành các phímmũi tên chỉ hướng của thiết bị, nhưng không phải tất cả các thiết bị di động đều
Trang 25có những giá trị này Nếu một thiết bị di động thiếu các phím mũi tên thì cáchành động của trò chơi sẽ được ánh xạ vào các nút bấm.
Xác định các hành động của trò chơi
Đoạn mã sau đây mô tả một cách xác định các hành động của trò chơi để
từ đó gọi các phương thức thích hợp dựa trên các hành động xảy ra:
protected void keyPressed(int keyCode) {
switch (getGameAction(keyCode)) {
case Canvas.FIRE: shoot(); break;
case Canvas.RIGHT: goRight(); break;
} }
Một lựa chọn nữa là có thể tạo một tham chiếu cho mỗi hành động của tròchơi thông qua quá trình khởi tạo giá trị cho các biến
protected void keyPressed(int keyCode) {
if (keyCode == keyFire) shoot();
else if (keyCode == keyRight) goRight() }
Trang 26void pointerPressed(int x, int y)
void pointerReleased(int x, int y)
void pointerDragged(int x, int y)
Các phương thức trên có thể tự giải thích chức năng thông qua tên củachính mình Ví dụ như phương thức hasPointerMotionEvents() trả về một giá trị
có kiểu boolean nhằm chỉ rõ rằng thiết bị di động có hỗ trợ khái niệm “nhấpchuột và rê” hay không
b) Lớp Graphics
Hỗ trợ màu
Một ứng dụng MIDP chỉ có một đối tượng Display Đối tượng này đuợcdùng để lấy thông tin của màn hình hiển thị hiện tại, ví dụ như số màu hỗ trợ vàcác phương thức để yêu cầu các đối tượng được hiển thị Đối tượng Display đơngiản là một bộ quản lý sự hiển thị của thiết bị và điều khiển những gì sẽđược hiểnthị ra trên thiết bị
Trang 27cung chỉ ra rằng có bao nhiêu độ được vẽ tính từ góc ban đầu, đi theo ngượcchiều kim đồng hồ.
Vẽ hình chữ nhật
Cũng giống như cung thì hình chữ nhật có thể chỉ được vẽ viền bao quanhhoặc tô bên trong Hình chữ nhật có thể vẽ 4 góc là tròn hoặc là vuông
Font chữ
Phần sau đây cũng quan trọng không kém là cách sử dụng font chữ được
hỗ trợ bởi giao diện cấp thấp của ứng dụng MIDP
Một số thuộc tính của lớp Font: FACESYSTEM FACEMONOSPACE FACEPROPORTIONAL STYLEPLAIN STYLEBOLD STYLEITALIC
STYLEUNDERLINED SIZESMALL SIZEMEDIUM SIZELARGE
Các tham số kiểu dáng có thể được kết hợp thông qua toán tử |
Kích thước của các font chữ được xác định bởi chiều cao của font chữ, bềdài tính bằng điểm ảnh của một chuỗi ký tự trong một font xác định
Trang 28dụng thành từng cặp), cần phải có một điểm hoành độ và một điểm tung độ Cácđiểm neo được định nghĩa như ở dưới đây:
- HCENTER (Chinh giữa của chiềungang)
- RIGHT (Bên phải)
- BASELINE
- BOTTOM (Bên dưới)Khi sử dụng điểm neo thì cần phải chỉ ra tọa độ x, y của hình chữ nhật baoquanh
Vẽ các chuỗi kí tự
Vẽ chuỗi ký tự ra màn hình thông qua một số các phương thức sau:
void drawChar(char character, int x, int y, int anchor)
void drawChars(char[] data, int offset, int length, int x, int y, int anchor) void drawString(String str, int x, int y, int anchor)
void drawSubstring(String str, int offset, int len, int x, int y, int anchor)
Vẽ ảnh
Vẽ ảnh cũng giống như khi xuất chuỗi ra màn hình Cần phải thiết lập tọa
độ x, y cũng như điểm neo
Trang 29chiều ngang)
- RIGHT (Bên phải)
- VCENTER (Điểm chính giữa theochiều dọc)
- BOTTOM (Bên dưới)
Hình 1.10 Vị trí ảnh
Một số các phương thức khác của lớp Graphics:
clip() và translate() là 2 phương thức của lớp Graphics Một vùng hiển thịđược cắt xén được định nghĩa là khu vực hiển thị của thiết bị di động, vùng này
sẽ được cập nhật trong suốt thao tác vẽ lại
1.3 Lập trình game trên J2ME
Với phiên bản MIDP 2.0, công việc lập trình di động nói chung và lậptrình game nói riêng sẽ dễ dàng hơn rất nhiều
Lớp GameCanvas mới có thể vẽ lên màn hình và đáp ứng lại dữ liệu nhậptrong phần thân của vòng lặp game, thay vì dựa vào các thread vẽ và nhập liệucủa hệ thống GameCanvas là một Canvas có thêm một số khả năng; nó cung cấpcác phương thức để vẽ tức thời và kiểm tra trạng thái bàn phím thiết bị
Một API dùng để quản lý layer mạnh và linh hoạt giúp việc xây dựng cáccảnh game phức tạp một cách hiệu quả hơn
Sử dụng các luồng (thread) xử lý các đối tượng trong một ứng dụng gamechạy song song với nhau: ví dụ như các luồng vẽ đồ họa trong một đối tuợng đồ
Trang 30họa,luồng âm thanh trong đối tượng âm thanh… Sẽ cùng được chạy trong cùngmột thời điểm khi bắt đầu trò chơi trò chơi.
Ngoài ra, việc sử dụng đa luồng (Multithreading) này giúp cho tài nguyênhạn chế của thiết bị di động được sử dụng một cách tích cực hơn
1.3.1 J2ME game API
Thực tế hoàn toàn có thể làm game J2ME với kiến thức về lập trình di động J2ME, và đặc biệt là thành phần giao diện mức thấp Canvas của nó Lớp Canvas cho phép vẽ lên màn hình điện thoại, nó hỗ trợ vẽ các đối tượng như đường thằng, đường tròn, tô màu một vùng màn hình, hay có thể copy một vùng màn hình vào vùng đệm và đặt nó vào chỗ khác… Với những công cụ như thế
có thể làm được một chương trình game từ đơn giản đến phức tạp Tuy nhiên thờigian làm game sẽ rất tốn kém và khối lượng công việc liên quan đến vẽ giao diện
là rất lớn Qua tìm hiểu em thấy J2ME có một gói hỗ trợ tốt cho lập trình game gọi là chung là Game API Các lớp của nó nằm trong
Sprites: lớp để tạo các nhân vật và các đối tượng chuyển động
TiledLayer: lớp để tạo các khung cảnh khác nhau của game và tạo bản đồ
LayerManager: lớp quản lý các Sprites và các TiledLayer
1.3.1.1 GameCanvas class
GameCanvas kết thừa các thuộc tính và phương thức của lớp Canvas và
có thêm một số phương thức quan trọng giúp cho việc giảm thời gian tính toán
Trang 31nhờ đó tăng tốc độ refresh của màn hình Nó có thêm hai mở rộng so với Canvas
là Polling Input - lược bỏ đầu vào và Frame Buffer - dùng vùng đệm để chứa nộidung Canvas
Lớp GameCanvas: không phải đợi để thực hiện keyPressed() vì có phươngthức getKeysState() Có kỹ thuật gọi là “double buffering” Có thể thực hiện vẽ
ở “off-screen buffer” khi đó việc copy từ buffer tới các canvas nhanh hơn nhiều
Có thể sử dụng Graphic từ gọi hàm getGraphics() flushGraphics() để giải phóngGraphics…
1.3.1.2 Layer class
Lớp layer của Game API rất đơn giản nhưng nó được kế thừa bởi hai lớpSprite và TiledLayer Layer được hiểu là một khối hình ảnh trong Game Tất cảcác hình ảnh có thể hiện được trên màn hình đều kế thừa lớp này Các Layer lànhững ảnh mà có thể vẽ lên màn hình, ẩn đi, di chuyển hay là xắp xếp chúng theo
độ xâu (tức là khi nhiều ảnh chồng chéo lên nhau thì ảnh có độ sâu lớn hơn sẽ bịảnh có độ xâu nhỏ hơn che khuất)
Các phương thức của lớp Layer là
Public void setPosition(int x, int y): đặt vị trí của Layer
Public void Move (int dx, int dy): dịch chuyển Layer
Public void setVisible (boolean visible): thiết lập hiện/ẩn LayerCácphương thức này đều được kế thừa bởi các lớp Sprite và TiledLayer
1.3.1.3 Sprite Class
Trong Game thì đồ hoạ làm nên thành công rất lớn Hầu hết các đối tượng
đồ hoạ được phân loại như các dạng đặc biệt của đồ hoạ gọi là các Sprite MộtSprite có thể là bullet, monster, enemies, keys và doors và một vài cái gì đó…
Trang 32Các Sprite được nhân nhiều lên là các graphic động, các graphic động nàyđược tạo nên từ cùng một Sprite nhưng nhìn từ các góc khác nhau Đây là một bộSprite:
Hình 1.11 Sprite
Có 3 hàm khởi tạo với lớp Sprite
- Sprite (Image image); // Tạo ra khung Sprite đơn, không động
- Sprite (Sprite sprite); //Tạo ra Sprite mới từ một Sprite
- Sprite (Image image,int frameWidth, int frameHeight); //Tạo ra Spriteđộng với từ 2 frame trở lên, frameWidth và frameHeight là độ rộng và chiều caocủa 1 Sprite
Animation – chuyển động: Tạo hình ảnh chuyển động của nhân vật bằngcách gép nối liên tiếp các hình ảnh gần giống nhau
Transforms – quay góc độ: Sprite cho phép chuyển xoay hình ảnh đi mộtgóc nào đó bằng phương thức:
public void setTransform(int transform);
Có 8 kiểu xoay:
- TRANS_NONE, tương ứng với 0 chiều kim đồng hồ
- TRANS_ROT90, tương ứng với 90 chiều kim đồng hồ
- TRANS_ROT180, tương ứng với 180 chiều kim đồng hồ
- TRANS_ROT270, tương ứng với 270 chiều kim đồng hồ
- TRANS_MIRROR, tương ứng với 0 xoay ngược theo gương, rồi xoaymột góc nào đó theo chiều kim đồng hồ
- TRANS_MIRROR_ROT90, tương ứng với 90
Trang 33- TRANS_MIRROR_ROT180, tương ứng với 180.
- TRANS_MIRROR_ROT270: tương ứng với 270
• Image ở đây là ảnh lớn (kích thước 64)
• FrameWidth là chiều rộng của mỗi ảnh nhỏ (16)
• FrameHeight là chiều cao của mỗi ảnh nhỏ (16)
public Sprite(Image image, int frameWidth, int frameHeight);
Bây giờ nếu muốn có ảnh chuyển động chỉ cần tạo một mảng có số phần
tử là số ảnh để tạo chuyển động, các giá trị của mảng là chỉ số của các ảnh nhỏcần ghép tương ứng Chuỗi đó được gọi là Frame Sequences
Phương thức:
Sprite.setFrame(int frameIndex);
Cho phép Sprite hiển thị một frame cụ thể
Có thể định hướng chuyển động bằng các phương thức:
public void nextFrame() public void prevFrame()
1.3.1.4 TiledLayer class
Mỗi lớp TiledLayer có một ảnh, ảnh này được chia nhỏ thành các tile theoquy tắc ở trên, một TiledLayer nó gồm một mảng các tile đặt theo thứ tự nhấtđịnh Ảnh của TiledLayer được phân chia ra nhiều tiles và được đánh số Mộtbản đồ có thể được tạo nên từ một TiledLayer hay nhiều TiledLayer.Hàm tạo củalớp TiledLayer như sau:
public TiledLayer(int columns, int rows, Image image, int tileWidth, int tileHeight);
• Colums là số cột của TiledLayer, hay số tiles trong một hàng
• Rows là số hàng của TiledLayer, hay số tiles trong một cột
• Image là ảnh của TiledLayer
Trang 34• tileWidth và tileHeight cho biết kích thước của một tile.
Một TiledLayer là một lưới các ô chia ra từ 1 ảnh
Ví dụ: hình dưới được chia thành 6 vùng, các Tiled có 32x32 pixel Tạonên 1 lớp TiledLayer, mỗi 1 tile này được đánh số (bắt đầu từ 1) Đánh số từ tráisang phải rồi từ trên xuống dưới
Hình 1.12 Tiled layer
Có thể đặt một miền chữ nhật trong TiledLayer bằng một tile bằngphương thức:
public void fillCells(int col, int row, int numCols, int numRows, int tileIndex);
- col, row, numCols, nunRows xác định miền chữ nhât cần phủ tiled
- tileIndex là chỉ số của tile đem phủ
Tiled Animation - tile động
Tile phần lớn được dùng để tạo ra các đối tượng tĩnh như bản đồ, tuynhiên để tạo ra một khung nền thú vị thì nên có các tile động (các tile này đơngiản là các tiles thay đổi hình ảnh của nó sau một chu kì vẽ lại màn hình) Cáctile động là những đối tượng hoạt động không chịu sự điều khiển của người chơi
mà hoạt động theo chu kì
Để xác định tile nào là tile động trong một TiledLayer sử dụng phươngthức:
public int createAnimatedTile(int staticTileIndex);
staticTileIndex : là chỉ số của tile trong TiledLayer
Trang 35Sau mỗi lần vẽ lại màn hình, các TiledLayer được vẽ lại và do đó các tilecủa nó cũng được cập nhật theo Để thay đổi vị trí của một tile với một tile ở vịtrí khác sử dụng phương thức:
public void setAnimatedTile(int animatedTileIndex, int staticTileIndex);
Trong phương thức trên thì tile có chỉ số animatedTileIndex sẽ được cậpnhật hình ảnh của tile có chỉ số staticTileIndex
1.3.1.5 LayerManager class
Lớp này quản lý tất cả các đối tượng khác, thay vì trực tiếp xác định vị trí
để vẽ các đối tượng lên màn hình bằng phương thức paint(), cần tạo ra một đốitượng LayerManager và cho vào nó tất cả các đối tượng bằng phương thức:
public void append(Layer l);
Đối tượng append có thể là đối tượng Layer hoặc những đối tượng của lớp
kế thừa từ Layer như Sprite và TiledLayer Các đối tượng vẫn được vẽ lên mànhình nhưng khác so với vẽ trực tiếp lên màn hình ở chỗ các quá trình vẽ đượcthâu tóm lại chỉ trong đối tượng LayerManager mà không vẽ rời rạc từng thànhphần một Việc vẽ tất cả các đối tượng đồng loạt như vậy sẽ tốt cho tính thốngnhất xuất hiện của các đối tượng khác nhau trên màn hình Lớp LayerManagercung cấp các phương thức quản lý Layer như:
- insert (Layer l, int index)
- remove (Layer l)
- getLayerAt (int index)
Phương thức thứ nhất chèn một Layer vào lớp ở vị trí có chiều xâu index
Ở đây một layer chèn vào có tính đến chiều sâu mà nó được đặt (layer có chiềusâu lớn hơn sẽ bị che bởi những layer có chiều xâu nhỏ hơn) Do đó việc đặt mộtlayer lên màn hình khi sử dụng LayerManager sẽ không phụ thuộc vào thứ tự viếtcode, mà phụ thuộc vào biến index mà truyền vào
1.4 Hệ thống quản lý bản ghi RMS (Record Management System)
Trang 36MIDP không sử dụng hệ thống file để lưu trữ dữ liệu Thay vào đó MIDPlưu toàn bộ thông tin vào non-volatile memory bằng hệ thống lưu trữ gọi làRecord Management System (RMS).
1.4.1 Lưu trữ cố định thông qua Record Store
RMS là hệ thống được tổ chức và quản lý dưới dạng các record (bản ghi).Mỗi bản ghi (sau này gọi là Record) có thể chứa bất kỳ loại dữ liệu nào, chúng cóthể là kiểu số nguyên, chuỗi ký tự hay có thể là một ảnh và kết quả là một Record
là một chuỗi (mảng) các byte Nếu bạn mã hoá dữ liệu của bạn dưới dạng nhịphân (binary), bạn có thể lưu trữ dữ liệu bằng Record sau đó đọc dữ liệu từRecord và khôi phục lại dữ liệu ban đầu Tất nhiên kích thước dữ liệu của bạnkhông được vuợt quá giới hạn qui định của thiết bị di động RMS lưu dữ liệu gầnnhư một cơ sở dữ liệu, bao gồm nhiều dòng, mỗi dòng lại có một số định danhduy nhất
Một cơ sở dữ liệu kiểu bản ghi:
Record ID Data
1 Array of bytes
2 Array of bytes
3 Array of bytesMột tập các bản ghi (sau này gọi là RecordStore) là tập hợp các Recordđược sắp xếp có thứ tự Mỗi Record không thểđứng độc lập mà nó phải thuộcvào một RecordStore nào đó, các thao tác trên Record phải thông quaRecordStore chứa nó
Khi tạo ra một Record trong RecordStore, Record được gán một số địnhdanh kiểu số nguyên gọi là Record ID Record đầu tiên được tạo ra sẽ được gánRecord ID là 1 và sẽ tăng thêm 1 cho các Record tiếp theo Cần chú rằng Record
ID không phải là chỉ mục (index), các thao tác xóa Record trong RecordStore sẽkhông gây nên việc tính toán lại các Record ID của các Record hiện có cũng nhưkhông làm thay đổi Record ID của các Record được tạo mới, ví dụ: khi xóarecord id 3 khi thêm một record mới sẽ có id là 4 Data là một dãy các byte đại
Trang 37Tên được dùng để phân biệt các RecordStore trong bộ các MIDlet(MIDlet suite)
Khái niệm MIDlet suite là tập các MIDlet có chung không gian tên (namespace), có thể chia sẽ cùng tài nguyên (như RecordStore), các biến tĩnh (staticvariable) trong các lớp và các MIDlet này sẽđược đóng gói trong cùng mộtfile .jar khi triển khai Nếu ứng dụng của bạn chỉ có một MIDlet thì cácRecordStore được sử dụng cũng phân biệt lẫn nhau bằng các tên
Tên của RecordStore có thể dài đến 32 ký tự Unicode và là duy nhất trongmột MIDlet suite
Hình 1.13 MIDLET Suite One
Đường liền thể hiện việc truy xuất Record store do MIDlet đó tạo ra,đường nét đứt là Record store do MIDlet khác tạo ra Trong MIDLET Suite One,MIDlet #1 và MIDlet #2 cùng có thể truy xuất 4 Record store MIDLET SuiteOne không thể truy xuất Record store trong Suite Two Trong MIDlet Suite Onetên của các Record store là duy nhấy, tuy nhiên Record store trong các MIDletSuite khác nhau có thể dùng chung một tên
Record Store còn có 2 thuộc tính là Version Number và Date/time Stamp,các giá trị này thay đổi khi thực hiện thêm, thay thế hay xóa một record, ngoài racòn cothể dùng cơ chế event handler (Listener) để phát hiện mỗi khi Record store
bị thay đổi Version number là một số integer, để biết giá trị khởi đầu cần gọihàm getVersion() sau khi tạo một Record store Date/time Stamp là số long
Trang 38integer, là số miliseconds kể từ ngày 1 tháng 1 năm 1970, giá trị này được biếtthông qua hàm getLastModified().
1.4.2 Các vấn đề liên quan đến RMS
1.4.2.1 Hạn chế về khả năng lưu trữ của thiết bị di động
Dung lượng vùng nhớ (non-volatile memory) dành riêng cho việc lưu trữ
dữ liệu trong RMS thay đổi tùy theo thiết bị di động Đặc tả MIDP yêu cầu rằngcác nhà sản xuất thiết bị di động phải dành ra vùng nhớ có kích thước ít nhất 8Kcho việc lưu trữ dữ liệu trong RMS Đặc tả không nêu giới hạn trên cho mỗiRecord RMS cung cấp các API để xác định kích thước của mỗi Record, tổngdung lượng của RecordStore và kích thước còn lại của vùng nhớ này Do đótrong quá trình phát triển các ứng dụng J2ME lập trình viên phải cân nhắc trongviệc sử dụng vùng nhớ này
1.4.2.2 Tốc độ truy xuất dữ liệu
Các thao tác trên vùng nhớ này (non-volatile memory) tất nhiên sẽ chậmhơn nhiều khi truy xuất dữ liệu trên bộ nhớ RAM (volatile memory) Nó sẽ giốngnhư tốc độ đọc ổ cứng và tốc độ đọc từ RAM của máy tính Vì vậy trong kỹ thuậtlập trình phải thường xuyên cache dữ liệu và các thao tác liên quan đến RMS chỉthực hiện tập trung một lần (lúc khởi động hay đóng ứng dụng)
1.4.2.3 Cơ chế luồng an toàn.
Nếu RecordStore của chỉ được sử dụng bởi một MIDlet thì không phải lolắng về vấn đề này vì RMS sẽ dành riêng một Thread để thực hiện các thao táctrên RecordStore Tuy nhiên nếu có nhiều MIDlet và Thread cùng chia sẻ mộtRecordStore thì phải chú ý đến kỹ thuật lập trình Thread để đảm bảo không có sựxung đột dữ liệu
1.5 Bluetooth API – JSR 82
Bluetooth là một trong những giao thức truyền thông không dây Nó được
sử dụng chủ yếu cho khoảng cách ngắn và trong các thiết bị với tiêu thụ điệnnăng thấp Với sự trợ giúp của Bluetooth, bạn có thể giao tiếp một cách có định
Trang 39hướng lên đến 30 feet tại 1 Mb/s JSR 82 là dựa trên phiên bản 1.1 của đặc tảBluetooth.
Bluetooth có tính mở, là một tiêu chuẩn không độc quyền cho việc pháttriển các ứng dụng Bluetooth bằng cách sử dụng ngôn ngữ lập trình Java Nó chegiấu sự phức tạp của giao thức Bluetooth sau một tập các Java API; nó nhấnmạnh vào việc phát triển ứng dụng hơn là các chi tiết ở cấp thấp của Bluetooth
1.5.1 API java cho Bluetooth
Các API Java cho Bluetooth định nghĩa 2 package và nó phụ thuộc vàopackage javax.microedition.io.*, đó 2 là package:
- javax.bluetooth: core Bluetooth API
- javax.obex: APIs cho giao thức Object Exchange (OBEX)
OBEX API được định nghĩa một cách độc lập của tầng(layer) transportBluetooth và được đóng gói riêng Mỗi gói ở trên đại diện cho một gói tùy chọnriêng biệt, có nghĩa là một implement CLDC có thể bao gồm 1 gói hoặc cả hai.Các thiết bị enable MIDP dự kiến sẽ là các loại thiết bị để kết hợp các đặc tả này.Bài viết này tập trung vào core Bluetooth API (javax.bluetooth)
Các API của package javax.bluetooth gồm có các đặc điểm sau:
Đăng ký dịch vụ
Khám phá các thiết bị và dịch vụ
Thiết lập kết nối RFCOMM, L2CAP giữa các thiết bị
Sử dụng những kết nối, gửi và nhận dữ liệu
Quản lý và điều khiển các kết nối truyền thông
Cung cấp bảo mật cho các hoạt động này
1.5.2 Bluetooth Protocol
Gói javax.bluetooth định nghĩa các giao thức sau cho giao tiếp:
L2CAP
1.5.2.1 Logical Link Control and Adaptation Protocol (L2CAP)
JSR 82 định nghĩa các giao diện L2CAPConnectionNotifier vàL2CAPConnection cho việc gửi và nhận các packet thông qua kênh L2CAP
Trang 40Chúng được dẫn xuất từ giao diện Connection của CLDC Generic ConnectionFrameWork.
Một server L2CAP được tạo bằng cách gọi phương thức Connector.open()với một chuỗi String kết hợp Định dạng của chuỗi này được định nghĩa bởi JSR-
82 Chuỗi này bắt đầu với tiền tố “btl2cap://” và sau dấu “//” có thể là các tham
số liên quan đến master/slave, hay tham số bảo mật(xác thực, mã hóa, ủy quyền)
Nó cũng có thể chứa các thông số liên quan đến tham chiếu của ứng dụng chomột kích thước Maximum Transmit Unit(MTU) trong các chỉ thị gửi/nhận
Một đối tượng L2CAPConnectionNotifier được trả về khi mở một kết nốiserver Phương thức acceptAndOpen() có thể được sử dụng để chấp nhận các kếtnối các client từ xa(remote) Các gói L2CAP được gửi hoặc nhận được bằng cách
sử dụng phương thức gửi và nhận của lớp L2CAPConnection Một ứng dụng sửdụng các kết nối L2CAP phải cung cấp điều khiển flow riêng mình nếu cần thiết.Các client L2CAP được tạo ra cũng sử dụng phương thức Connector.open() vớimột tham số kết nối kiểu string
1.5.2.2 Radio Frequency Communication (RFCOMM)
Các kết nối RFCOMM cung cấp các giao tiếp đáng tin cậy, hai chiều,hướng stream(stream-oriented) Trong JSR-82, API dựa trên các giao diệnStreamConnectionNotifier và StreamConnection của GCF của CLDC
Một server RFCOMM được tạo ra bằng cách gọi phương thứcConnector.open() với tham số là một chuỗi string kết nối máy chủ Định dạngcủa chuỗi được xác định bởi JSR-82 Chuỗi kết nối bắt đầu với tiền tố “btspp://”
và có thể chứa các thông số liên quan đến master/slave, hoặc các thông số bảomật (xác thực, mã hóa, và ủy quyền)
Một đối tượng StreamConnectionNotifier được trả về khi mở một kết nốimáy chủ và có thể sử dụng phương thức acceptAndOpen() để chấp nhận các kếtnối với client ở xa(remote) Các stream input/output được sử dụng để đọc hay ghi
dữ liệu trên một kết nối Các client RFCOMM được tạo ra bằng cách gọi phươngthức Connector.open() kết hợp với một tham số kết nối kiểu string
1.5.3 Mô hình kết nối client-server