Thực tập cơ sở lập trình game di động với j2me
Lââp trình game di đôâng với J2ME
Tin2_K50
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
KHOA CÔNG NGHỆ THÔNG TIN
Thực Tâ pâ Cơ Sơ
Lâ âp Trình Game Di Đô âng Với J2ME
Giảng viên hướng dẫn:
Thầy giáo
Thạc Bình Cường
Page 1
Lââp trình game di đôâng với J2ME
Tin2_K50
Nôâi Dung
Lơi mơ đầu.............................................................................................................................................4
Phần 1.....................................................................................................................................................5
Cơ Sơ Lý Thuyết Lâ âp Trình Di Đô âng...................................................................................................5
1.
Nhưng hạn chế của lâ âp trình di đô âng...........................................................................................5
2.
Tổng quan về ngôn ngư J2ME......................................................................................................6
2.1
Sự phổ biến của J2ME.................................................................................................................6
2.2
Nền tảng J2ME............................................................................................................................7
2.3
Căn bản lâ âp trình J2ME...............................................................................................................9
2.3.1
Bô â MIDlet..........................................................................................................................10
2.3.2
API của J2ME....................................................................................................................11
Phần 2...................................................................................................................................................13
J2ME Game API..................................................................................................................................13
1. J2ME Game API..............................................................................................................................13
1.1
GameCanvas class.....................................................................................................................14
1.2
Layer class.................................................................................................................................17
1.3
Sprite Class................................................................................................................................17
1.4
TiledLayer class.........................................................................................................................24
1.5
LayerManager class...................................................................................................................26
Phần 3...................................................................................................................................................28
Tổng Quan, Kiâch Bản Và Phân Tích Lâ âp Trình Game....................................................................28
1. Tổng quan về làm Game.................................................................................................................28
1.1
Phân loại game...........................................................................................................................28
1.2
Nhưng đòi hỏi chung của mô ât game..........................................................................................28
1.3
Quy trình phát triển game..........................................................................................................28
2. Các Nhân Vâ ât Game Và Phân Tích Lâ âp Trình..............................................................................29
2.1
Các nhân vâ ât trong game và đă âc điểm:......................................................................................29
2.2
Phân tích các nhân vâ ât theo lớp..................................................................................................30
2.3
Mô ât số vấn đề đă ât ra và hướng giải quyết:.................................................................................32
Phần 4...................................................................................................................................................33
Xây dưng mô hình UML cho chương trình.......................................................................................33
1 Use Case Diagram.............................................................................................................................33
Page 2
Lââp trình game di đôâng với J2ME
Tin2_K50
2 State Diagram...................................................................................................................................34
3 Class Diagram...................................................................................................................................36
.1 Class Diagram của các nhân vâ ât trong game..................................................................................36
.2 Class diagram của lớp giao diê ân....................................................................................................38
4 Mô ât số luồng quan trọng trong chương trình.................................................................................39
4.1 Luồng chính.................................................................................................................................39
4.2 Luồng sư lý phím bấm.................................................................................................................41
4.3 Luồng xác định đối tương bắn của Player....................................................................................42
4.4 Luồng quản lý đạn của Player trong màn hình.............................................................................43
4.5 Luồng xư lý khi đaân chưa ra khỏi màn hình................................................................................44
Phần 5...................................................................................................................................................46
Công cụ lâ âp trình Game J2ME của Netbeans...................................................................................46
1. GameDesign.....................................................................................................................................46
1.1
Ảnh dùng để làm game..............................................................................................................47
1.2
Taâo hình ảnh nhân vâ ât chuyển đô âng...........................................................................................47
1.3
Tạo các TiledLayer....................................................................................................................49
1.4
Tạo các tile đô nâ g trên TiledLayer..............................................................................................50
1.5
Tạo bản đồ.................................................................................................................................51
2 VisualMIDlet....................................................................................................................................52
Phần 6...................................................................................................................................................54
Giới thiê âu luâ ât chơi..............................................................................................................................54
1. Nhiê âm vụ:..........................................................................................................................................54
2. Cách chơi...........................................................................................................................................54
3. Mô ât số thông tin về game..................................................................................................................55
4. Mô ât số hình ảnh trong game..............................................................................................................56
Phần 7...................................................................................................................................................58
Kết luâ ân................................................................................................................................................58
1. Nhưng kết quả đạt đươc.....................................................................................................................58
2. Nhưng hạn chế...................................................................................................................................58
3. Hướng phát triển................................................................................................................................59
Danh mục các tư viết tắt.....................................................................................................................59
Danh mục hình.....................................................................................................................................60
Tài liê âu tham khảo...............................................................................................................................60
Page 3
Lââp trình game di đôâng với J2ME
Tin2_K50
Lơi mơ đầu
Dịch vụ di đô nâ g đươc bắt đầu đươc cung câp tại Viê ât Nam vào năm 1992, khơi
đầu với nhưng điê ân thoại “cục gạch” phải đeo vai mà giá trên 2000 đô la. Với chi
vài trục thuê bao đăng kí đầu tiên thì cho đến nay đã hơn 20 triê âu thuê bao. Cùng
với tốc đô â phát triển đó là nhưng tiến bô â vươt bâ âc về tốc đô â xư lý. Nhờ đó lâ pâ
trình các ứng dụng cho loại thiết bị này tăng lên nhanh chóng, đă câ biê ât là các dịch
vụ giá trị gia tăng trên mạng di đô nâ g như SMS, RSS, WAP và ứng dụng dịch vụ
game. Qua tìm hiểu về, em thấy thị trường Game di đô nâ g tại Viê ât Nam đang phát
triển và có tiềm năng lớn; đó là lý do em chọn đề tài này.
Page 4
Lââp trình game di đôâng với J2ME
Tin2_K50
Phần 1
Cơ Sơ Lý Thuyết Lâ âp Trình Di Đô âng
Phần này em xin trình bày từ tổng quan đến chi tiết. Trước hết nói về các đă âc điểm
riêng biê ât của lâ pâ trình di đô nâ g, đă âc biê ât là nhưng hạn chế của nó, sau đó đến cơ
sơ của ngôn ngư lâ pâ trình di đô nâ g J2ME và cuối chương giới thiê âu về công cụ
giúp lâ pâ trình game di đô nâ g.
1. 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 đô nâ g so với lâ pâ trình cho PC là ta
phải quan tâm lớn đến bô â nhớ, kích thước màn hình hay thâ âm chí là màu sắc của
thiết bị. Nhưng vẫn đề đó lại không quan trọng bâ âc nhất đối với PC. Hơn thế nưa
ta còn phải quan tâm đến sự khác nhau giưa các hãng sản xuất cũng như dòng máy
di đô nâ g của hã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ùng trong
suốt quá trình chạy và đươc giải phóng khi ứng dụng kết thúc. Ứng dụng dành cho
di đô nâ g phải có bô nhớ nhỏ hơn vùng nhớ này mới có thể chạy đươc.
Mô ât loại bô â nhớ khác dùng để lưu trư là bô â nhớ RMS (Record Management
System). RMS là bô â nhớ mà thông tin vẫn còn đươc lưu khi ta tắt ứng dụng. Lấy
mô ât ví dụ trong game ta dùng bô â nhớ này để lưu top nhưng người chơi cao điểm
nhất. Các thông tin đó vẫn đươc câ âp nhâ ât cho lần chơi tiếp theo.
Sự phân mảnh
Giống như PC phân mảnh bô â nhớ có thể xảy ra với điê ân thoại.
Sự đa dạng về giao diê ân điê nâ thoaị
Page 5
Lââp trình game di đôâng với J2ME
Tin2_K50
Ngoài vấn đề về bô â nhớ khi lâ pâ trình ta còn phải quan tâm đến kích thước của
từng loại thiết bị cụ thể. Kích thước màn hình của điê nâ thoại mà ta lâ âp trình có
ảnh hương rất lớn đến cách thiết kế giao diê ân và lâ âp trình.
Hình 1: sự đa dạng về chủng loại điê ân thoại
2. Tổng quan về ngôn ngư J2ME
1. Sự phổ biến của J2ME
2. Nền tảng của J2ME
3. Căn bản lâ âp trình J2ME
2.1 Sư phổ biến của J2ME
Tương ứng với sự hạn chế của các thiết bị di đô nâ g thì ngôn ngư lâ âp trình cho
chúng cũng có phần hạn chế so với trong PC. Trong đó ngôn ngư chiếm thị phần
nhiều nhất là J2ME (Java 2 Mobile Edition) do tâ âp đoàn SUN phát triển. Đây là
ngôn ngư lâ âp trình Mobile bằng Java. Lâ pâ trình bằng J2ME hay bằng Java nói
chung có thể chạy trên nhiều thiết bị phần cứng khác nhau “Write one, run
everywhere”, miễn là hỗ trơ môi trường java (JRE – Java Runtime Enviromment).
Biểu đồ dưới đây nói lên sự phát triển của các thiết bị di đô nâ g có hỗ trơ máy ảo
Java (Java Virtual Machine).
Page 6
Lââp trình game di đôâng với J2ME
Tin2_K50
Hình 2: Sự phổ biến của các thiết bị hỗ trơ máy ảo Java
Tuy nhiên do sự đa dạng của các dòng máy, mỗi dòng hỗ trơ mô ât API riêng để lâ âp
trình cho thiết bị đó nên khi làm mô ât ứng dụng có hỗ trơ các tính năng cấp cao như
âm thanh, đồ họa thì ta không thể viết code mô ât lần mà phải viết riêng cho từng
loại máy và sư dụng thư viê ân mà máy đó hỗ trơ.
2.2
Nền tảng J2ME
Mục tiêu của J2ME là cho phép người lâ pâ trình viết các ứng dụng đô câ lâ pâ với
thiết bị di đô nâ g mà không cần quan tâm đến phần cứng của máy. Sau đây là phân
lớp theo tầng của J2ME đươc xây dựng trên CLDC (thiết bị kết nối hạn chế về cấu
hình).
Page 7
Lââp trình game di đôâng với J2ME
Tin2_K50
Hình 3: Các tầng trong nền tảng J2ME
Như vâ ây J2ME gồm các tầng sau:
Tầng phần cứng thiết bị
Tầng máy ảo Java
Tầng cấu hình
Tầng hiê ân trạng
1.2.1 Tầng phần cứng thiết bị
Đây là thiết bị di đô nâ g, có bô â nhớ và bô â xư lý. Mă âc dù phần này không phải là
mô ât phần của J2ME nhưng nó là “vâ ât chủ” cung cấp phần cứng thích hơp cho
viê âc cài đă ât và thực thi các ứng dụng J2ME. Mỗi mô ât thiết bị di đô nâ g khác nhau
sẽ có các bô â xư lý khác nhau và tâ âp lê ânh khác nhau. J2ME có vai trò là cung cấp
mô ât môi trường chuẩn cho tất cả các loại thiết bị di đô nâ g.
1.2.2 Tầng máy ảo java
Khi mã nguồn Java đươc biên dịch nó chuyển đổi thành mã bytecode. Mã này sau
đó đươc chuyển thành mã máy của các thiết bị di đô nâ g. Vâ ây có thể nói tầng máy
ảo Java (K Virtual Machine - KVM) là bô â biên dịch mã bytecode, có nhiê âm vụ
Page 8
Lââp trình game di đôâng với J2ME
Tin2_K50
chuyển mã bytecode của chương trình Java thành ngôn ngư máy để chạy trên các
thiết bị di đô nâ g. Có nghĩa là thiết bị nào hỗ trơ KVM thì có thể chạy đươc các
chương trình J2ME.
KVM (Kernel Virtual Machine): máy ảo được thết kế với nhỏ gọn với mục tiêu tiết kiê êm bô ê nhớ thiết bị.
Hình 4: Quá trình xây dựng ứng dụng cho thiết bị di động
1.2.3 Tầng cấu hình
Tầng cấu hình CLDC (Connected, Limited Device Confinguation – thiết bị kết nối
hạn chế về cấu hình) định nghĩa đă câ tả máy ảo KVM và định nghĩa mô ât tâ pâ hơp
các lớp có khả năng hỗ trơ diê ân rô âng nhưng thiết bị thuô âc loại CLDC.
1.2.4 Tầng hiê ân trạng
Tầng hiê ân trạng MIDP (Mobile Information Device Profile- thông tin thiết bị di
đô nâ g) cung cấp các API thân thiê ân cho lâ âp trình viên. Tầng hiê ân trạng đươc xây
dựng trên lớp cấu hình và cung cấp nhiều thư viê nâ hơn so với tầng cấu hình.
2.3 Căn bản lâ âp trình J2ME
Page 9
Lââp trình game di đôâng với J2ME
Tin2_K50
2.3.1 Bô â MIDlet
MIDlet là mô ât ứng dụng Java đươc thiết kết để chạy trên các thiết bị di đô nâ g. Mô ât
MIDlet chứa các lớp Java dùng bơi CLDC và MIDP. Mô ât bô â MIDlet gồm mô ât
hoă âc nhiều MIDlet đươc đóng gói cùng nhau và nén trong file JAR. File JAR sẵn
sàng cho viê âc cài đă ât vào điê nâ thoại. Vấn đề của lâ âp trình viên là tạo ra các
MIDlet. Sau đây là cấu trúc lâ pâ trình của mô ât MIDlet.
Mô ât MIDlet có 3 phương thức: startApp(), pauseApp(), và destroyApp(). Dưới
đây là mô ât bô â khung lâ âp trình của mô tâ MIDlet:
import javax.microedition.midlet.*;
public class MIDletExample extends MIDlet {
public
public
public
public
void
void
void
void
MIDletExample() { }
startApp() { }
pauseApp() { }
destroyApp(boolean unconditional) { }
}
Thành phần import:
Khai báo sư dụng các lớp cần thiết trong thư viê ân MIDP và CLDC.
Hàm khơi tạo MIDletExample ():
Hàm khơi tạo đươc thực hiê ân mô ât lần khi MIDlet khơi đô nâ g.
startApp():
phương thức này đươc gọi bơi bô â quản lý ứng dụng khi khơi tạo MIDlet và
mỗi khi MIDlet trơ về từ trạng thái paused.
pauseApp():
Page 10
Lââp trình game di đôâng với J2ME
Tin2_K50
phương thức này gọi bô â quản lý ứng dụng mỗi khi ứng dụng cần tạm dừng
ứng dụng đang thực thi. Khi sư dụng pauseApp ta giải phóng mô ât phần tài nguyên
của MIDlet để dành bô â nhớ cho các ứng dụng khác.
destroyApp():
Phương thức này đươc dùng khi thoát khỏi MIDlet. Trước đó phải giải
phóng hoàn toàn bô â nhớ đươc lấy bơi MIDlet.
Có chú ý là tất cả các ứng dụng MIDlet đươc viết ra đều kế thừa từ lớp MIDlet có
sẵn trong MIDP. Lớp MIDlet nằm trong gói: javax.microedition.midlet.* . Lớp
này quản lý chu kì sống của các ứng dụng MIDlet.
Hình 5: Các trạng thái và vòng đời của Midlet
2.3.2 API của J2ME
Page 11
Lââp trình game di đôâng với J2ME
Tin2_K50
Hình 6: Phân lớp API của J2ME
J2ME cung cấp hai mức đồ họa cho lớp MIDlet. Mức cao (High Level) gồm nhưng
thành phần như: Textbox, Form, Alert, List … Đă âc điểm của các thành phần mức
thấp là tính khả chuyển ( khả năng dùng lại) tuy nhiên các thành phần này không
thể thay đổi tùy ý đươc. Thành phân mức thấp (Low Level) chi có Canvas. Lớp
Canvas đươc sư dụng trong các chương trình game hay các ứng dụng cần vẽ nhưng
đối tương riêng biê ât, đă câ điểm của nó là ít tính khả chuyển, ta thao tác với lớp này
để vẽ các đối tương lên màn hình. Lớp Canvas cũng có thể bắt các sự kiê ân bằng
nhấn phím bấm. Vì là mức thấp cho phép người lâ âp trình thỏa mái thao tác với
màn hình. Cả hai lớp trên đều nằm trong gói; import javax.microedition.lcdui.*;
Trong chương trình game em làm có sư dụng cả hai thành phần trên, trong đó các
thành phần mức cao (Textbox, List, Form..) để tạo menu game còn mức thấp
(Canvas) để tạo ra các nhân vâ ât và giao diê ân game.
Page 12
Lââp trình game di đôâng với J2ME
Tin2_K50
Phần 2
J2ME Game API
Phần mô ât đã nói tổng quan về lâ pâ trình cho di đô nâ g, sau đây em xin đươc bắt tay
vào luôn với mô ât mảng kiến thức rất thú vị của J2ME là Game API. Phần hai gồm
hai mục:
Giới thiê âu lý thuyết Game API của J2ME
Công cụ lâ pâ trình Java Game của Netbeans
1. J2ME Game API
1
2
3
4
5
Lớp Canvas
Lớp Layer
Lớp Sprite
Lớp TiledLayer
Lớp LayerManager
Thực tế ta hoàn toàn có thể làm game J2ME với kiến thức về lâ pâ trình di đô nâ g
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 ta 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ế ta 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ời
gian 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 javax.microedition.lcdui.game. Mô ât số lớp
quan trọng của nó như: GameCanvas, Layer, Sprites, TiledLayer, và
LayerManager.
GameCanvas: kế thừa từ lớp Canvas, có thể coi đay là màn hình điê ân thoại
Layer: ít đươc sư dụng trực tiếp nhưng đươc kết bơi lớp Sprite và TiledLayer
Page 13
Lââp trình game di đôâng với J2ME
Tin2_K50
Sprites: lớp để tạo các nhân vâ ât và các đối tương chuyển đô nâ g
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
Ta sẽ đi phân tích từng lớp mô ât.
1.1GameCanvas 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 nhờ đó tăng
tốc đô â refresh của màn hình. Nó có thêm hai mơ rô nâ g so với Canvas là Polling
Input – lươc bỏ đầu vào và Frame Buffer – dùng vùng đê âm để chứa nô âi dung
Canvas.
Polling Input
Phương thức int getKeyStates()
lấy thông tin về phím bấm của
điê ân thoại để biết người chơi nhấn nút gì. Để hiểu hàm này ta cần nắm rõ cấu tạo
phím bấm của điê ân thoại.
Page 14
Lââp trình game di đôâng với J2ME
Tin2_K50
Canvas
Nhóm các phím có nhiều chức
năng
UP
RIGH
T
LEFT
FIRE
DOWN
Các phím sô
(mô ôt số phím số tương ứng với các
phím chức năng)
2 UP
8 DOWN
4 LEFT
6 RIGHT
5 FIRE
Hình 7: Nokia Series 40 SDK, 3rd Edition
Trong game di đô nâ g người ta thường sư dụng các phím chức năng để thao tác.
Mô ât game hoàn chinh có thể chi thao tác với 5 phím chức năng là UP, DOWN,
LEFT, RIGHT và phím FIRE (phím bắn). Ta có thể dùng các phím số tương ứng
thay cho các phím chức năng như bảng trên. Điê ân thọai bố trí các phím chức năng
đă tâ gần nhau để dễ thao tác.
Page 15
Lââp trình game di đôâng với J2ME
Tin2_K50
Quay trơ lại với phương thức getKeyStates(); nếu như mô ât phương thức lấy
mã của phím nhấn tương tự của lớp Canvas là getKeyCodes() sẽ kiểm tra tất
cả các phím xem phím nào nhấn thì phương thức mới của lớp GameCanvas chi
kiểm tra với các phím chức năng do đó thời gian nhâ nâ biết đươc phím bấm của lớp
GameCanvas sẽ nhanh hơn của lớp Canvas (kỹ thuâ ât này gọi là Polling Input –
lươc bỏ đầu vào).
Ví dụ nhâ ân biết phím bấm FIRE:
int pattern = getKeyState();
if ((pattern & GameCanvas.FIRE_PRESSED) != 0)
{
System.out.println("Fire!");
}
Hơn nưa viê âc lắng nghe mô ât phím đươc bấm bơi người dùng phải đươc đă tâ trong
đoạn chương trình lă pâ chính của chương trình while(isRunning) { …} nên tần xuất
sư dụng nó là rất lớn.
Frame Buffer
Kỹ thuâ ât này sư dụng phương thức protected
Graphics
getGraphics(); để lấy nô iâ dung của Canvas và cho vào bô â đê m
â . Ý tương của
Frame Buffer là mọi thao tác vẽ trên Canvas sẽ đươc gián tiếp thao tác với vùng
đê âm sau đó dùng phương thức public void flushGraphics() để đẩy nô âi
dung vùng đê âm ra Canvas. Với cải tiến này thì Frame Buffer có tốc đô â vẽ lên
Canvas nhanh hơn là vẽ trực tiếp lên Canvas vì thao tác với vùng đêm
ê nhanh la
hơn thao tác với mô êt đối tượng Canvas cụ thê, ta chi mất thêm hai thao tác là lấy
nô iâ dung Canvas vào đối tương của lớp Graphics với phương thức get và đẩy nô âi
dung từ đối tương Graphics vào Canvas với phương thức flush.
Cũng giống như thủ tục nhâ nâ biết phím bấm thao tác vẽ lên Canvas cũng đươc đă ât
trong đoạn chương trình lă pâ chính nên tần xuất sư dụng là rất lớn. Hơn nưa để đảm
bảo hình chuyển đô nâ g đươc “trung thực” – không bị giâ ât thì số lần refresh lại
Canvas, tức là số lần vẽ lại phải lớn hơn 24 lần trong 1 giây!.
Page 16
Lââp trình game di đôâng với J2ME
Tin2_K50
1.2Layer class
Trước khi đi đến hai lớp quan trọng tiếp theo là Sprite và TiledLayer ta phải nói về
khái niê âm Layer. Lớp layer của Game API rất đơn giản nhưng nó đươc kế thừa bơi
hai lớp Sprite 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à ta 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ó đô â xâ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
Layer
Các phương thức này đều đươc kế thừa bơi các lớp Sprite và TiledLayer.
1.3Sprite Class
Sprite là lớp của nhưng đối tương chuyển đô nâ g trong game. Sprite gồm nhưng
chức năng không chi vẽ và di chuyển các hình ảnh mà còn có thể xác định va chạm
giưa các Sprite với nhau và giưa Sprite với TiledLayer. Sprite cũng có thể quay
theo nhưng góc đô â khác nhau. Sprite đươc tạo từ mô ât ảnh bằng phương thức khơi
tạo sau:
public Sprite(Image image);
Reference Pixel – điểm tham chiếu của mô tâ Sprite
Theo mă âc định thì vị trí đă tâ ảnh của Sprite là TOP | LEFT tức là căn theo mép trên
và mép trái của ảnh. Lớp Sprite hỗ trơ ta thay đổi vị trí tham chiếu này bằng
phương thức:
public void setRefPixelPosition(int x, int y)
Page 17
Lââp trình game di đôâng với J2ME
Tin2_K50
Ví dụ khi đă ât mô ât Sprite vào vị trí (0, 0) trên Canvas nhưng nếu vị trí tham chiếu
của chúng lại khác nhau thì vị trí tương đối của chúng so với Canvas cũng khác
nhau. Ví dụ bằng hình vẽ :
Hình 1
Hình 2
Hình 8: Điểm tham chiếu của Sprite
Trong hình 1 thì vị trí tham chiếu mă âc định là (0, 0) còn trong hình 2 vị trí tham
chiếu là (20, 20).
Transforms – quay góc đô â
Sprite cho phép chuyển xoay hình ảnh đi mô ât góc nào đó bằng phương thức :
public void setTransform(int transform);
Có 8 kiểu xoay:
TRANS_NONE, TRANS_ROT90, TRANS_ROT180, TRANS_ROT270, tương
ứng với 0, 90, 180, 270 đô â theo chiều kim đồng hồ.
TRANS_MIRROR, TRANS_MIRROR_ROT90, TRANS_MIRROR_ROT180,
TRANS_MIRROR_ROT270: tương ứng với xoay ngươc theo gương, rồi xoay
mô ât góc nào đó theo chiều kim đồng hồ.
Animation – chuyển đô nâ g
Tạo hình ảnh chuyển đô nâ g của nhân vâ ât bằng cách gép nối liên tiếp các hình ảnh
gần giống nhau. Ví dụ trong game em làm có sư dụng hình ảnh nhân vâ ât (Player)
và chuyển đô nâ g ơ đây tự quay tròn tại chỗ của nó. Để tạo đươc hình ảnh quay như
vâ ây thì làm như sau:
Page 18
Lââp trình game di đôâng với J2ME
Tin2_K50
Hình 9: Nhân vâât Player trong chương trình game
Ở trên có mô ât ảnh lớn chứa 16 ảnh nhỏ đươc đánh số từ 0 theo thứ tự từ trái sang
phải và từ trên xuống dưới, theo thứ tự này thì ảnh trên tạo nên chuyển đô nâ g quay
của nhân vâ ât. Giả sư kích thước của tấm hình lớn là 64x64 pixel thì kích thước của
mỗi hình nhỏ là 16x16 pixel. Lớp Sprite cung cấp mô tâ hàm tạo nưa để tạo các
Sprite có chuyển đô nâ g.
public Sprite(Image image, int frameWidth, int frameHeight);
image ơ đây là ảnh lớn (kích thước 64)
frameWidth là chiều rô nâ g của mỗi ảnh nhỏ (16)
frameHeight là chiều cao của mỗi ảnh nhỏ (16)
bây giờ nếu muốn có ảnh chuyển đô nâ g ta chi tạo mô ât mảng có số phần tư là số
ảnh để tạo chuyển đô nâ g, các giá trị của mảng là chi số của các ảnh nhỏ cần ghép
tương ứng. Ta gọi chuỗi đó là Frame Sequences.
Ví dụ để tạo mô ât Sprite chuyển đô nâ g gồm 16 ảnh nhỏ từ ảnh lớn trên để tạo thành
mô ât chuỗi hình ảnh chuyển đô nâ g quay tròn ngươc chiều kim đồng hồ, trước hết ta
phải tạo ra đối tương sprite
Sprite sprite = new Sprite (playerImage, 16, 16);
Page 19
Lââp trình game di đôâng với J2ME
Tin2_K50
Sau đó tạo ra mảng các chi số thể hiê ân cho mô ât chuỗi các frames như sau:
Int[] frameSequence = { 0, 1, 2, 3, 4, 5 ,6, 7, 8, 9,
10, 11, 12, 13, 14, 15 };
Cuối cùng là gán chuỗi ảnh cho đối tương sprite vừa khai báo.
Sprite.setFrameSequence (frameSequence);
Kết quả của các bước thao tác trên là mô ât chuỗi các ảnh gần giống nhau xếp liên
tiếp nhau:
Hình 10: Chuỗi ảnh tạo chuyển đô n
â g cho Sprire
Nếu muốn cho Sprite hiển thị mô ât frame cụ thể ta dùng phương thức:
Sprite.setFrame(int frameIndex);
Ta có thể định hướng chuyển đô nâ g bằng các phương thức:
public void nextFrame()
public void prevFrame()
Rectangle Collision – sự va chạm của các sprite có đường biên hình chư nhâ ât
Trong lâ âp trình game thì kiểm tra sự va chạm giưa các nhân vâ ât hoă âc giưa nhân
vâ ât với các đối tương khác thường xuyên đươc tính đến. Ví dụ để cho nhân vâ ât
không phép đươc di chuyển ra ngoài khung màn hình thì phải nhâ ân biết đươc khi
nào nhân vâ ât va chạm với biên để nếu có chạm đường biên thì sẽ đổi hướng di
chuyển ngươc lại. Mô ât ví dụ khác, để có thể tính điểm cho người chơi thì phải
nhâ ân biết đươc khi nào đạn bắn trúng quân địch. Lớp Sprite hỗ trơ 3 loại nhâ nâ biết
va chạm với 3 đối tương khác nhau là Image, Sprite và TiledLayer.
public boolean collidesWith(Image image, int x, int y,
Boolean pixelLevel);
public boolean collidesWith(Sprite s, Boolean pixelLevel);
Page 20
- Xem thêm -