Tải bản đầy đủ (.doc) (40 trang)

đồ án công nghệ thông tin Lập trình game trên di động với lớp Game Canvas

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (400.34 KB, 40 trang )

Lời cảm ơn
Trước hết em xin gửi lời cảm ơn thầy Lê Tấn Hùng , giáo viên hướng dẫn
em trong đợt thực tập cơ sở này . Cám ơn các bài tập của thầy giúp em có
được những định hướng vững vàng đi đến kết thúc đợt thực tập .
Cảm ơn các anh chị trong ban lãnh đạo công ty Sunnet , cảm ơn các anh
chị , các bạn đang làm việc hay đang thực tập tại công ty , mọi người đã có
những góp ý quý báu giúp em hoàn tất đợt thực tập cơ sở này .
Em mong muốn các anh chị chỉ bảo cho em nhiều hơn nữa , giúp em tự
nâng cao kỹ thuật bản thân , để cảm thấy tự tin hơn mỗi khi tiếp nhận một
đề tài khó.
Em đã có được 2 tháng thực tập cơ sở vô cùng vui vẻ và thú vị ,Cảm ơn
mọi người rất nhiều !
1
Chương 1
Sơ lược về Game và lập trình Game
I. Giới thiệu về phát triển Game
Ngành công nghiệp game đang phát triển rất mạnh mẽ , và các sản phẩm
game làm ra ngày càng có ảnh hưởng lớn đến đời sống tinh thần của
mọi người , game đã không chỉ đơn thuần là một sản phẩm giải trí nữa
, game là một thế giới của công nghệ và cảm xúc , và thậm chí người
ta còn xây dựng nên hẳn một văn hóa mới - văn hóa game.
Được coi như là một ngành công nghiệp , việc phát triển game cũng phải
tuân theo những quy trình khắt khe nhất từ khâu ý tưởng chuẩn bị cho đến
lúc ra sản phẩm . Nhiều công nghệ engine đã ra đời để phục vụ cho việc
phát triển game như Unreal Engine , Cry Engine … mỗi công nghệ đều
có ưu nhược điểm riêng cũng như những game đi kèm với các công nghệ
đó hoặc là hướng đến một thế giới với hình ảnh lung linh , huyền ảo hoặc
một thế giới chân thực , gần gũi , nhưng tất cả đều có một điểm chung :
phát triển không ngừng nghỉ .
Lập trình Game là một công việc vô cùng thú vị , bạn hãy thử tưởng
tượng bạn múa tay trên bàn phím , và từ từ một thế giới ảo do chính bạn


sáng tạo ra dần dần hình thành .Và thế giới đó là thế giới của bạn , có
những con người bạn xây dựng , có những thông điệp bạn muốn truyền đạt
2
và có những cảm xúc bạn muốn gửi gắm . Nhưng đồng thời đó cũng là
một công việc “ nguy hiểm “ khi mà ngành game công nghiệp đang cạnh
tranh ngày càng khốc liệt , nếu bạn không tiến lên thì có nghĩa là bạn đang
thụt lùi .
II. Phân loại Game
Game thường được phân chia theo nội dung , tính chất game- play , tuy
nhiên cách phân loại game cũng chỉ hướng người chơi đến nội dung ,
phong cách chủ đạo chính của game , bởi vì một game thường có sự kết
hợp nhiều phong cách với nhau , tạo thành bữa tiệc phong phú và phù hợp
với nhiều “ khẩu vị “ khác nhau . Bên cạnh đó game còn được phân loại
ESRB - Entertainment Software Rating Board , một cách phân loại cho
đối tượng chơi game .
Dưới đây là một số cách phần loại game .
Action (hành động)
Gồm tất cả tựa game có liên quan đến hành động, đề cao khả năng chiến
đấu của nhân vật trong từng khu vực rộng lớn
Ví dụ : God of War , Devil May Cry …
Role-playing (nhập vai, RPG)
Với RPG, người chơi vào vai một nhân vật hoặc một nhóm để tham giacác
sự kiện, giao tiếp với các nhân vật “phụ” NPC (non-player characters)
3
tham gia các cuộc chiến (theo lượt hoặc thời gian thực) với một quá trình
xây dựng nhân vật thông qua việc tăng cấp độ (level up), phát triển các kỹ
năng (skill), tính cách Thế giới trong RPG thường lấy bối cảnh châu Âu
xưa với các phép màu huyền bí, hoặc lấy bối cảnh giả tưởng đậm chất
“fantasy”.
Ví dụ : Final Fantasy , Dragon Quest , Fire Emblem , Diablo ,…

Adventure (phiêu lưu)
Nét cơ bản của adventure là khám phá các vùng đất, tìm các vật dụng và
giải đố; có rất ít hoặc không có các cảnh mang tính “hành động”. Khác
với RPG, adventure có rất ít hoặc không có sự phát triển nhân vật, cũng
như không tăng cấp độ.
Ví dụ : Siberia , Monkey Island …
Strategy (chiến thuật)
Strategy chú trọng cách quản lý nguồn tài nguyên và quân đội trước
những đối thủ do máy hoặc người chơi khác điều khiển và hầu hết đều
“dính dáng” chiến tranh. Nhìn chung, có 2 dạng phân biệt được là realtime
strategy (chiến thuật thời gian thực, RTS) và turn-based strategy (chiến
thuật theo lượt, TBS).
Ví dụ : WarCraft , StarCraft , AOE ( Age of Empire ) …
4
Các thể loại khác
Survival horror (kinh dị).
Simulation (mô phỏng).
Sports (thể thao).
Puzzle (giải đố).
Rhythm (âm nhạc).
Fighting (đối kháng).
Racing (đua xe).
Phân loại Game theo ESRB -Entertainment Software Rating Board
EC - Early Childhood: Nội dung phù hợp cho trẻ em từ 3 tuổi trở lên.
E — Everyone: Nội dung thích hợp cho gamer trên 6 tuổi.
E10+ — Everyone 10 and older: Gamer trên 10 tuổi
T — Teen: Gamer trên 13 tuổi
M — Mature: Gamer trên 17 tuổi.
AO — Adults Only: Gamer 18+
RP — Rating Pending: Sản phẩm đã gửi lên ESRB nhưng chưa có quyết

định
5
CHƯƠNG 2
Những vấn đề đã nghiên cứu được trong đợt
thực tập
I. Kỹ thuật lập trình di động với J2ME
Sau khi nghiên cứu tài liệu “ Lập trình trên di động với J2ME “ cùng với
các bài tập thực hành thực tế trên công ty Sunnet , em đã có một số kĩ
năng cơ bản với lập trình trên di động . Cụ thể
- hiểu biết sơ lược về ứng dụng MIDP ( Mobile Information Device
Profile )
- các thành phần giao diện ở mức cao của ứng dụng MIDP
+ Đối tượng Display , Displayable , Screens
+ Thành phần Form và Items : DateField , Gauge , StringItem ,
TextField , ChoiceGroup , Spacer , Image , ImageItem
+ Thành phần List , TextBox , Alert , Ticker
- các thành phần giao diện ở mức thấp của ứng dụng MIDP
+ các hàm API(Application programming interface ) ở mức thấp : Lớp
Canvas và lớp Graphics .
6
Lớp Canvas cung cấp một khung vẽ cho phép tạo ra giao diện tùy biến
người dùng , một số lượng lớn các phương thức trong lớp này sẽ dùng để
xử lí sự kiện , vẽ ảnh và chuỗi lên thiết bị hiển thị : hệ thống trục tọa độ ,
tạo một đối tượng Canvas , vẽ trên đối tượng Canvas , Sự kiện hành động ,
mã phím , các hành động xử lí các trò chơi …
Chúng ta sử dụng đối tượng Graphics để vẽ lên một Canvas : hỗ trợ màu ,
loại nét vẽ , vẽ cung , vẽ hình chữ nhật , đường chéo , font chữ , điểm neo ,
vẽ các chuỗi kí tự , vẽ ảnh…
- Xử lí sự kiện : đối tượng Command , đối tượng Item
- Record Management System : tính năng cho phép lưu trữ dữ liệu

Sau đây em xin đi sâu hơn một chút về J2ME
1.Lịch sử phát triển của J2ME
J2ME được coi là ngôn ngữ lập trình trên các thiết bị có tính chất nhỏ gọn
như Mobile (di động) hay PDA ( thiết bị trợ giúp cá nhân), được phát triển
từ kiến trúc Java Card ,Embeded Java và Personal Java của phiên bản
Java 1.1 .
Java ban đầu được thiết kế cho các máy với tài nguyên bộ nhớ hạn chế
.Lúc đó thị trường của J2ME được mở rộng cho các thiết bị như:
-Các loại thẻ cá nhân như Java Card
-Máy điện thoại di động
-PDA (Personal Digital Assistant) :các thiết bị trợ giúp cá nhân
cầm tay
7
Hiện nay có một số cung cụ hỗ trợ phát triển J2ME như
-Netbean IDE
-Sun J2ME Wirless Toolkit 2.5v
-Borland JBuilder
-Eclipse với các EclipseME có plug in
2. Kiến trúc của J2ME
2.1 Mô hình phát triển
Trong đó :
- CLDC (Connected Limited Device Configuration - Cấu hình thiết bị kết
nối giới hạn) : được thiết kế để nhắm đến các thiết bị cấp thấp như các
thiết bị di động hoặc PDA có bộ nhớ trong bé hơn 512 Kb
-CDC (Connected Device Configuration -Cấu hình thiết bị kết nối ) :
được đưa ra để nhắm đến các thiết bị có tính năng mạnh hơn CLDC nhưng
vẫn ít hơn các thiết bị để bàn sử dụng J2SE . Những thiết bị thuộc dòng
CDC có bộ nhớ trong lớn hơn 2Mb và có bộ xử lý mạnh hơn
8
-MIDP (Mobile Information Device Profile ) :profile này được sử dụng

các tính năng kết nối các thành phần hỗ trợ giao diện người dùng .MIDP
cung cấp một giao diện điên thoại đơn giản với các tình năng mạng đơn
giản dựa trên giao thức HTTP
2.2 Giới thiệu về MIDP
2.2.1 Định nghĩa
MIDP 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 , nó cung cấp các chức năng cơ bản cho hầu
hết các dòng thiết bị di động khá phổ biến hiện nay.
Đối tượng của MIDP hướng đến chính là các dòng máy cấu hình thấp , do
đó MIDP có những hạn chế nhất định .
2.2.1 Những chức năng của MIDP
a. Những chức năng bị hạn chế
-Không hỗ trợ phép tính dấu phẩy động
-Không hỗ trợ bộ nạp class
-Không hỗ trợ từ khóa finalize() như trong J2SE
-Không hỗ trợ JNI
-Có hỗ trợ các thao tác bắt lỗi nhưng rất hạn chế
9
-Phần lớn các thư viện trong API cho SWING và AWT không thế sử dụng
cho MIDP
-Không hỗ trợ các tính năng quản lý file và thư mục
b. Những chức năng MIDP cung cấp
-Các lớp và các kiểu dữ liệu : các lớp trong gói java,util như Stack ,
Vector hay Hastable
-Hỗ trợ đối tượng Display
-Hỗ trợ Form và giao diện người dùng
-Hỗ trợ Timer và Alert
-Cung cấp các tính năng như Record Managerment System (RMS ):cho
việc lưu trữ dữ liệu
-MIDP 2.0 là phiên bản cải tiến của MIDP 1 có thêm những cải tiến nổi

bật như :
-Download qua mạng an toàn hơn qua việc hỗ trợ giao thức HTTPS
-Kiểm soát việc kết nối giữa máy di động và server
-Thêm các thư viên hỗ trợ Multimedia
-Mở rộng tính năng của FORM .Nhiều cải tiến được đưa thêm vào
API
10
3. Các thành phần của J2ME
Trong cuốn tài liệu kèm theo trong CD ( lập trình trên di động với J2ME )
có hướng dẫn rất chi tiết về vấn đề này .
Việc đi sâu vào chi tiết cách sử dụng các thành phần của J2ME không phải
là trọng tâm của báo cáo này , do đó em xin phép chỉ đửa ra mô hình mô tả
các thành phần và quan hệ giữa chúng như ở hình bên .
II. Lập trình game trên di động với lớp Game Canvas
Lập trình game trên điện thoại di động có những lớp tiện ích và các rất
quan trọng chẳng hạn như là GameDesign , Sprite , TiledLayer hay là
LayerManager .
11
Em xin phép giới thiệu sơ lược qua
- Các thao tác với các sprite , tiledlayer và layermanager
+ các sprite là các nhân vật trong game nói chung , sprite có thể được điều
khiển hoặc cũng có thể đứng làm phông cảnh , các phương thức của lớp
sprite như là : đặt vị trí , xét va chạm , thể hiện hình ảnh , thể hiện các
chuyển động liên tiếp
+ các tiledlayer được dùng làm background , có thể xem tiledlayer là mở
rộng của sprite : nó bao gồm một loạt các sprite đứng yên phía sau các
sprite chuyển động, tuy nhiên cũng có các animated tiledlayer - các
tiledlayer có các cell động .
- cách bắt sự kiện và các thao tác hiển thị hình ảnh lên thiết bị trong game
canvas: các hình ảnh trong game canvas hiển thị lên thiết bị một cách liên

tục qua hàm gọi flushGraphics ( ) , do đó game canvas thích hợp với
nhưng game có nhiều chuyển động nối tiếp và ghép thành hình ảnh liên
tục trên mắt người quan sát .
2 đoạn code dưới đây cung cấp cái nhìn cơ bản về cách thức sử dụng và
hoạt động của sprite , layermanager và tiledlayer
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
12
public class ExampleGameCanvas extends GameCanvas implements
Runnable {
private boolean isPlay; // Game Loop runs when isPlay is true
private long delay; // To give thread consistency
private int currentX, currentY; // To hold current position of the 'X'
private int width; // To hold screen width
private int height; // To hold screen height
// Sprites to be used
private Sprite playerSprite;
private Sprite backgroundSprite;
// Layer Manager
private LayerManager layerManager;
// Constructor and initialization
public ExampleGameCanvas() throws Exception {
super(true);
width = getWidth();
height = getHeight();
currentX = width / 2;
13
currentY = height / 2;
delay = 20;
// Load Images to Sprites

Image playerImage = Image.createImage("/transparent.png");
playerSprite = new Sprite (playerImage,32,32);
Image backgroundImage =
Image.createImage("/background.png");
backgroundSprite = new Sprite(backgroundImage);
layerManager = new LayerManager();
layerManager.append(playerSprite);
layerManager.append(backgroundSprite);
}
// Automatically start thread for game loop
public void start() {
isPlay = true;
Thread t = new Thread(this);
t.start();
}
14
public void stop() { isPlay = false; }
// Main Game Loop
public void run() {
Graphics g = getGraphics();
while (isPlay == true) {
input();
drawScreen(g);
try { Thread.sleep(delay); }
catch (InterruptedException ie) {}
}
}
// Method to Handle User Inputs
private void input() {
int keyStates = getKeyStates();

playerSprite.setFrame(0);
// Left
if ((keyStates & LEFT_PRESSED) != 0) {
15
currentX = Math.max(0, currentX - 1);
playerSprite.setFrame(1);
}
// Right
if ((keyStates & RIGHT_PRESSED) !=0 )
if ( currentX + 5 < width) {
currentX = Math.min(width, currentX + 1);
playerSprite.setFrame(3);
}
// Up
if ((keyStates & UP_PRESSED) != 0) {
currentY = Math.max(0, currentY - 1);
playerSprite.setFrame(2);
}
// Down
if ((keyStates & DOWN_PRESSED) !=0)
if ( currentY + 10 < height) {
16
currentY = Math.min(height, currentY + 1);
playerSprite.setFrame(4);
}
}
// Method to Display Graphics
private void drawScreen(Graphics g) {
g.setColor(0x00C000);
g.fillRect(0, 0, getWidth(), getHeight());

// updating player sprite position
playerSprite.setPosition(currentX,currentY);
// display all layers
layerManager.paint(g,0,0);
flushGraphics();
}
}
Hình ảnh thể hiện
17
Còn đoạn code dưới đây giới thiệu về phương khởi tạo ra một TiledLayer
đơn giản
public class ExampleGameCanvas extends GameCanvas implements
Runnable {
private LayerManager layerManager;
private TiledLayer tiledBackground;
18
// Constructor and initialization
public ExampleGameCanvas() throws Exception {
super(true);
tiledBackground = initBackground();
layerManager = new LayerManager();
layerManager.append(tiledBackground);
}
private TiledLayer initBackground() throws Exception {
Image tileImages = Image.createImage("/tiles.png");
TiledLayer tiledLayer = new
TiledLayer(10,10,tileImages,32,32);
int[] map = { 5, 1, 1, 4, 1, 1, 1, 1, 1, 6,
5, 1, 3, 1, 1, 3, 1, 1, 1, 6,
5, 1, 2, 1, 1, 2, 1, 1, 1, 6,

5, 1, 2, 3, 1, 2, 1, 1, 1, 6,
5, 1, 4, 2, 1, 2, 1, 1, 1, 6,
5, 1, 1, 4, 1, 2, 1, 1, 1, 6,
5, 1, 1, 1, 1, 4, 1, 1, 1, 6,
19
5, 1, 1, 1, 1, 1, 1, 1, 1, 6,
5, 1, 1, 1, 1, 1, 1, 1, 1, 6,
5, 1, 1, 1, 1, 1, 1, 1, 1, 6
};
for (int i=0; i < map.length; i++) {
int column = i % 10;
int row = (i - column) / 10;
tiledLayer.setCell(column,row,map[i]);
}
return tiledLayer;
}
}
CHƯƠNG 3
Các sản phẩm đã hoàn thành
20
Hiện tại em đã hoàn thành được 3 sản phẩm : game Chicken Invaders (bắn
gà ) ,game Doctris Deluxe ( xếp thuốc ) game Mummy Deluxe ( game xác
ướp - thể loại giải đố )
Dưới đây là một số hình ảnh
21
22
I. Về game bắn gà Chicken Invaders
Dưới sự hướng dẫn của anh Bình , phó giám đốc công ty Sunnet ICT
Solution , em đã hoàn thành được game đầu tay của riêng mình . Qua sản
phẩm đầu tay này , em đã tự rút ra được một số kinh nghiệm cho bản thân

về cách bắt các sự kiện nhân vật , xử lí các lệnh command và các form
menu screen , hay là một số vấn đề gặp phải khi xử lí các file âm thanh
trên điện thoại thật . Game đầu tiên quả thật mất rất nhiều thời gian ,
nhưng từ những gì rút ra được , tiến độ làm việc với các game sau này quả
thực nhanh hơn rất nhiều .
J2ME cung cấp cho chúng ta một lớp Game Builer vô cùng tiện lợi để xử
lí các sprite , các tiledlayer hay là tạo các scene cho game .
Tuy rằng lớp Game Builder ngay trên phiên bản NetBeans 6.8 mới nhất
vẫn tồn tại một số thiếu sót gây khó chịu cho người dùng : ví dụ như khi
bạn vào Game Builder mà không tìm thấy các sprite mà mình tạo ra thì
phải khởi động lại NetBeans mới nhìn thấy được .
Một số hình ảnh các sprite được tạo dựng trong game
23
24
Việc tạo dựng các sprite giống như là việc đi tìm diễn viên cho một bộ
phim vậy , vấn đề ở đây là hãy chọn các diễn viên có “ diện mạo “ đẹp và
quan trọng nhất là “ catxê thấp “ ( dung lượng ảnh nhỏ ), bởi thiết bị
mobile phần lớn vẫn còn bị hạn chế về bộ nhớ ,chọn lựa các sprite phù
hợp với kích thước của mobile thường tốn khá nhiều thời gian , bởi có
nhiều dòng máy và nhiều kích thước khác nhau,chế độ xử lí hình ảnh cũng
khác nhau ( một số dòng máy quá thấp sẽ làm mất màu hình ảnh ) , khó
mà chọn được hình ảnh phù hợp cho tất cả dòng máy .
Với game Chicken Invader , kích thước cho phần lớn các Image là 20x20 .
Số lượng gà theo hàng ngang và hàng dọc đã được tùy chỉnh tự động theo
kích thước máy ảnh và không hề cố định . Tuy nhiên một số máy kích
thước quá bé sẽ làm số gà trở nên rất ít , cho nên cần thiết phải có thêm
một bộ ảnh với kích thước nhỏ hơn nữa là 10x10 .
Chuyển động của các con gà thể hiện tùy vào thuật toán của mỗi người ,
nhưng trong game này , em đã thể hiện 2 chuyển động chủ đạo chính và
qua mỗi cửa có sự kết hợp chúng lại

- chuyển động qua lại trái phải ( hàm animatedTiledLayer() )
- chuyển động lên xuống ( hàmanimatedTiledLayer( boolean ) )
Chuyển động của phi thuyền do người chơi điều khiển (hàm input() )
25

×