Lop Canvas được sư dụng trong cac chương trinh game hay cac ưng dụng cần ve nhưng đối tượng riêng biết, đặc điểm cua no la 1t tỉnh kha chuyén, ta thao tac voi lop nay để ve cac đối tượ
Trang 1TRUONG DAI HOC BACH KHOA HA NOI
KHOA CONG NGHE THONG TIN
Thuc Tap Co So Lap Trinh Game Di Dong Voi J2ME
Giang vién huong dan:
Thay giao Thac Binh Cuong
E-mail cuongtb@ it-hut.edu.vn
Sinh vién thuc tap:
Tô Trong Hiến Lơp tin2- K50 ĐHBKHN
Trang 2
Nôi Dung
IejfasIfsÈ-10NEfT 1 4
ir-Iin mm seasesassessssusssisey 5 Cơ Sở Lý Thuyết Lập Trình Di Động L2 Lí, 5 2.Tồng quan về ngôn ngữ J2ME 6
2.1 SU PhG DIEM CUa J2ME .Ô 6 T102 ẮẼẺẼẺẼ8Ừ Ô 13 J2ME Game API, QQ D G g T n c gn n g c n n b 13 INICT-l0ai- ®-Ìì 1-85 1n 14
1 2LAVEr ClASS - 17
II CS) i89 17
II SIIÍ-ei8-.\/-0vi 8n 24
1.5 LayerManager class c 2c 26 II Ni sussesausassassassaess 28 Tổng Quan, Kich Ban Va Phân Tích Lập Trình Game 28
1.1Phân loại game LG g ĐH ĐT g ng ng g png by 28 1.2Những đòi hỏi chung của một game 28
1.3Quy trỉnh phát triÊn game .LQ Q ng nà: 28 2.1Các nhân vật trong game và đặc điểm: 29
IN6) 86: 19).ei in na 33
2 State Diagram L T n go no nà bà 34 2 Class diagram của lớp giao diện : tk ni cac: 38 4Một số luông quan trọng trong chương trỉnh 39
L1 1N ÿ | sNsii 0n 39
— 40 4.2 Luông sử lý phim bẫm LG g ng ng ng na 41 _ 41 4.3 Luông xác định đối tượng băn của Player 43
4.4 Luông quản lý đạn của Player trong màn hình 44
4.5 Luông xử lý khi đạn chưa ra khỏi màn hỉnh 45
ii sessusssesausesessasas 47 Công cụ lập trình Game J2ME của Netbeans 47
Trang 4
Lơi mơ đầu
Dịch vụ di đông được bắt đầu được cung câp tai Việt Nam vao năm 1992, khơi đầu
vơi nhưng điện thoại “cục gach” phai đeo vai ma gia trên 2000 đô la Vơi chỉ vai
trục thuê bao đăng ki đầu tiên thi cho đến nay đa hơn 20 triêu thuê bao Cung vơi
tốc đô phat triển đo la nhưng tiến bô vượt bậc về tốc đô xư ly Nhơ đo lập trinh cac ưng dụng cho loại thiết bi nay tăng lên nhanh chong, đặc biệt la cac dich vụ gia tri
gia tăng trên mạng đi động như SMS, RSS, WAP va ung dung dich vu game Qua tim hiểu về, em thấy thi trương Game di động tại Việt Nam đang phat triển va co tiém nang lon; do la ly do em chọn đề tai nay
Trang 5Phần 1
Cơ Sơ Ly Thuyết Lập Trình Di Đông
Phần nay em xin trinh bay tư tổng quan đến chỉ tiết Trược hết noi về cac đặc điểm
riêng biệt cua lap trinh di đông, đặc biệt la nhưng han chế cua no, sau đo đến cơ sơ
cua ngôn ngư lập trinh di đông J2ME va cuối chương giơi thiêu về công cụ giup lap trinh game di đông
1 Nhưng han chế cua lập trình di đông
Sự khac nhau lơn nhất giữa lập trinh cho đi đông so vơi lập trinh cho PC la ta phai
quan tâm lơn đến bô nhơ, kích thươc man hình hay thâm chi la mau sắc cua thiết
bi Những vẫn đề đo lại không quan trọng bậc nhất đối vơi PC Hơn thế nữa ta con phai quan tâm đến sự khac nhau giữa cac hang san xuất cùng như dong may đi đông cua hang Cac dong may khac nhau se co bộ nhơ, kích thược, mau sắc man
hinh va ca hỗ trợ cho lập trinh cung khac nhau
Bô nhơ lam việc hay con gọi la heap memory la phân bô nhơ được dung trong suốt qua trinh chay va được giai phong khi ưng dụng kết thuc Ứng dụng danh cho di đông phai co bô nhơ nho hơn vung nhơ nay mơi co thể chay được
Một loại bộ nhơ khac dung để lưu trư la bô nhơ RMS (Record Management
System) RMS la b6 nho ma thông tin vẫn con được lưu khi ta tắt ưng dụng Lấy
một v1 dụ trong game ta dung bô nhơ nay để lưu top những ngươi chơi cao điểm
nhất Cac thông tin đo vẫn được câp nhật cho lần chơi tiếp theo
Sư phân manh
Giống như PC phân manh bô nhơ co thể xay ra vơi điện thoại
Sư đa dang về giao dién dién thoai
Page 5
Trang 6Ngoai vân đê vê bô nhơ khi lập trinh ta con phai quan tâm đên kích thươc cua tưng
loai thiệt bị cụ thê Kich thươc man hình cua điên thoại ma ta lâp trình co anh
huong rat lon dén cach thiệt kê giao diện va lâp trinh
Hinh 1: su da dang vé chung loai dién thoai
2 Tổng quan về ngôn ngư J2ME
l Sự phổ biến cua J2ME
2 Nên tang cua J2ME
3 Can ban lap trinh J2ME
2.1 Sự phổ biến cua J2ME
Tương ưng vơi sự han chế cua cac thiết bi di động thi ngôn ngư lập trinh cho chung cung co phần hạn chế so vơi trong PC Trong đo ngôn ngư chiếm thi phần
nhiều nhất la J2ME (Java 2 Mobile Edition) do tap đoan SUN phat triển Đây la
ngôn ngư lập trinh Mobile bằng Java Lập trinh băng J2ME hay bằng Java noi chung co thể chay trên nhiều thiết bi phần cưng khac nhau “Write one, run everywhere”, miễn la hỗ trợ môi trương java (JRE — Java Runtime Enviromment)
Biểu đồ dươi đây noi lên sự phat triển cua cac thiết bị di đông co hỗ trợ may ao
Java (Java Virtual Machine)
Page 6
Trang 7Hinh 2: Su pho bién cua cac thiệt bị hô trợ máy ảo Java
Tuy nhiên do sự đa dang cua cac dong may, mỗi dong hỗ trợ một API riéng dé lap trinh cho thiết bi đo nên khi lam một ưng dụng co hỗ trợ cac tinh năng cấp cao như
âm thanh, đồ họa thi ta không thể viết code một lần ma phai viết riêng cho tưng
loại may va sư dụng thư viên ma may đo hỗ trợ
2.2 Nền tangJ2ME
Mục tiêu cua J2ME la cho phep ngươi lap trinh viết cac ưng dụng độc lập vơi thiết
bi đi đông ma không cân quan tâm đến phần cưng cua may Sau day la phan lop theo tâng cua J2ME được xây dựng trên CLDC (thiết bi kết nối han chế về cấu
hinh)
Page 7
Trang 8
Hinh 3: Cac tang trong nén tang J2ME
Như vây J2ME gồm cac tầng sau:
e© Tầng phần cưng thiết bi
° Tầng may ao Java
e Tầng cấu hinh
e© Tầng hiên trang
1.2.1 Tang phần cưng thiết bị
Đây la thiết bi di đông, co bộ nhơ va bộ xư ly Mặc du phần nay không phai la một
phân cua J2ME nhưng no la “vật chu” cung cấp phân cưng thích hợp cho việc cai
đặt va thực thi cac ưng dụng J2ME Mỗi một thiết bị đi đông khac nhau se co cac
bô xư ly khac nhau va tâp lênh khac nhau J2ME co vai tro la Cung cấp môt môi trương chuẩn cho tất ca cac loại thiết bị di đông
1.2.2 Tang may ao java
Khi ma nguồn Java được biên dich no chuyền đổi thanh ma bytecode Ma nay sau
đo được chuyền thanh ma may cua cac thiết bị di đông Vây co thể noi tầng may ao
Java (K Virtual Machine - KVM) la bộ biên dịch ma bytecode, co nhiém vụ
Page 8
Trang 9chuyển ma bytecode cua chương trinh Java thanh ngôn ngư may để chạy trên cac
thiết bi di động Co nghĩa la thiết bi nao hỗ trợ KVM thi co thể chay được cac
chương trinh J2ME
KVM (Kernel Virtual Machine): may ao được thết kế vơi nho gọn vơi mục tiêu tiết kiêm bộ nhơ thiết bị
Trạm phát triển
Tập tin JAR
Thiét bi dich
Hình 4: Quá trình xây dựng ứng dụng cho thiết bị di động
1.2.3 Tang cấu hinh
Tầng cầu hình CLDC (Connected, Limited Device Conñnguation - thiết bị kết nối han chế về cấu hinh) đỉnh nghĩa đặc ta may ao KVM va định nghĩa một tập hợp cac lợp co kha năng hỗ trợ diên rộng nhưng thiết bị thuộc loai CLDC
1.2.4 Tầng hiên trang
Tầng hiên trang MIDP (Mobile Information Device Profile- thông tin thiết bị di đông) cung cấp cac API thân thiên cho lâp trinh viên Tầng hiên trang được xây dựng trên lơp cấu hinh va cung cấp nhiều thư viên hơn so vơi tầng cấu hinh
2.3 Căn ban lập trình J2ME
Page 9
Trang 102.3.1 Bô MIDIet
MIDIet la một ưng dụng Java được thiết kết để chay trên cac thiết bi di đông Một MIDlet chua cac lop Java dung bơi CLDC va MIDP Một bô MIDIet gồm một
hoặc nhiều MIDIet được đong goi cung nhau va nen trong file JAR File JAR sẵn
sang cho viêc cai đặt vao điên thoai Vấn đề cua lâp trinh viên la tao ra cac MIDIet Sau đây la cấu trục lâp trinh cua một MIDIet
Mot MIDlet co 3 phương thuc: startApp(), pauseApp(), va destroyApp() Dươi đây la một bộ khung lập trinh cua một MIDIet:
import Javax.m1croedltion.midlet *;
public class MIDletExample extends MIDlet {
public void MIDletExample() { }
public void startApp() { }
public void pauseApp() { }
public void destroyApp (boolean unconditional) { }
Thanh phan import:
Khai bao sư dụng cac lợp cần thiết trong thư viên MIDP va CLDC
Ham khơi tạo MIDIetExample ():
Ham khơi tạo được thực hiện một lần khi MIDIet khơi đông
startApp():
phương thưc nay được gọi bơi bộ quan ly ưng dụng khi khơi tạo MIDlet va
mỗi khi MIDIet trơ về tư trang thai paused
pauseApp():
Trang 11phương thưc nay gọi bô quan ly ưng dụng mỗi khi ưng dụng cần tam dưng ưng dụng đang thực thi Khi sư dụng pauseApp ta giai phong một phần tai nguyên cua MIDIet để danh bô nhơ cho cac ưng dụng khac
destroyApp():
Phương thưc nay được dung khi thoat khoi MIDlet Truoc đo phai giai
phong hoan toan bộ nhơ được lấy bơi MIDIet
Co chu y la tất ca cac ưng dụng MIDIet được viết ra đều kế thưa tư lơp MIDlet co san trong MIDP Lop MIDlet nam trong goi: javax.microedition.midlet.* Lop
nay quan ly chu ki sống cua cac ưng dụng MIDIt
Hinh 5: Cac trang thái và vòng đời của Midlet
2.3.2 API cua J2ME
Page 11
Trang 12
® Cúc ung dung Game
e It tinh kha chuyén
s® Không điêu khiển các thành phân
Hinh 6: Phan lop API cua J2ME
J2ME cung cấp hai muc d6 hoa cho lop MIDlet Muc cao (High Level) g6m nhung
thanh phần như: Textbox, Form, Alert, List Dac diém cua cac thanh phan muc
thấp la tinh kha chuyén ( kha nang dung lai) tuy nhiên cac thanh phần nay không
thể thay đổi tuy y được Thanh phân mưc thấp (Low Level) chico Canvas Lop
Canvas được sư dụng trong cac chương trinh game hay cac ưng dụng cần ve nhưng
đối tượng riêng biết, đặc điểm cua no la 1t tỉnh kha chuyén, ta thao tac voi lop nay
để ve cac đối tượng lên man hinh Lop Canvas cung co thể bắt cac sự kiên bằng nhấn phim bấm Vì la mưc thấp cho phep ngươi lập trinh thoa mai thao tac vơi man hinh Ca hai lợp trên đều năm trong goi; ứnport javax.microedition.lcdui *;
Trong chương trinh game em lam co sư dụng ca hai thanh phần trên, trong đo cac thanh phần mưc cao (Textbox, List, Form ) để tạo menu game con mưc thấp (Canvas) dé tao ra cac nhân vật va giao diên game
Page 12
Trang 13Phần 2
J2ME Game API
Phan một đa noi tổng quan về lập trinh cho đi đông, sau đây em xin được bắt tay
vao luôn vơi một mang kiến thưc rất thu vi cua J2ME la Game API Phần hai gồm hai mục:
e_ Giơi thiêu ly thuyết Game API cua J2ME
e©_ Công cụ lập trinh Java Game cua Netbeans
1 J2ME Game API
Lop Canvas Lop Layer Lop Sprite Lop TiledLayer Lop LayerManager
Thực tế ta hoan toan co thể lam game J2ME vơi kiến thưc về lập trinh đi đông
J2ME, va đặc biệt la thanh phần giao dién muc thap Canvas cua no Lop Canvas
cho phep ta ve lên man hinh điên thoai, no hỗ trợ ve cac đối tượng như đương
thăng, đương tron, tô mau một vung man hinh, hay co thể copy một vung man hinh vao vung đêm va đặt no vao chỗ khac Vơi những công cụ như thế ta co thể lam được một chương trinh game tư đơn gian đến phưc tạp Tuy nhiên thơi gian lam
game se rất tốn kem va khối lượng công việc liên quan đến ve giao diện la rat lon
Qua tim hiểu em thấy J2ME co một goi hỗ trợ tốt cho lập trinh game gọi la chung
la Game API Cac lop cua no nam trong javax.microedition.Icdui.game M6t s6 lop quan trọng cua no như: GameCanvas, Layer, Sprites, TiledLayer, va
LayerManager
e GameCanvas: kế thưa tư lợp Canvas, co thể coi đay la man hinh điên thoai
© Layer: 1t được sư dụng trực tiếp nhưng được kết bơi lơp Sprite va TiledLayer
Page 13
Trang 14e Sprites: lop dé tao cac nhân vật va cac đôi tương chuyên đông
se TiledLayer: lơp đê tao cac khung canh khac nhau cua game va tao ban đô
e LayerManager: lop quan ly cac Sprites va cac TiledLayer
Ta se đi phân tích tưng lơp một
1.1GameCanvas class
GameCanvas kết thưa cac thuộc tính va phuong thuc cua lop Canvas va co thêm một số phương thưc quan trong giup cho việc giam thơi gian tính toan nhơ đo tăng
tốc đô refresh cua man hinh No co thêm hai mơ rong so voi Canvas la Polling
Input — lược bo déu vao va Frame Buffer — dung vung đêm để chưa nội dung Canvas
Polling Input
Phuong thuc int getKeyStates () lay thông tin về phím bấm cua
điên thoai đê biệt ngươi chơi nhân nut gi Đê hiêu ham nay ta cần nắm ro câu tao phim bam cua điện thoai
Trang 15(một số phim số tương ưng vơi cac
phim chưc năng)
Hinh 7: Nokia Series 40 SDK, 3rd Edition
Trong game di đông nguoi ta thuong su dung cac phim chuc nang dé thao tac Mét
game hoan chinh co thé chi thao tac voi 5 phim chuc nang la UP, DOWN, LEFT,
RIGHT va phim FIRE (phim bắn) Ta co thể dung cac phim số tương ưng thay cho cac phim chưc năng như bang trên Điện thoai bố tri cac phim chưc năng dat gan nhau dé dé thao tac
Page 15
Trang 16Quay tro lại vơi phương thực getKeyStates ¿ ; nếu như một phương thưc lấy
ma cua phim nhấn tương tự cua lơp Canvas la getKeyCodes () se kiểm tra tất
ca cac phim xem phim nao nhấn thi phương thuc moi cua lop GameCanvas chi kiểm tra vơi cac phim chưc năng do đo thơi gian nhân biết được phim bam cua lop
GameCanvas sẽ nhanh hơn cua lơp Canvas (ky thuât nay gọi la Polling Input —
lược bo đầu vao)
VI dụ nhân biết phim bấm FIRE:
int pattern = getKeyState();
if ((pattern & GameCanvas.FIRE PRESSED) != 0)
Hơn nưa việc lắng nghe mot phim duoc bam boi ngươi dung phai duoc dat trong
đoạn chương trinh lặp chính cua chương trinh while(isRunning) { .} nén tan xuat
sư dụng no la rất lơn
Frame Buffer
getGraphics () ; để lấy nôi dung cua Canvas va cho vao bộ đêm Y tương cua
Frame Buffer la mọi thao tac ve trên Canvas se được gian tiếp thao tac vơi vung
đêm sau đo dung phương thưc public void £1ushGraphics () để đẩy nội dung vung đêm ra Canvas Vơi cai tiến nay thi Frame Buffer co tốc đô ve lên Canvas nhanh hơn la ve trực tiếp lên Canvas vi thao tac voi vung dém nhanh la
hơn thao tac vơi một đối tuong Canvas cu thé, ta chi mat thém hai thao tac la lay
nôi dung Canvas vao đối tượng cua lơp Graphics vơi phương thưc get va đây nội dung tư đối tượng Graphics vao Canvas vơi phương thưc flush
Cũng giống như thu tục nhân biết phim bấm thao tac ve lên Canvas cung được đặt
trong đoan chương trinh lặp chính nên tần xuất sư dụng la rất lơn Hơn nữa đề đam
bao hinh chuyển đông được “trung thực” — không bị giật thì số lần refresh lại
Canvas, tưc la số lần ve lại phai lơn hơn 24 lần trong 1 giây!
Trang 171.2Layer class
Trươc khi đi đến hai lợp quan trong tiếp theo la Sprite va TiledLayer ta phai noi về khai niêm Layer Lop layer cua Game API rat don gian nhung no duoc ké thua boi
hai lop Sprite va TiledLayer
Layer được hiểu la một khối hinh anh trong Game Tất ca cac hinh anh co thể hiên được trên man hinh đều kế thưa lơp nay Cac Layer la những anh ma ta co thể ve lên man hinh, ẩn đi, di chuyển hay la xắp xếp chung theo đô xâu (tưc la khi nhiều
anh chồng cheo lên nhau thi anh co đô xâu lơn hơn se bị anh co độ xâu nho hơn
che khuất) Cac phương thực cua lợp Layer la
Public void setPosition(int x, int y) : đặt vi tri cua Layer
Public void Move (int dx, int dy): dich chuyén Layer
Public void setVisible (boolean visible): thiét lap hién/an Layer
Cac phương thưc nay đều duoc ké thua boi cac lop Sprite va TiledLayer
1.3Sprite Class
Sprite la lop cua những đối tượng chuyển đông trong game Sprite gồm nhưng
chưc năng không chỉ ve va di chuyền cac hinh anh ma con co thể xac đỉnh va cham
giữa cac Sprite voi nhau va giua Sprite voi TiledLayer Sprite cung co thé quay
theo nhung goc đô khac nhau Sprite được tao tư một anh bảng phương thuc khơi
tao sau:
public Sprite(Image image) ;
Reference Pixel — diém tham chiếu cua một Sprite
Theo mặc đinh thì vi trí đặt anh cua Sprite la TOP | LEFT tực la căn theo mep trén
va mep trai cua anh Lop Sprite hé tro ta thay d6i vi tri tham chiéu nay bang phương thưc:
public void setRefPixelPosition(int x, int y)
Page 17
Trang 18VI dụ khi đặt một Sprite vao vi tri (0, 0) trên Canvas nhưng nếu vi trí tham chiếu cua chung lại khac nhau thị vi trí tương đối cua chung so vơi Canvas cung khac nhau VI dụ bằng hinh ve :
Hình 8: Điểm tham chiếu cua Sprite
Trong hinh I1 thi vi trí tham chiếu mặc đinh la (0, 0) con trong hinh 2 vi trí tham
chiếu la (20, 20)
Transforms — quay goc đô
Sprite cho phep chuyển xoay hinh anh đi một goc nao đo bằng phương thực :
public void setTransform(int transform) ;
Co 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 ROTI180, TRANS_MIRROR_ ROT270: tương ưng vơi xoay ngược theo gương, rồi xoay một goc nao đo theo chiều kim đồng hồ
Animation — chuyển đông
Tao hinh anh chuyển đông cua nhân vật bằng cach gep nối liên tiếp cac hinh anh gần giống nhau Vĩ dụ trong game em lam co sư dụng hinh anh nhân vật (Player)
va chuyển đông ơ đây tự quay tron tai chỗ cua no Để tao được hinh anh quay như vây thi lam như sau:
Trang 19Hình 9: Nhân vật Player trong chương trinh game
trên co một anh lon chưa 16 anh nho được đanh số tư 0 theo thư tự tư trai sang
phai va tư trên xuống dươi, theo thư tự nay thi anh trên tao nên chuyển đông quay
cua nhan vat Gia su kich thuoc cua tam hinh lon la 64x64 pixel thi kích thươc cua
m6i hinh nho la 16x16 pixel Lop Sprite cung cap mét ham tao nữa để tạo cac Sprite co chuyển động
public Sprite(Image image, int frameWidth, int frameHeight);
e image ơ đây la anh lon (kich thuoc 64)
e frameWidth la chiéu réng cua méi anh nho (16)
e frameHeight la chiéu cao cua méi anh nho (16)
> bây giơ nếu muốn co anh chuyền động ta chỉ tạo một mang co số phần tư la số anh để tao chuyển động, cac gia tri cua mang la chỉ số cua cac anh nho cần ghep
tương ưng Ta goi chuỗi đo la Frame Sequences
Vi du dé tao một Sprite chuyén đông gồm 16 anh nho tư anh lơn trên để tao thanh
một chuỗi hinh anh chuyển đông quay tron ngược chiều kim đồng hồ, trươc hết ta
phai tao ra đối tượng sprite
Sprite sprite = new Sprite (playerImage, 16, 16);
Page 19
Trang 20Sau đo tao ra mang cac chỉ số thê hiên cho một chuỗi cac ftames như sau:
PP@GAAMR PEP PAB
Hỉnh 1Ô: Chuỗi anh tao chuyén dong cho Sprire
Nếu muốn cho Sprite hiển thi một frame cụ thể ta dung phương thưc:
Sprite.setFrame (int £frameTndex) ;
Ta co thể đỉnh hương chuyền đông bằng cac phương thưc:
public void nextFrame ()
public void prevFrame ()
Rectangle Collision — sz va cham cua cac sprite co đương biên hinh chữ nhật
Trong lập trinh game thi kiểm tra sự va cham gitra cac nhan vat hodc gia nhan vat vơi cac đối tượng khac thương xuyén duoc tinh dén Vi du dé cho nhân vật không phep được di chuyển ra ngoai khung man hinh thi phai nhân biết được khi nao
nhân vat va cham voi biên để néu co cham đương biên thi se đổi hương di chuyén
ngược lại Một vi dụ khac, để co thể tính điểm cho ngươi chơi thì phai nhân biết
được khi nao dan ban trung quan dich Lop Sprite hé tro 3 loai nhan biét va cham
vơi 3 đối tượng khac nhau la Image, Sprite va TiledLayer
" public boolean collidesWith(Image image, int x, int y, Boolean pixelLevel);
» public boolean collidesWith(Sprite s, Boolean pixellLevel);
Trang 21"_ DUDbILIC boolean collidesWith (TiledLayer t, Boolean
Sprite, mac dinh gia tri nay la false tưc la chế đô xac dinh va cham ơ đây la xem
xet đương biên cua Sprite va anh co giao nhau hay không
Phương thưc thư hai cho biết liêu Sprite co va cham vơi một Sprite khac không
phương thưc nay chỉ đoi hoi hai tham số: tham số Sprite (đa bao gồm vi trí anh cua
no trên man hinh) va tham số pixelLevel thi tương tự phương thưc thư nhất
Phương thưc cuối cung xac đinh liêu Sprite co va chạm vơi một TileđLayer nao đo hay không Phương thưc nay dung dé xac dinh Sprite co va cham voi đối tượng nao đo trong ban đồ hay không? Chy y cac đối tượng trong ban đồ ơ đây chỉ không
la cac nhân vật chuyền đông
Theo mặc đïnh thi chế đô xac đinh va cham la theo đương biên hinh chư nhật cua
đối tượng Chế đô nay co đặc điểm la thao tac nhanh tuy nhiên va cham chỉ mang
tinh tương đối, vi dụ co một Sprite kích thươc 32x32 tuy nhiên phần hinh anh cua Sprite do lai chi nam trong pham vi han hẹp tư (8, 8) > (24, 24) trong khung đương biên cua Sprite
Đề khắc phục nhược điểm nay lơp Sprite cung cấp một phương thưc cho phep xac
đinh lại khung hinh chữ nhật
Page 21
Trang 22public void defineCollisionRectangle(int x, int y, int width, int height) ;
Voi vi du trén dé xac dinh va cham voi đô chính xac cao hơn hơn thi ta đỉnh nghĩa
lại khung hinh chư nhật như sau:
Sprite.defineCollisionRectangle (8, 8, 16, 16);
Bay gio nhân biét va cham se chính xac hơn Mặc du vay tinh toan va cham van dựa trên biên hinh chư nhật nho hơn Dé co thé xac dinh chinh xac sự va cham ta dung chế đô xac đinh va cham theo Pixel
Pixel Collision — va cham theo bit
Va cham theo Pixel xảy ra khi cac điểm anh cua một bitmap giao vơi cac điểm anh tương ưng cua một bitmap khac Tuy nhiên chế đô nay đoi hoi nhiều chỉ phi về thoi gian hơn phương phap xac đinh theo đương biên chư nhật
Khai niêm Tile Graphics — cac manh d6 hoa
Dé hoa cua game duoc chia lam hai loại la nhân vật (Sprite) va khung nền (background graphics) Sprite nhu da noi o trén la nhung nhân vât chuyển động trong game, thi background duoc dinh nghia la phần đồ họa bên dươi cac nhân vật
va la môi trương đề nhân vật hoạt đông
Một chương trình game thương bao gồm rất nhiều khung canh đồ họa nối tiếp
nhau Môt khung canh lại gồm một số lượng lơn cac đối tượng đồ họa: Sprite, Tile, Graphics Text do do phai co một cach thưc lưu trữ chung sao cho tiết kiêm được
bô nhơ vốn han hep cua dién thoai
VI dụ đây la một vai khung canh trong game Alpha wing:
Trang 23Hình 11: Một số khung canh trong game Alpha Wing
Nhân xét: Nhin vao hinh ve trên ta thấy kha nhiều phần cua man hình nền được lặp lai nên thay vi sư dụng bô nhơ lưu tất ca cac hinh anh trên ta lưu chung dươi dang
ma trân cac số nguyên trong đo mỗi phần tư trong ma trân tương ưng vơi một tile trong anh lơn
Vi du chỉ sư dụng một anh “lon” co hai tile thi một ma trân sau do ta co thé ve được một hinh nền
-
Hình 12: Một anh gồm hai tile
Đanh số cac tile nay tương ưng la 0 va 1 thi vơi một ma trân sau:
Page 23
Trang 24Bang cach sư dụng cac tile để tao background ta co thể tạo ra những ban đồ moi
ma không cần thêm anh
1.4TiledLayer class
Mỗi lợp TiledLayer co một anh, anh nay được chia nho thanh cac tile theo quy tắc
ơ trên, một TiledLayer no gồm một mang cac tile đặt theo thư tự nhất định Anh
cua TiledLayer được phân chia ra nhiều tiles va được đanh số Một ban đồ co thể
được tao nên tư một TileđLayer hay nhiều TiledLayer
Ham tao cua lop TiledLayer nhu sau:
public TiledLayer(int columns, int rows, Image image, int tileWidth, int tileHeight);
Page 24
Trang 25e© Colums la số cột cua TiledLayer, hay số tiles trong một hang
© Rows la số hang cua TiledLayer, hay số tiles trong một cột
e Image la anh cua TiledLayer
e tileWidth va tileHeight cho biét kich thuoc cua một tile
Một số phương thực thao tac vơi TiledLayer:
Khi muốn thay đổi nội dung một tile cua TiledLayer ta co phương thưc:
public void setCell(int col, int row, int tileIndex);
Y nghia la dat tile co vi tri (col, row) trong TiledLayer voi mét tile co chi sé tileIndex
Ta cung co thể đặt một miền chư nhật trong TiledLayer băng một tile bằng phương
thưc:
public void fillCells(int col, int row, int numCols, int numRows, int tileTndex) ;
e col, row, numCols, nunRows xac dinh mién chu nhat can phu tile
e tileIndex la chi sé cua tile dem phu
Để xac đinh chỉ số một tile trong TiledLayer ta dung phuong thurc
public int getCell(int col, int row);
Tile Animation — tile d6ng
Tile phan lon duoc dung để tạo ra cac đối tượng tính như ban đồ, tuy nhiên dé tao
ra một khung nền thu vi ta nên co cac tile động (cac tile nay đơn gian la cac tiles thay đổi hinh anh cua no sau một chu ki ve lai man hinh) Cac tile đông la những
đối tượng hoạt đông không chu sự điều khiển cua ngươi chơi ma hoạt đông theo chu ki Cac buoc để tao một tile đông như sau:
Để xac đinh tile nao la tile đông trong một TiledLayer ta dung phương thưc:
public int createAnimatedTile(int staticTi leTndex) ;
e staticTileIndex la chi sé cua tile trong TiledLayer
Page 25
Trang 26Sau mỗi lân ve lại man hinh, cac TiledLayer duoc ve lai va do do cac tile cua no
cung được câp nhật theo Đề thay đổi vi tri cua một tile vơi một tile o vi tri khac ta
dung phương thưc:
public void setAnimatedTile (int animatedTileIndex, int staticTileIndex) ;
Trong phương thưc trên thi tile co chỉ số animatedTilelndex se được câp nhật hinh
anh cua tile co chi s6 staticTileIndex
1.5 _LayerManager class
Lop nay quan ly tất ca cac đối tượng khac, thay vi trực tiép xac dinh vi tri dé ve cac đối tượng lên man hinh bảng phương thưc paint(), ta tạo một đối tượng LayerManager va cho vao no tất ca cac đối tượng băng phương thưc:
public void append (Layer 1);
Đối tượng append co thể la đối tượng Layer hoặc nhưng đối tượng cua lơp kế thưa
tư Layer như Sprite va TiledLayer
Ở đây ta vẫn ve tưng đối tượng lên man hinh nhưng khac so vơi ve trực tiếp lên man hinh ơ chỗ cac qua trình ve được thâu tom lại chỉ trong đối tượng
LayerManager ma không ve rơi rac tưng thanh phân một Việc ve tất ca cac đối
tượng đồng loạt như vây se tốt cho tính thống nhất xuất hiên cua cac đối tượng khac nhau trên man hinh
Lợp LayerManager cung cấp cac phương thưc quan ly Layer như:
e insert (Layer 1, int index)
e remove (Layer 1)
e getLayerAt (int index)
Phương thưc thư nhất chen m6t Layer vao lop o vi tri co chiéu x4u index O đây một layer chen vao co tính đên chiêu sâu ma no được đắt (layer co chiêu sâu lơn
Trang 27hơn se bị che bơi nhưng layer co chiêu xâu nho hơn) Do đo việc đặt một layer lên
man hinh khi sư dụng LayerManager se không phụ thuộc vao thư tự viết code, ma
phụ thuộc vao biên Index ma truyên vao
Tile Studio (TS)- Công cụ thiết kế cac đối tượng đồ họa đơn gian
Em xin giơi thiêu một công cụ hỗ trợ đồ họa cho cac game 2D vưa va nho ma em
đa sư dụng cho chương trinh game cua minh
Chưc năng chính cua TS la:
e Ve cac tile set (bô cac tile) co kích thược đa dạng
e Ve ban dé dua vao cac tile set đa thiết kế
e Export ra anh (.bm; png) dé dung cho game
e©_ Ve cac nhân vật, hỗ trợ lam ra cac nhân vật chuyển đông
Đặc biệt phần mềm chi co khoang 600 Kb va hoan toan miễn phi
Page 27
Trang 28Phần 3
Tổng Quan, Kich Ban Va Phân Tích Lập Trình Game
1 Tông quan về lam Game
Phần nay em se noi về phân loại game, cac đoi hoi về một chương trinh game, va cuồi cung la cac bươc phat triên game
1.1Phan loai game
Thé gioi game rat da dang va duoc phan loai nhu sau:
¢ Action game: Game hanh d6ng: doi hoi nhiéu dau tu lién quan dén d6 hoa (Game dua xe Harley)
° Game Puzzle: Game dé — thuong don gian vé d6 hoa (Game Tetris)
e Adventure Game: Game phuu luu — (Game Diablo)
¢ Strategy Game: Game chién thuat — la game rat duoc ua chuéng (Warcraft )
những game nay kho lam va đoi hoi nhiều AI
¢ Traditional Game: Game truyén théng — vi du danh bai, xuc sac
1.2Nhung doi hoi chung cua mét game
Tuy vao tung loai game ma co nhung doi hoi nay khac nhau vé muc d6:
e Fun-—Choi game phai vui nhon
e Addictive — Game phai co tinh cuén hut
¢ Compelling — Game co tinh canh tranh
¢ Commercial successful — Cuối cung game phai thanh công trên thi trương
1.3Quy trình phat triển game
Em se không đi xâu vao nhưng phần nay tuy nhiên cung co một số chu y quan trong khi lam game
Lam game cung giống như lập trinh cac ưng dụng khac, vấn đề tao ra một khuôn mẫu đung đắn cho việc phat triển ngay tư đầu la rất quan trong Thay vi co y tương
Trang 29va bắt tay vao viết code luôn, ta phai tao môt khung sươn chỉ tiết cho việc lâp trinh
No lam cho việc lâp trinh trơ nên sang sua hơn, va phu hợp vơi lam việc nhom Công cụ đề lam việc nay tốt co thể la ngôn ngư mô hinh hoa như UML Khi đã co một mô hinh tốt để nhin vao thi việc lập trinh trơ nên đơn gian hơn bơi mô hinh giup ta co được một cai nhin tổng quan va hê thống Nhin vao mô hinh thi mọi thư gần như sang to Hơn thế nữa mô hinh con giup việc nâng cấp nâng cấp game dễ dang hơn
Sau khi co khuôn mẫu, công việc con lại la phat triển game Thương thi thơi gian cho hai công việc nay la ngang nhau Khi lam game J2ME co một số chu y quan trong la: ta can phai theo doi kich thuoc cua file JAR (file nen dé cai dat vao dién thoai) trong qua trinh lam boi su dung qua nhiéu anh se lam cho kich thuoc file JAR tăng lên nhanh chong
Va một câu noi em thấy rất hay: “The secret to making great games is to make bad games first’
2 Cac Nhân Vật Game Va Phân Tích Lập Trinh
Phân nay em giơi thiêu về cac nhân vật va cach tao ra nhân vật dươi goc đô lâp trình:
2.1 Cac nhân vật trong øame va dac diém:
1 Player (Ngươi chơi) co những chưc năng sau:
a Di chuyển trai phai lên xuống
b Quay tại chỗ theo hai chiều — để thiết lâp chế đô bao vê
c Gặp địch trong ban kinh băn thi co kha năng bắn đan theo hai chế độ:
tự đông hay nhấn phim
2 Turret (phao) — nhân vật nay không di chuyền
a Băn Player nếu player năm trong ban kính bắn cua no
3 Black
a Di chuyển trai phai lên xuống
b Đi theo quy đao bất ki trong ban đồ
Page 29
Trang 30c Gap Player trong ban kinh ban thi ban
4 Eighter (Nhân vật nay se bổ xung sau nay)
a Di chuyển trai phai lên xuống
b Di va tim Player néu player nam trong vung phat hién cua no
c Gap Player trong ban kinh ban thi ban
Cac đặc điểm cua cac nhân vật:
Chương trinh em cai đặt đưa vao 3 nhân vật la Player, Black, Turret Trong đo Player do ngươi chơi đam nhân Black va Turret do may điều khiến va ngươi
chơi se bắn nhau vơi may vu khi sư dụng đều la đan (Bullet) Cac nhân vật
được xây dựng vơi những đặc điểm sao cho phu hợp nhất, không bên nao qua mạnh hay qua yếu, mỗi nhân vật đều co điểm mạnh va yếu điểm riêng Đặc
điểm cua nhân vật Player la di chuyén nhanh, tốc d6 ban dan nhanh, tam xa lon
kha năng sat thương trung binh va mang cung lơn tuy nhiên lại đơn độc chiến
đấu một minh Nhân vật Black va Turret cung một phe, Black co đặc điểm la không bao giơ hết, no chết đi rồi lai sinh ra, di chuyển nhanh, tốc độ bắn đan
trung binh, tầm xa trung binh kha năng sat thương kem va mạng yếu Turret co
đặc điểm la không di chuyền, tốc đô bắn châm, kha năng sat thương lơn, tâm xa
rat lon va mang lon
Đo la tổng quan về cac nhân vật, vấn đề bây giơ la xây dựng cac nhân vật bằng ngôn ngư lập trinh
2.2Phân tích cac nhân vật theo lợp
VI cac nhân vật co một số chưc năng giống nhau va cung co một số chưc năng khac nhau Ví dụ như Black va Fighter co hai diém chung la co co thé di chuyén theo bốn hương, va khi gặp Player thi bắn; va co một điểm khac nhau về cach thực
di chuyển Do đo ta sư dụng phương phap lập trinh kế thưa lợp trưu tượng
Tao mot lop trưu tượng (abstract class) mang tên la Actor Tất ca cac nhân vật
trong game đều kế thưa lơp trưu tượng nay Lợp co một số thuộc tính như: tọa độ
(x, y) trên man hinh, chiều rộng va chiều cao cua nhân vật, .va một số phương
thưc như di chuyền theo bốn hương (phao không di chuyển thi se được đanh dấu