2 State Diagram
4.5 Luồng xử lý khi đạn chưa ra khỏi màn hình
Hình 21: sơ đồ hoạt động khi đạn của Player chưa ra ngoài màn hình
Với mỗi viên đạn của Player ta duyệt qua tất cả các nhân vật Black xem có va chạm không. Nếu không va chạm thì duyệt qua các Turret, nếu nhân vật thứ j có va cham thì ta giảm mạng của Black j đi 1 và tăng điểm của Player lên 1. Sau đó xét số mạng của Black j đã đã <= 0 chưa, nếu thỏa mãn thì Nhân vật Black thứ j này sẽ tự nổ bằng phương thức makeExplosion(). Sau khi nhân vật này nổ ta không loại bỏ nó mà chỉ đặt nó đến một chỗ bất kì khác. (chỗ bất kì này chắc chắn phải nằm trong bản đồ nhưng không nằm trong màn hình). Sau đó phải remove viên đạn đó khỏi bộ nhớ và màn hình. Tiếp tục duyệt cho đến khi hết nhân vật Black rồi chuyển đến duyệt nhân vật Turret. Chỉ có một chú ý khi xét đến va chạm với Turret là mỗi vòng lặp đạn của Player ta phải xem mạng của Turret có lớn hơn 0 không? Nếu không thì Turret đã bị “hạ gục” Victory!
Ở trên mới chỉ xét đến đạn của nhân vật Player, khi xét đến đạn của Black hay Turret cũng gần tương tự chỉ khác là ta lại xét va chạm của đạn với Player. Nếu bị trúng đạn của Black thì Player giảm mạng đi một còn chúng đạn của Turret thì giảm mạng đi 5. Trong mỗi vòng lặp đạn này cũng phải xét xem mạng của Player có lớn hơn 0 không? Nếu không thì Game Over!
Chú ý: Với một hệ thống phức tạp thì người ta sử dụng rất nhiều các Diagram cho việc mô hình hóa hệ thống, bản chất một chương trình game cũng là một hệ thống với các đối tượng tác động hay tác nhân (Actor), các sự kiện được tác động bơi tác nhân như sự kiện bắn khi đối tượng nằm trong tầm bắn, sự kiện mất mạng
Game Over. Sự kiện victory khi tất cả pháo bị cháy hết…vì quy mô chương trình em chỉ sử dụng một vài Diagram cơ bản nhất.
Phần 5
Công cụ lập trình Game J2ME của Netbeans
Phần này giới thiệu hai công cụ thiết kế game là GameDesign và VisualMidlet.
Trong đó GameDesign làm phần giao diện game còn phần VisualMIDlet làm phần menu cho game.
1. GameDesign
Sau khi tìm hiểu về lý thuyết GAME API ta đến với việc thực hành những kiến thức đó trên ngôn ngữ và công cụ cụ thể. Đây là khung màn hình GameDesign của Netbeans.
Công cụ GameDesign của Netbeans hỗ trợ làm game J2ME như sau: Tạo các nhân vật chuyển động (Create Sprite)
Tạo các TiledLayer (Create tild layer) Tạo các khung cảnh (Scenes)
1.1Ảnh dùng để làm game
Ví dụ sau đây chỉ sử dụng một ảnh cho tất cả các đối tượng đồ họa trong game. Vì bộ nhớ hạn hẹp của di động, nên dùng những ảnh lớn thay vì nhiều ảnh nhỏ. Bơi mỗi ảnh sẽ phải có một Header lưu giữ các thông tin về nó. Nếu dùng nhiều ảnh thì sẽ phải lưu nhiều header của nó.
Để tạo một Sprite hoặc TiledLayer ta import ảnh vào game, công cụ tự chia ảnh lớn thành các tile nhỏ tùy vào lựa chọn kích thước của mỗi tile yêu cầu.
Hình 23: Một ảnh đươc phân chia thành các tile cùng kích thước
1.2Ta ̣o hình ảnh nhân vật chuyển động
Để tạo một nhân vật chuyển động ta chỉ cần kéo những tile trên vào các ô tương ứng để tạo thành một chuỗi các ảnh.
Hình 24: tạo nhân vật chuyển động xang phải
GameDesign hỗ trợ test thử bằng cách nhấn nút play hay pause. Số 100ms ơ trên có nghĩa là độ trễ giữa hai ảnh kế tiếp nhau. Sau khi chạy hết một lượt, quá trình được lặp lại.
1.3Tạo các TiledLayer
Tạo các TiledLayer bằng cách chọn những tile ơ dưới và đặt lên khung hình trắng ơ trên. Kích thước của TiledLayer có thể thay đổi được.
1.4Tạo các tile động trên TiledLayer
Tạo ra những Tile động trên một TiledLayer bằng cách kích vào “New Animated Tile”. Tạo một tile động tương tự như tạo một nhân vật chuyển động, chỉ khác là tile động phải được gắn cố định vào trong một TiledLayer nào đó. Ở trên hình dưới đây ta gắn 4 tile động vào một TiledLayer.
1.5Tạo bản đồ
Bước cuối cùng là tạo ra tạo ra bản đồ cho game bằng cách kết hợp các TiledLayer và các nhân vật.
Hình 27: Tạo scene từ các TileLayer và các Sprite
Chý ý khi cho các TiledLayers và các Sprite vào bản đồ ta phải để TiledLayer ơ mức sâu hơn còn các nhân vật ơ mức cao để nhân vật luôn ơ trên.
Tóm lại GameDesign hỗ trợ tốt làm giao diện còn những vấn đề còn lại như làm kịch bản, thiết kế các lớp… do người lập trình.
2 VisualMIDlet
Đây là công cụ tạo ra các ứng dụng J2ME bằng lưu đồ thao tác rất trực quan. Sau đây là cơ cấu MIDlet em sử dụng trong Game của mình.
Table 1: Sơ đồ chuyển thao tác
Hình 28: Lưu đồ chuyển mạch trong thiết kế menu game
Điểm bắt đầu là đối tượng Mobile Device, sau khi chạy chương trình sơ đồ chuyển từ started đến đối tượng SplashScreen, đối tượng này thực hiện chức năng tạo một khoảng chờ và phóng một ảnh lên màn hình để quảng cáo về game. Sau một khoảng thời gian sẽ tự động chuyển đến đối tượng List. Đối tượng List gồm một danh sách các chức năng của chương trình như : New game – bắt đầu chơi, Maps - chọn bản đồ, Settings - tùy chỉnh, High Score – điểm số của những người chơi cao nhất, Help – hướng dẫn phím bấm, About – thông tin tác giả, Exit – thoát. Khi
lên màn hình. Giả sử khi ta chọn Maps luồng màn hình sẽ chuyển đến đối tượng FormMaps. Trong đối tương này là 3 Items cho phép người chơi chọn kiểu bản đồ: Small, Medium, hay Large (Các Item này không được thể hiện trên lưu đồ). Đối tượng FormMaps cũng chứa một lệnh Back (BackCommand) để quay về danh sách List. Các Form khác: FormSettings, FormHighScore, FormHelp, FormAbout cũng được thiết kế tương tự formMap
Chú ý: thành phần New Game trong List không chuyển mạch tới đối tượng nào trong menu vì khi chọn New Game màn hình chuyển đến đối tượng GameCanvas và bắt đầu chơi. Canvas là đối tượng giao diện mức thấp nên không cho phép thao tác trên lưu đồ. Ta phải tự tạo các chức năng trong một Canvas, nếu muốn từ Canvas có thể quay lại Menu chính phải bắt sự kiện phím bấm Back cho Canvas.
Phần 6
Giới thiệu luật chơi
1. Nhiệm vụ:
Câu chuyện bắt đầu khi máy bay chiến đấu của bạn được giao nhiệm vụ đặc biệt la xung kích vao hang ổ quân địch. Nhiệm vụ la phải tiêu diệt hết số pháo
của địch đê quân ta có thê vao tiếp ứng.
Bạn phải dè chừng với pháo vì chúng có sức công phá, tầm bắn rất xa, mạng lớn, tuy chỉ có nhược điểm bắn chậm và không di chuyển. Hãy lợi dụng điểm yếu đó vì bạn có tốc độ rất tốt. Tuy nhiên phải luôn luôn cảnh giác trước máy bay của địch
. Chúng rất đông và luôn rình rập khắp nơi. Một điều không may là bạn sẽ không thể “xử lý” chúng. Luôn nhớ mục tiêu của bạn là phải diệt hết pháo. Chúc bạn thành công!
2. Cách chơi
Game có 3 loại bản đồ tương rộng hẹp khác nhau (mặc định là bản đồ trung bình). Game cho phép chọn chế độ autofire trong Settings. Nếu chọn chức năng này Player sẽ tự bắn khi gặp quân địch (giống với quân địch hễ gặp Player thì bắn). Khuyến khích chọn chế độ này.
3. Một số thông tin về game
Thông tin nhân vật
STT Mạng Tầm xa Tốc độ đạn Độ trễ của đạn Tốc độ
Player 100 180 10 15ms 10
Turret 100 200 3 2000ms 10
Black 10 140 5 600ms 0
Độ khó của game được tính theo số lượng Turret và Black.
STT Easy Normal Hard
Player 1 1 1
Turret 7 14 21
Black 7 14 21
Độ rộng của bản đồ
Small 448 x 448 (Pixel)
Normal 672 x 672
4. Một số hình ảnh trong game
Hình 29: Màn hình Start Hình 30: Menu chính Hình 31: Chọn bản đồ
Hình 35: Player di chuyển Hình 36: Player bắn Turret Hình 37: Player bắn black
Phần 7
Kết luận
1. Những kết quả đạt được
Sau khi làm xong bài tập thực tập “Lập trình game di động với J2ME” em đã đạt được những kết quả sau:
Về kiến thức
• Đã nắm bắt được cơ chế hoạt động của máy ảo Java trên điện thoại di động, nhờ đó hoàn thiện kỹ năng xây dựng một ứng dụng bằng ngôn ngữ J2ME.
• Học được những kiến thức cơ bản về làm game cũng như lập trình thực tế trên ngôn ngữ J2ME.
• Hiểu được những khái niệm cơ bản về ngôn ngữ UML.
Về chương trình
• Kích thước file JAR là 106 KB, phù hợp với hầu hết các dòng điện thoại có hỗ trợ MIDP 2.0.
• Chương trình chỉ sử dụng những thư viện cơ bản của J2ME nên có thể chạy trên nhiều dòng máy.
2. Những hạn chế
Bên cạnh những kết quả trên, bản thân em thấy những hạn chế cần khắc phục sau:
• Kích thước của chương trình chưa được tối ưu hóa do các nguyên nhân: Chưa tránh khỏi lối lập trình hướng đối tượng của J2SE. Một số kỹ thuật áp dụng làm cho code sáng sủa nhưng lại làm tăng kích thước chương trình, tăng bộ nhớ khi chạy.
Chưa có nhiều thời gian để tối ưu hóa các đoạn mã của chương trình.
• Chưa có điều kiện test trên máy thật. Em mới chỉ test trên hai bộ công cụ hỗ trợ giả lập điện thoại là wireless tookit của SUN và series 40 SDK của Nokia.
1. Những kết quả đạt được
2. Những hạn chế
• Chưa có âm thanh cho game – em mới chỉ tìm hiểu công cụ Adobe Audition xử lý âm thanh khá tốt. Nhưng vấn đề tìm dữ liệu bộ âm thanh và cho âm thanh vào game đòi hỏi nhiều thời gian và tỉ mỉ.
3. Hướng phát triển
Với 4 tuần thực tập, em mới chỉ bắt đầu bước vào thế giới làm game di động. Hướng phát triển sau này của em là nghiên cứu thêm các kỹ thuật làm game như tạo âm thanh, tạo game 3D, và tìm hiểu những công cụ mạnh hơn cho việc xây dựng đồ họa của Game.
Danh mục các từ viết tắt
J2ME Java 2 Mobile Edition Ngôn ngữ lập trình Java
Mobile
CLDC Connected, Limited Device Confinguation Cấu hình thiết bị kết nối giới hạn
MIDP Mobile Information Device Profile Hiện trạng thông tin thiết bị di động
JVM Java Virtual Machine Máy ảo Java
KVM Kernel Virtual Machine Nhân máy ảo
RMS Record Management System Hệ thống quản lý bản ghi
SMS Short Message Service Dịch vụ tin nhắn ngắn
RSS Really Simple Syndication Phương pháp tổ trức tin đơn giản
Danh mục hình
Hình 1: sự đa dạng về chủng loại điện thoại...6
Hình 2: Sự phổ biến của các thiết bị hỗ trợ máy ảo Java...7
Hình 3: Các tầng trong nền tảng J2ME...8
Hình 4: Quá trình xây dựng ứng dụng cho thiết bị di động...9
Hình 5: Các trạng thái và vòng đời của Midlet...11
Hình 6: Phân lớp API của J2ME...12
Hình 7: Nokia Series 40 SDK, 3rd Edition...15
Hình 8: Điểm tham chiếu của Sprite...18
Hình 9: Nhân vật Player trong chương trình game...19
Hình 10: Chuỗi ảnh tạo chuyển động cho Sprire...20
Hình 11: Một số khung cảnh trong game Alpha Wing...23
Hình 12: Một ảnh gồm hai tile...23
Hình 13: Một background được xây dựng từ mà trận...24
Hình 14: Use Case các nhân vật và các phương thức của chúng...33
Hình 15: Use Case chuyển trạng thái của game...35
Hình 16: Mối quan hệ lớp giữa các nhân vật...36
Hình 17: Luồng xử lý chính trong chương trình...40
Hình 18: Luồng xử lý phím bấm trên canvas...41
Hình 19: Luồng xác định đối tượng bắn của Player...43
Hình20: Sơ đồ hoạt động khi đạn ra ngoài màn hình...44
Hình 21: sơ đồ hoạt động khi đạn của Player chưa ra ngoài màn hình...45
Hình 22: giao diện một chương trình demo của GameDesign...47
Hình 23: Một ảnh đươc phân chia thành các tile cùng kích thước...48
Hình 24: tạo nhân vật chuyển động xang phải...49
Hình 25: Tạo TiledLayer thảm cỏ...50
Hình 26: Bốn tile động được cho vào TiledLayer vũng nước...51
Hình 27: Tạo scene từ các TileLayer và các Sprite...52
Hình 28: Lưu đồ chuyển mạch trong thiết kế menu game...53
Hình 29: Màn hình Start Hình 30: Menu chính Hình 31: Chọn bản đồ...57
Hình 29: Màn hình Start Hình 30: Menu chính Hình 31: Chọn bản đồ...57
Hình 29: Màn hình Start Hình 30: Menu chính Hình 31: Chọn bản đồ...57
Hình 32: Chọn các chế độ Hình 33: Bảng thành tích Hình 34: Hướng dẫn...57
Hình 32: Chọn các chế độ Hình 33: Bảng thành tích Hình 34: Hướng dẫn...57
Hình 35: Player di chuyển Hình 36: Player bắn Turret Hình 37: Player bắn black...58
Hình 35: Player di chuyển Hình 36: Player bắn Turret Hình 37: Player bắn black...58
Hình 35: Player di chuyển Hình 36: Player bắn Turret Hình 37: Player bắn black...58
Hình 38: Black vừa đi vừa bắn Hình 39: Khi player thua Hình 40: Khi chiến thắng...58
Hình 38: Black vừa đi vừa bắn Hình 39: Khi player thua Hình 40: Khi chiến thắng...58
Hình 38: Black vừa đi vừa bắn Hình 39: Khi player thua Hình 40: Khi chiến thắng...58
Tài liệu tham khảo
[1]. J2ME Game Programming – by Martin Wells
[2]. Wireless Game Development in Java with MIDP.2.0 - by Ralph Barbagallo [3]. J2ME Game Development with MIDP2 – by Jason Lam