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

ĐỒ ÁN TỐT NGHIỆP KỸ SƯ NGÀNH CNTT ĐỀ TÀI : XÂY DỰNG GAME TRÊN HỆ ĐIỀU HÀNH iOS SỬ DỤNG COCOS2D GAME ENGINE VÀ OPENFEINT API

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 (5.1 MB, 73 trang )

ĐẠI HỌC ĐÀ NẴNG

TRƯỜNG ĐẠI HỌC BÁCH KHOA

KHOA CÔNG NGHỆ THÔNG TIN
Tel. (84-511) 736 949, Fax. (84-511) 842 771
Website: itf.ud.edu.vn, E-mail:

ĐỒ ÁN TỐT NGHIỆP KỸ SƯ
NGÀNH CÔNG NGHỆ THÔNG TIN
MÃ NGÀNH : 05115

ĐỀ TÀI :
XÂY DỰNG GAME TRÊN HỆ ĐIỀU HÀNH iOS
SỬ DỤNG COCOS2D GAME ENGINE VÀ OPENFEINT API.
Mã số : 06T3-054
Ngày bảo vệ : 15/06/2011

SINH VIÊN : PHAN ĐINH VỸ
LỚP
: 06T3
CBHD
: PGS-TSKH TRẦN QUỐC CHIẾN

ĐÀ NẴNG, 05/2011


LỜI CẢM ƠN
Đầu tiên em xin gửi lời cảm ơn chân thành nhất đến các thầy cô trong
trường Đại học Bách Khoa Đà Nẵng nói chung và các thầy cô trong Khoa
Công Nghệ Thông Tin, Bộ môn Công Nghệ Phần Mềm nói riêng đã tận tình


giảng dạy truyền đạt cho em những kiến thức những kinh nghiệm quý báu
trong suốt thời gian qua. Trong thời gian làm việc với các thầy cô trong
khoa Công Nghệ Thông Tin em đã được không ngừng tiếp thu thêm nhiều
kiến thức mà còn được học tập tinh thần làm việc, thái độ nghiên cứu khoa
học nghiêm túc, hiệu quả, những điều này rất cần thiết cho em trong quá
trình học tập và công tác sau này.
Em xin xin chân thành cảm ơn thầy Trần Quốc Chiến đã hết lòng
hướng dẫn em thực hiện đề tài.
Sau cùng em xin gửi lời cảm ơn chân thành nhất đến gia đình bạn bè đã
động viên, đóng góp ý kiến và giúp đỡ em trong quá trình thực hiện đồ án
tốt nghiệp.


LỜI CAM ĐOAN
Tôi xin cam đoan :
1

Những nội dung trong luận văn này là do tôi thực hiện dưới sự hướng dẫn
trực tiếp của PGS-TSKH Trần Quốc Chiến.

2

Mọi tham khảo dùng trong luận văn đều được trích dẫn rõ ràng tên
tác giả, tên công trình, thời gian, địa điểm công bố.

3

Mọi sao chép không hợp lệ, vi phạm quy chế đào tạo, hay gian trá,
tôi xin chịu hoàn toàn trách nhiệm.
Sinh viên,

Phan Đinh Vy


MỤC LỤC
MỞ ĐẦU...........................................................................................................9
.I Giới thiệu bối cảnh đề tài:.............................................................................................9
.II Mục tiêu cần đạt được:.................................................................................................9
.III Ý nghĩa thực tiễn:........................................................................................................9
.IV Nội dung đề tài:.........................................................................................................10

CƠ SỞ LÝ THUYẾT.....................................................................................11
.I Objective C:..................................................................................................................11
.I.1. Lịch sử:..............................................................................................................11
.I.2. Đặc điểm cơ bản:..............................................................................................11
.I.3. Cú pháp:............................................................................................................11
.I.3.1. Interface và implement:.................................................................................11
.I.3.2. Category........................................................................................................12
.I.3.3. Kiểm soát Exception:.....................................................................................13
.I.3.4. Properties:.....................................................................................................14
.I.3.5. Hàm tạo – Contructor:..................................................................................14
.I.3.6. Quản lý bộ nhớ:.............................................................................................14
.II QUẢN LÝ BỢ NHỚ...................................................................................................15
.II.1. Cấu trúc bợ nhớ...............................................................................................15
.II.1.1. Cấu trúc của vùng nhớ Stack:......................................................................15
.II.1.2. Cấu trúc của vùng nhớ Heap:......................................................................16
.II.2. Rị rỉ bợ nhớ (Memory Leaks).........................................................................17
.II.2.1. Định nghĩa:..................................................................................................17
.II.2.2. Ảnh hưởng của rò rỉ bộ nhớ:.......................................................................17
.II.2.3. Một số trường hợp rò rỉ bộ nhớ:..................................................................17
.II.3. Làm thế nào để tránh bị rị rỉ bợ nhớ:.............................................................20

.II.3.1. Ngun tắc:..................................................................................................20
.II.3.2. Các cách phát hiện rò rỉ bộ nhớ:.................................................................20
.II.3.3. Sử dụng công cụ để kiểm tra........................................................................21
.III Cocos2D:...................................................................................................................22
.III.1. Cocos2D là gì?...............................................................................................22
.III.2. Vì sao sử dụng Cocos2D:...............................................................................22
.III.2.1. Hoàn toàn miễn phí:...................................................................................22
.III.2.2. Mã ng̀n mở:............................................................................................22
.III.2.3. Được viết sử dụng ngôn ngữ Objective C:.................................................22
.III.2.4. Ẩn đi các thành phần của OpenGL ES:......................................................22
.III.2.5. Lập trình:....................................................................................................23
.III.2.6. Được sự ủng hộ của cộng đồng lập trình viên:..........................................23
.III.3. Cơ bản về Cocos2D:.......................................................................................23
.III.3.1. Singleton:....................................................................................................23
.III.3.2. CCDirector:................................................................................................24
.III.3.3. CCNode:.....................................................................................................25
.III.3.4. CCScene:....................................................................................................26
.III.3.5. CClayer:......................................................................................................26
.III.3.6. CCSprite:....................................................................................................27
i


.III.3.7. CCLabel:.....................................................................................................28
.III.3.8. CCMenu:.....................................................................................................28
.III.3.9. Lớp Actions:................................................................................................29
.III.4. Quản lý bộ nhớ với Cocos2D:........................................................................29
.IV Open Feint:................................................................................................................30
.IV.1. Giới thiệu:.......................................................................................................30
.IV.2. Tính năng:.......................................................................................................31
.IV.3. Triển khai:.......................................................................................................31


XÂY DỰNG GAME......................................................................................32
.I Giới thiệu tổng quan:...................................................................................................32
.I.1. Game là gì?.......................................................................................................32
.I.2. Qui trình làm game:..........................................................................................32
.I.3. Vịng đời của mợt game....................................................................................33
.II Xây dựng game đua xe (Racing)...............................................................................34
.II.1. Lịch sử game đua xe:.......................................................................................34
.II.2. Giới thiệu về game X-Racing:.........................................................................35
.III Xây dựng game X-Racing:.......................................................................................36
.III.1. Xây dựng hệ thớng điều khiển:......................................................................36
Tính toán vị trí của xe dựa vào vector vận tốc:......................................................36
.III.1.1. Hệ thống vật lý cho xe:...............................................................................37
.III.1.2. Thiết lập cho camera:.................................................................................38
.III.1.3. Xét va chạm trong game:............................................................................38
.III.1.4. Tính thời gian hoàn thành vòng đua trong game.......................................41
.III.2. Xây dựng hệ thống AI (trí thông minh nhân tạo) trong game:......................42
.III.2.1. Các phương pháp dò đường:......................................................................42
.III.2.2. AI cho xe:....................................................................................................45
.IV Triển khai chương trình:...........................................................................................48
.IV.1. Phân tích thiết kế:...........................................................................................48
.IV.1.1. Sơ đồ hoạt động:.........................................................................................48
.IV.1.2. Biểu đồ lớp:.................................................................................................49
.IV.1.3. Biểu đồ tuần tự:...........................................................................................50
.IV.1.4. Các lớp trong X-Code:................................................................................51
.IV.2. Triển khai OpenFeint:.....................................................................................52
.IV.2.1. Đăng kí tài khoản:.......................................................................................52
.IV.2.2. Tích hợp OpenFeint API vào game:............................................................54

CÀI ĐẶT VÀ THỬ NGHIỆM......................................................................56

.I Cài đặt:.........................................................................................................................56
.I.1. Hệ thống điều khiển của xe:.............................................................................56
.I.1.1. Xe tăng tốc:...................................................................................................56
.I.1.2. Khi hãm phanh:.............................................................................................56
.I.1.3. Rẽ trái hoặc rẽ phải:.....................................................................................56
.I.1.4. Khi không có điều khiển:...............................................................................57
.I.1.5. Cập nhật tọa đợ sau mỡi lần tính toán:........................................................57
.I.2. Thiết lập camera:...............................................................................................57
.I.3. Sử dụng ảnh để xét va chạm trong game:........................................................57
.I.3.1. Cấp phát mảng va chạm:..............................................................................58
.I.3.2. Lấy từng pixel màu của ảnh:.........................................................................58
.I.3.3. Chuyển pixel màu chuyển thành dữ liệu trong mảng va chạm......................58
ii


Mục lục

iii

.I.4. Dữ liệu đường đua:...........................................................................................59
.I.5. Tính toán để cho xe tự chạy:............................................................................59
.I.5.1. Tính khoảng cách theo trục tọa đợ X và Y giữa xe và điểm kiểm tra:..........59
.I.5.2. Tính góc của xe và đường nối điểm checkpoint (điểm kiểm tra)..................60
.I.5.3. Điều khiển xe:................................................................................................60
.I.5.4. Chuyển sang checkpoint kế tiếp:...................................................................61
.I.6. Tính thời gian mỡi vịng đua:...........................................................................61
.I.6.1. Kiểm tra điểm checkpoint..............................................................................62
.I.6.2. Cập nhật thời gian:.......................................................................................62
.II Thử nghiệm chương trình:..........................................................................................63
.II.1.1. Menus:..........................................................................................................63

.II.1.2. Bắt đầu cuộc đua:........................................................................................65
.II.1.3. Leaderboard:................................................................................................67

KẾT LUẬN....................................................................................................69
[1] David M. Bourg, Gleen Seeman. AI for Game Developers .O’Reilly Publisher,
Chương 14.......................................................................................................................71
[2] Sams Publishing, Programming in Objective-C, 2004..............................................71
[3] Nguyễn Thanh Bình. Phân tích và thiết kế hướng đối tượng. Khoa CNTT Đại học
Bách Khoa Đà Nẵng........................................................................................................71
[4] Trang web: />[5] Trang web: />

Mục lục

iv

DANH MỤC HÌNH ẢNH
CHƯƠNG 1: CƠ SỞ LÝ THUYẾT...............................................................9
HÌNH II.3-1: CÔNG CỤ LEAK...................................................................21
HÌNH II.3-2: DEBUG TRONG LEAK........................................................21
HÌNH III.1-3: BIỂU TƯỢNG CỦA COCOS2D TRÊN NỀN TẢNG IOS22
HÌNH III.3-4: SƠ ĐỒ KẾ THỪA CÁC LỚP THÔNG DỤNG..................25
HÌNH III.3-5: VỊ TRÍ SPRITE TRONG MÀN HÌNH...............................27
HÌNH III.3-6: MENU DƯỚI DẠNG TEXT................................................28
HÌNH IV.1-7: BIỂU TƯỢNG CỦA OPENFEINT......................................30
HÌNH IV.2-8: GIAO DIỆN OPENFEINT...................................................31
HÌNH I.3-9: VÒNG ĐỜI CỦA MỘT ỨNG DỤNG....................................33
HÌNH II.1-10: GAME ĐUA XE ĐẦU TIÊN...............................................34
HÌNH II.1-11: GAME POLE POSITION...................................................34
HÌNH II.1-12: GAME MARIO KART........................................................35
HÌNH II.1-13: GAME GRAM TURISMO..................................................35

HÌNH III.1-14: VỊ TRÍ CỦA XE TRONG HỆ TRỤC TỌA ĐỘ...............36
HÌNH III.1-15: TÍNH VỊ TRÍ CỦA XE.......................................................37
HÌNH III.1-16: VỊ TRÍ CANH GIỮA MÀN HÌNH...................................38
HÌNH III.1-17: HÌNH ẢNH THỰC VÀ HÌNH ẢNH CHỨC NĂNG CỦA
ĐƯỜNG ĐUA................................................................................................39
HÌNH III.1-18: MÔ TẢ ĐƯỜNG ĐUA.......................................................39
HÌNH III.1-19: VA CHẠM CỦA XE VỚI BÊN NGOÀI ĐƯỜNG ĐUA. 40
HÌNH III.1-20: ĐIỂM CHECKPOINT TRONG GAME..........................41
HÌNH III.2-21: ĐƯỜNG CHẠY CỦA XE...................................................42
HÌNH III.2-22: SỬ DỤNG ĐIỂM CHECKPOINT....................................43
HÌNH III.2-23: SỬ DỤNG DÒ ĐƯỜNG.....................................................44
HÌNH III.2-24: MÔ PHỎNG ĐƯỜNG ĐUA..............................................44
HÌNH III.2-25: NHỮNG VỊ TRÍ CỦA XE..................................................45
HÌNH III.2-26: GÓC XOAY CỦA XE.........................................................46
HÌNH III.2-27: THUẬT TỐN XỬ LÝ CỦA XE......................................47
HÌNH IV.1-28: SƠ ĐỜ HOẠT ĐỢNG.........................................................48


Mục lục

HÌNH IV.1-29: SƠ ĐỒ LỚP..........................................................................49
HÌNH IV.1-30: SƠ ĐỒ TUẦN TỰ................................................................50
HÌNH IV.1-31: CÁC LỚP SCENE...............................................................51
HÌNH IV.1-34.................................................................................................51
HÌNH IV.1-32: CÁC LỚP LAYER...............................................................51
HÌNH IV.1-33: CÁC LỚP CHÍNH TRONG GAME..................................51
HÌNH IV.2-35: THÔNG TIN GAME TRÊN OPENFEINT.......................52
HÌNH IV.2-36: GIAO DIỆN TẠO LEADERBOARD...............................53
HÌNH IV.2-37: GIAO DIỆN QUẢN LÝ LEADERBOARD......................53
HÌNH IV.2-38: FRAMEWORK CHO OPENFEINT.................................54

HÌNH IV.2-39: THIẾT LẬP CHO PROJECT............................................54
HÌNH IV.2-40: PHƯƠNG THỨC TRONG FILE HEADER.....................55
HÌNH IV.2-41: KHỞI TẠO OPENFEINT...................................................55
HÌNH I.5-42: TỌA ĐỘ TRONG COCOS2D VÀ PHOTOSHOP..............60
HÌNH I.6-43: MENU CHÍNH.......................................................................63
HÌNH I.6-44: MENU TÙY CHỌN...............................................................63
HÌNH I.6-45: THÔNG TIN GAME.............................................................64
HÌNH I.6-46: LỰA CHỌN ĐƯỜNG ĐUA..................................................64
HÌNH I.6-47: KẾT QUẢ CUỘC ĐUA.........................................................65
HÌNH I.6-48: BẮT ĐẦU GAME..................................................................65
HÌNH I.6-49: ĐUA XE VỚI BOT.................................................................66
HÌNH I.6-50: ĐUA MỘT NGƯỜI................................................................66
HÌNH I.6-51: KẾT NỐI BẠN BÈ.................................................................67
HÌNH I.6-52: DANH SÁCH ĐƯỜNG ĐUA................................................67
HÌNH I.6-53: DANH SÁCH NGƯỜI ĐIỂM CAO.....................................68
HÌNH I.6-54: GAME CHANNEL................................................................68

v


Mục lục

vi

DANH MỤC VIẾT TẮT VÀ THUẬT NGỮ
Thuật ngư

Định nghĩa

Ghi chu


AI

Artificial Intelligence – Trí
thông minh nhân tạo.

CCNode

Lớp cơ bản trong Cocos2D

CCSprite

Lớp để tạo ra nhân vật trong
game.

CCLayer

Lớp để chứa các đối tượng Không thể trực tiếp hiển thị
cần hiển thị.
ra màn hình.

CCScene

Lớp để hiển thị tất cả các đối
tượng ra màn hình.

CCLabel

Lớp để tạo ra một nhãn trong
Cocos2D


CCMenu

Lớp để tạo ra menu.

Checkpoint

Điểm kiểm tra.

Cocos2D

2D Game Framework trên
iOS

Dashboard

Bảng điều khiển của một
người chơi trong OpenFeint.

Framework

Là tập thư viện hoặc lớp để
lập trình viên sử dụng.

FPS

Frame Per Second - Số
khung hình trên một giây.

id


Kiểu trả về mặc định của Tương đương với void* ơ
Objective C
C++

iOS

Hệ điều hành trên các thiết
bị iPhone, iPod Touch, iPad
của Apple.

NAA

Non Access Area – Vùng
không được phép đi vào.

Memory Leak

Rị rỉ bợ nhớ.

Objective C

Ngơn ngữ sử dụng trên các


Mục lục

vii

dịng máy của Apple.

OpenFeint

Dịch vụ chia sẻ thơng tin
giữa người chơi.

Leaderboard

Bảng tổng kết những người
có số điểm cao.

SDK

Software Development Kit

Singleton

Mợt mẫu
Pattern

Track

Đường đua.

X-Code

Chương trình để viết ứng
dụng trên dịng máy MAC.

trong


Tập hợp những công cụ để
lập trình trên thiết bị hay nền
tảng nào đó.

Design
Hình nền của game.


MỞ ĐẦU
.I

Giới thiệu bối cảnh đề tài:

Trong một thập kỉ gần đây Apple nổi lên như là một công ty công nghệ chuyên sản xuất
những thiết bị CNTT hàng đầu thế giới. Nởi tiếng nhất có lẽ là dịng máy nghe nhạc iPod
huyền thoại và gần đây là dòng điện thoại iPhone. Một chiếc điện thoại kết hợp gần như
hoàn hảo giữa thời trang và công nghệ. Nhưng điều làm cho iPhone nổi tiếng không nằm ơ
tính năng nổi trội hay kiểu dáng sành điệu mà chính là ơ nội dung phần mềm phong phú
dành chon nó. Với gian hàng App Store của Apple với vô số những ứng dụng miễn phí cũng
như giá cả chỉ ơ mức 0.99$ người sử dụng iPhone đã có thể trải nghiệm điện thoại iPhone
mà không hề cảm thấy chán.
iPhone có một màn hình độ phân giải cao kết hợp với màn hình đa điểm đã trơ thành
mảnh đất màu mỡ cho các nhà phát triển game di động. Với những chiếc smart phone cao
cấp hiện nay người dùng có thể chơi mọi lúc mọi nơi những game được đầu tư công phu với
đồ họa đẹp mắt. Không những thế gian hàng App Store đã trơ thành nơi kiếm tiền cho rất
nhiều lập trình viên trên toàn thế giới.
Với việc cho ra mắt iPhone 4 và chuẩn bị cho ra mắt iPhone 5 dường như cơn sốt iPhone
vẫn sẽ tiếp tục sốt và những ứng dụng trên iPhone sẽ không ngừng tăng lên theo thời gian.
Cùng với nhu cầu ngày càng tăng về các ứng dụng mang tính giải trí cao như game,
những game engine cũng bắt đầu phát triển và đến bây giờ cũng đã có rất nhiều game

engine khác nhau cả 2D lẫn 3D. Game engine 2D như: Cocos2D, Sparrow, iTorque… 3D
như: Unity, SIO2, Irrlicht3D…
Đồ án lần này ứng dụng Cocos2D game engine để viết game đua xe trên iPhone kết hợp
với OpenFeint để nâng cao khả năng giao tiếp giữa những người chơi với nhau.

.II Mục tiêu cần đạt được:
Sử dụng thành thạo Objective C để viết ứng dụng trên các dòng máy của Apple.
Ứng dụng Cocos2D để xây dựng game.
Tích hợp OpenFeint API để mơ rộng khả năng kết nối của game.
Tìm hiểu về cấu trúc cũng như qui trình làm game.

.III Ý nghĩa thực tiễn:
Game đua xe sau khi viết xong có thể đưa ngay lên gian hàng AppStore để bán ra cho tất
cả người dùng.
SVTH: Phan Đinh Vỹ. Lớp: 06T3. Khoa: Công Nghệ Thông Tin – Đại học Bách Khoa Đà Nẵng

9


Ứng dụng game framework sẵn có cũng như hoàn thiện phát triển game framework phục
vụ mục đích cá nhân.

.IV Nội dung đề tài:
Đề tài gồm có 3 chương:
− Chương 1: Cơ sơ lý thuyết
Lý thuyết về ngôn ngữ lập trình Objective C, Cocos2D và OpenFeint.
− Chương 2: Xây dựng game.
Giới thiệu quá trình xây dựng một ứng dụng trên iOS và từng bước xây dựng game
Racing.
− Chương 3: Cài đặt và thử nghiệm.

Triển khai những thuật toán, thiết kế và hình ảnh chạy chương trình.

SVTH: Phan Đinh Vỹ. Lớp: 06T3. Khoa: Công Nghệ Thông Tin – Đại học Bách Khoa Đà Nẵng

10


Xây dựng game Racing trên hệ điều hành iOS

CHƯƠNG 1

CƠ SỞ LÝ THUYẾT
.I

Objective C:

.I.1.

Lịch sử:

Ngôn ngữ Objective C là ngôn ngữ lập trình hướng đối tượng - OOP, được giới thiệu
năm 1981 bơi Bard Cox và Tom Love thuộc công ty Stepstone. Thập kỉ 80 cũng được biết
đến như là giai đoạn cực thịnh của sự ra đời của các ngôn ngữ OOP trên nền ngôn ngữ C.
Năm 1988, nhà đồng sáng lập của Apple là Steve Jobs sau khi bị sa thải khỏi Apple đã
lập một công ty là NeXT, ông đã mua lại bản quyền ngôn ngữ Objective C từ StepStone để
phát triển ứng dụng cho phần cứng của mình.
Hơn một thập kỉ sau năm 1996 sau một thời kì khủng hoảng tồi tệ, Apple mới nhận ra
tầm quan trọng không thể thay thế của Steve Jobs và đã mời ông trơ lại làm CEO. Apple
cũng đồng thời mua lại NeXT và tiếp tục sử dụng ngôn ngữ Objective C để phát triển hệ
điều hành MAC và xây dựng một loạt các công cụ phát triển như XCode, Interface

Builder… Chính vì thế mà khi nhắc tới Mac, nhắc tới iOS thì người ta sẽ nghĩ ngay đến
Objective C chứ không phải là một ngôn ngữ hướng đối tượng nào khác.

.I.2.

Đặc điểm cơ bản:

o Là ngôn ngữ lập trình hướng đối tượng - OOPL.
o Mơ rộng từ C.
o Mềm dẻo, có thể sử dụng cấu trúc của C để viết.

.I.3.

Cu pháp:

.I.3.1.

Interface và implement:

Lập trình trong Objective C yêu cầu phải đặt interface và cài đặt của nó trên 2 file khác
nhau. Cũng giống như trong C++, trong Objective C file header được đặt tên với đuôi .h và
file cài đặt được đặt tên với đuôi .m.
Interface:
Interface của một lớp thường được định nghĩa trong file header. Có cấu trúc như sau:
@interface classname : superclassname
{
// instance variables
}
+ classMethod1;
+ (return_type)classMethod2;

+ (return_type)classMethod3:(param1_type)param1_varName;
- (return_type)instanceMethod1:(param1_type)param1_varName andOtherParameter:

SVTH: Phan Đinh Vỹ. Lớp: 06T3. Khoa: Công Nghệ Thông Tin – Đại học Bách Khoa Đà Nẵng

11


Xây dựng game Racing trên hệ điều hành iOS
(param2_type)param2_varName;
- (return_type)instanceMethod2WithParameter:(param1_type)param1_varName
andOtherParameter:(param2_type)param2_varName;
@end

Trong ví dụ trên dấu + biểu thị cho phạm vi hoạt động của phương thức là class (cũng
giống như từ khóa static của C++)
Dấu – biểu thị phạm vi hoạt động của phương thức là ơ object.
Các thuộc tính được khai báo trong cặp { ..... } và khai báo phương thức ơ bên ngoài.
Sử dụng #import để thay thế cho #include.
Cũng giống như Java, Objective C chỉ cho phép đơn kế thừa. Mặc định tất cả các lớp sẽ
kế thừa từ NSObject.
Các phạm vi truy xuất public,protected và private giống như C++ mặc định là protected.
Để truy cập đến phương thức của một đối tượng ta dùng cú pháp

[obj method:argument];

Kiểu trả về của một hàm trong Objective C có thể là bất kì kiểu nào trong C hoặc là con
trỏ trỏ đến những kiểu đặc biệt như NSArray *, NSImage *, hay NSString *. Kiểu trả về
mặc định của Objective C là id.
Implement

Cài đặt một lớp thường để trong file .m hoặc .mm. Khi cài đặt một lớp thì phải đặt trong
cặp từ khóa
@implement classname

@end

Thông thường khai báo bao nhiêu hàm thì phải cài đặt bấy nhiêu nếu không trình biên
dịch sẽ đưa ra cảnh báo.
Nếu khai báo biến static thì phải đặt bên ngoài cặp @implement/ @end.

.I.3.2.

Category

Là tính năng nếu ta muốn thêm vào lớp sẵn có một phương thức ngay cả khi không biết
mã nguồn của lớp đó. Category là giảm thiểu đi việc kế thừa phức tạp của C++ khi mục
đích cũng chỉ là thêm mới một phương thức vào cho lớp. Không những thế việc dùng
category để chia nhỏ ra những thay đổi kế thừa từ file sẵn có thành những file nhỏ sẽ phần
nào giúp ích cho ta trong quá trình phát triển mơ rợng ứng dụng.
Lấy ví dụ đơn giản như sau:


File integer.h

#import <objc/Object.h>
@interface Integer : Object
{
int integer;
}


SVTH: Phan Đinh Vỹ. Lớp: 06T3. Khoa: Công Nghệ Thông Tin – Đại học Bách Khoa Đà Nẵng

12


Xây dựng game Racing trên hệ điều hành iOS

- (int) integer;
- (id) integer: (int) _integer;
@end



File interger.m

#import "Integer.h"
@implementation Integer
- (int) integer
{
return integer;
}
- (id) integer: (int) _integer
{
integer = _integer;
return self;
}
@end




File arithmetic.h

#import "Integer.h"
@interface Integer (Arithmetic)
- (id) add: (Integer *) addend;
- (id) sub: (Integer *) subtrahend;
@end



File arithmetic.m

#import "Arithmetic.h"
@implementation Integer (Arithmetic)
- (id) add: (Integer *) addend
{
return [self integer: [self integer] + [addend integer]];
}
- (id) sub: (Integer *) subtrahend
{
return [self integer: [self integer] - [subtrahend integer]];
}
@end

Ở ví dụ trên ta thấy rằng việc chia thành những file nhỏ như trên rất hữu ích khi có nhiều
người cùng phát triển một hệ thống nhưng chia nhỏ theo những nhánh khác nhau.
Lưu ý khi sử dụng category:
Có thể thêm bao nhiêu lần mơ rộng lớp từ category là khơng giới hạn nhưng khơng được
trùng lặp tên.


.I.3.3.

Kiểm sốt Exception:

Objective C cũng hỗ trợ cấu trúc try-catch-throw-finally, cách dùng hoàn toàn tương tự
như C++.

SVTH: Phan Đinh Vỹ. Lớp: 06T3. Khoa: Công Nghệ Thông Tin – Đại học Bách Khoa Đà Nẵng

13


Xây dựng game Racing trên hệ điều hành iOS

.I.3.4.

Properties:

Hầu như bất kì ngôn ngữ lập trình hiện đại nào cũng hỗ trợ khái niệm này. Đây là khái
niệm bảo toàn tính đóng gói của OOP.
Trong file .h ta phải khai báo sử dụng bằng từ khóa @property
@property (readwrite) int _value;

Một property có thể khai báo là readonly, readwrite, assign, copy hay retain. Mặc định
property sẽ có thuộc tính là atomic, giá trị sẽ được khóa không cho nhiều thread thay đổi
cùng một thời điểm. Thuộc tính nếu là nonatomic thì sẽ bỏ đi khóa này.
Trong file .m chỉ thị @synthesize phải được thêm vào trước implement một lớp để báo
cho trình biên dịch biết là phải khơi tạo ra hàm get và set cho giá trị.
@synthesize _value;


.I.3.5.

Hàm tạo – Contructor:

Không giống như C++ hàm tạo phải có quy luật về khơi tạo đối tượng thì trong Objective
C ta có thể tự tạo ra một hàm tạo của riêng mình, tất nhiên theo thói quen và để cho dễ nhớ
ta nên đặt hàm tạo với những tên như init hoặc tương tự…
Mợt sớ lưu ý:






.I.3.6.

Từ khóa super để tham chiếu tới lớp cha.
Từ khóa self tác dụng tương đương như this trong C++. (chính bản thân đang thể
hiện của lớp - object hiện tại)
Kết thúc hàm khơi tạo (init) sẽ trả về chính đối tượng được tạo ra thông qua từ
khóa self.
Mặc định trong Objective C hàm khỏi tạo là - (id) init;
Trong Objective C hàm khơi tạo chỉ có ý nghĩa về mặt tư duy, nó không được đối
xử đặc biết giống như C++.

Quản lý bộ nhớ:

Có 2 lựa chọn cho việc quản lý bộ nhớ là làm tự động hoặc bằng tay. Thông thường thì
việc quản lý bộ nhớ được thực hiện bơi lập trình viên, Objective C có những chỉ thị như
“release”, “retain”, “autorelease” là những chỉ thị giúp đỡ rất nhiều cho người lập trình

trong việc quản lý bộ nhớ.
Objective C sử dụng một tham chiếu đếm để dị tìm ra những thay đởi trên mợt đới
tượng. Biến đếm này sẽ tăng lên một khi đối tượng được cấp phát bộ nhớ bằng phương thức
alloc, biến đếm này sẽ giảm đi một khi đối tượng được giải phóng bằng phương thức
dealloc. Như vậy nguyên lý cấp phát và duy trì bộ nhớ của đối tượng trong Objective C
được sử dụng thông qua phương thức alloc và dealloc. Khi một đối tượng được tạo ra thì
ngoài hàm tạo sẽ có hàm hủy dealloc, nếu như không cài đặt hàm hủy này thì sẽ gọi đến
hàm hủy mặc định của lớp cha.

SVTH: Phan Đinh Vỹ. Lớp: 06T3. Khoa: Công Nghệ Thông Tin – Đại học Bách Khoa Đà Nẵng

14


Xây dựng game Racing trên hệ điều hành iOS

.II QUẢN LÝ BỢ NHỚ.
.II.1. Cấu truc bợ nhớ
− Code segment: nơi chứa chương
trình sau khi được biên dịch.
− Global area: nơi chứa biến toàn cục.
− Stack segment: nơi các biến cục bộ
(local variables) và tham số (parameter)
được cấp phát.
− Heap segment: nơi các biến cấp phát
động được cấp phát vùng nhớ.

.II.1.1.

Cấu trúc của vùng nhớ Stack:

Đặc điểm:
− Vùng bộ nhớ nơi tham số và
biến cục bộ được cấp phát.
− Vùng nhớ có giới hạn, vượt quá
kích thước vùng nhớ thì bị Stack
overflow
− Vùng nhớ sử dụng trong stack
là tạm thời và được tự động giải
phóng.

SVTH: Phan Đinh Vỹ. Lớp: 06T3. Khoa: Công Nghệ Thông Tin – Đại học Bách Khoa Đà Nẵng

15


Xây dựng game Racing trên hệ điều hành iOS

.II.1.2.

Cấu trúc của vùng nhớ Heap:

Đặc điểm:
− Vùng nhớ lớn.
− Được cấp phát đợng.
− Vẫn cịn cấp phát cho đến khi
được giải phóng. Nếu khơng giải
phóng đúng sẽ dẫn đến tình trạng
rị rỉ bộ nhớ.
− Chỉ được truy cập thông qua
con trỏ.

− Mảng dữ liệu lớn, struct hay
class nên được lưu trữ trong heap
vì khả năng cấp phát động cùng
với vùng nhớ lớn.

SVTH: Phan Đinh Vỹ. Lớp: 06T3. Khoa: Công Nghệ Thông Tin – Đại học Bách Khoa Đà Nẵng

16


.II.2. Rị rỉ bợ nhớ (Memory Leaks)
.II.2.1.

Định nghĩa:

Là trường hợp vùng nhớ khơng cịn sử dụng nữa nhưng khơng thể được giải phóng điều
này đồng nghĩa với việc bộ nhớ sẽ tăng mợt cách khơng thể kiểm sốt được.

.II.2.2.

Ảnh hưởng của rị rỉ bộ nhớ:



FPS (Frame Per Second – Sớ khung hình trên 1 giây)

FPS của ứng dụng sẽ rất thấp điều này rất quan trọng trong việc viết ứng dụng đặc biệt là
game, người dùng sẽ không chấp nhận tình trạng game bị giật khựng hay đứng hình.
− Thoát bất chợt (Crashed)
Khi không đủ bộ nhớ để sử dụng thì những thiết bị có hệ điều hành thường được hệ điều

hành quản lý việc giải phóng tất cả vùng nhớ không cần thiết bằng cách tắt ngay ứng dụng
đang tiêu tốn vùng nhớ đồng thời giải phóng tất cả vùng nhớ mà ứng dụng gây ra lỗi tạo ra.
Điều này đồng nghĩa với việc ứng dụng đang chạy sẽ bị thốt mợt cách bất chợt mà khơng
hề có thơng báo cũng như không có một sự đảm bảo nào cho việc dữ liệu đang xử lý sẽ
được lưu trữ.
− Đứng thiết bị (freeze), khơi động lại (restart):
Một số thiết bị không có hệ điều hành hoặc hệ điều hành quản lý bộ nhớ không được tốt
thì tình trạng này rất phở biến, khi khơng cịn đủ bợ nhớ sử dụng cho thiết bị, thiết bị sẽ
không thể hoạt động được nữa. Khi đó để giải phóng một số thiết bị sẽ tự khơi động lại để
giải phóng toàn bộ vùng nhớ đã bị chiếm dụng.

.II.2.3.

Một số trường hợp rò rỉ bộ nhớ:



Khơng giải phóng vùng nhớ:

Ví dụ:

Giải pháp:
Giải phóng vùng nhớ ngay sau khi sử dụng.

SVTH: Phan Đinh Vỹ. Lớp: 06T3. Khoa: Công Nghệ Thông Tin – Đại học Bách Khoa Đà Nẵng

17


Sử dụng auto release


− Khơng giải phóng hết:
Ví dụ:

Giải pháp:
Xóa hết tất cả các phần tử:

Sử dụng đối tượng mảng (chỉ dùng với Objective C):

SVTH: Phan Đinh Vỹ. Lớp: 06T3. Khoa: Công Nghệ Thông Tin – Đại học Bách Khoa Đà Nẵng

18


Xây dựng game Racing trên hệ điều hành iOS

− Sử dụng kiểu trả về là con trỏ:
Ví dụ:

Giải pháp:
Tránh gọi trực tiếp hàm trả về kiểu con trỏ.
Giải phóng ngay sau khi sử dụng.

− Sử dụng con trỏ làm tham chiếu:

SVTH: Phan Đinh Vỹ. Lớp: 06T3. Khoa: Công Nghệ Thông Tin – Đại học Bách Khoa Đà Nẵng

19



Xây dựng game Racing trên hệ điều hành iOS
Ví dụ:

Giải pháp:
Phải giải phóng vùng nhớ đã được cấp phát sau khi sử dụng. Ở trường hợp này nên kiểm
tra thử con trỏ đã được cấp phát vùng nhớ hay là chưa.

.II.3. Làm thế nào để tránh bị rị rỉ bợ nhớ:
.II.3.1.

Nguyên tắc:

Luôn phải giải phóng vùng nhớ sau khi sử dụng. Điều này rất khó thực hiện vì không phải ai
cũng có thể nhớ được tất cả code mình viết.
Phải có biện pháp quản lý tốt mã nguồn mình viết ra như: comment kĩ trong mã nguồn, có
tài liệu cụ thể về mã nguồn....

.II.3.2.


Các cách phát hiện rị rỉ bộ nhớ:
Bằng cách chạy trực tiếp trên thiết bị.

Cách này không hẳn chính xác, trong thực tế thiết bị xảy ra nhiều “triệu chứng” khác
nhau. Chẳng hạn khi thiết bị bị đứng hoặc khơi động lại không phải nhất thiết thiết bị bị hết
bộ nhớ mà có thể đó là lỗi hệ điều hành, firmware hay thậm chí là lỗi phần cứng.
− Bằng cách kiểm tra mã nguồn từ đầu đến cuối.
Việc này tốn rất nhiều thời gian để đọc cũng như hiểu được mã nguồn xử lý gì bên trong,
nếu không phải là người viết nên mã nguồn thì biện pháp này không khả thi.
− Bằng cách sử dụng các công cụ debug để kiểm tra.

Trong X-Code có thể sử dụng cơng cụ Leak để kiểm tra có rị rỉ bộ nhớ trong quá trình
thực thi chương trình hay là không.

SVTH: Phan Đinh Vỹ. Lớp: 06T3. Khoa: Công Nghệ Thông Tin – Đại học Bách Khoa Đà Nẵng

20


Xây dựng game Racing trên hệ điều hành iOS

.II.3.3.

Sử dụng công cụ để kiểm tra.

Hình II.3-1: Công cụ Leak.

Hình II.3-2: Debug trong Leak.

SVTH: Phan Đinh Vỹ. Lớp: 06T3. Khoa: Công Nghệ Thông Tin – Đại học Bách Khoa Đà Nẵng

21


Xây dựng game Racing trên hệ điều hành iOS

.III Cocos2D:
.III.1. Cocos2D là gì?

Hình III.1-3: Biểu tượng của Cocos2D trên nền tảng iOS
Cocos2D là một game engine (công cụ phát triển game) trên nền tảng iOS của các thiết

bị iPhone / iPod Touch / iPad và gần đây nhất là trên nền tảng OSX của Mac được phát triển
bơi Ricardo Quesada. Cocos2D đang phát triển mạnh mẽ và được hỗ trợ bơi cộng đồng lập
trình viên hết sức đông đảo. Cocos2D mang đến cho lập trình viên rất nhiều thành phần để
có thể viết game trong thời gian nhanh nhất có thể và rất nhiều game nằm trong “top” hiện
nay đều được viết sử dụng Cocos2D engine.

.III.2. Vì sao sử dụng Cocos2D:
Một lập trình viên khi tìm kiếm một game engine để lập trình thường cân nhắc trên một
số yếu tố quan trọng và Cocos2D phần nào đã đáp ứng được những yếu tớ quan trọng nhất.
Đó là:

.III.2.1. Hồn tồn miễn phí:
Lập trình viên được phép sử dụng Cocos2D để viết game và phân phối cả bản miễn phí
và thương mại mà không cần phải trả bất kì một khoản tiền nào.

.III.2.2. Mã nguồn mở:
Mọi mã nguồn thư viện của Cocos2D đều “mơ”. Điều này đồng nghĩa với việc người sử
dụng có thể “jump” vào sâu bên trong mã nguồn để xem xét cũng như chỉnh sửa cho phù
hợp với nhu cầu sử dụng.

.III.2.3. Được viết sử dụng ngôn ngữ Objective C:
Mã nguồn của Cocos2D được viết bằng ngôn ngữ Objective C, ngôn ngữ “chính thức”
của Apple sử dụng để lập trình trên tất cả các hệ máy của hãng.
Cocos2D làm cho việc ứng dụng iPhone SDK trơ nên linh hoạt hơn rất nhiều.
Các APIs thông dụng như OpenFeint, Facebook, hay GameCenter cũng được viết trên
ngôn ngữ Objective-C vì thế nên Cocos2D dễ dàng được tích hợp để sử dụng những API
này.

.III.2.4. Ẩn đi các thành phần của OpenGL ES:
Đây là điều mà lập trình viên rất thích khi sử dụng Cocos2D. Chẳng hạn như để vẽ một

đối tượng ảnh chỉ cần tạo ra một đối tượng Sprite từ ảnh có sẵn. Sprite có thể được co giãn,
xoay và thay đổi mày sắc…chỉ cần thay đổi một số thuộc tính của đối tượng Sprite vừa tạo
ra. Lập trình viên không cần quan tâm cách Sprite sử dụng đến OpenGL ES.

SVTH: Phan Đinh Vỹ. Lớp: 06T3. Khoa: Công Nghệ Thông Tin – Đại học Bách Khoa Đà Nẵng

22


Xây dựng game Racing trên hệ điều hành iOS
Nhưng đồng thời Cocos2D vẫn cho phép lập trình viên sử dụng OpenGL ES trong mã
nguồn của mình. Điều này rất hữu ích khi cần viết lại một lớp nào đó của Cocos2D.

.III.2.5. Lập trình:
Về cơ bản sử dụng Cocos2D sẽ làm cho việc viết game trên nền tảng iOS dễ dàng hơn
nhưng không phải là lập trình viên có thể tạo ra một game mà không phải lập trình. Một số
game engine khác như Unity, iTorque… tạo ra một bộ công cụ để giảm thiểu đi việc lập
trình. Điều này làm giảm thời gian và công sức lập trình như khi có lỗi xảy ra thì rất khó để
bảo trì và sửa chữa.

.III.2.6. Được sự ủng hộ của cộng đồng lập trình viên:
Điều này cũng rất quan trọng đối với người lập trình. Khi mới tiếp cận thì không phải
mọi câu hỏi đều có thể tự thân người lập trình tìm ra câu trả lời. Mọi câu hỏi đều được trả
lời nhanh chóng trên forum của Cocos2D.
Lập trình viên sử dụng Cocos2D chia sẽ rất nhiều mã nguồn cũng như hướng dẫn thực
hiện với Cocos2D.
Và vì Cocos2D hoàn toàn mơ nên nó càng ngày càng hoàn thiện bơi cộng đồng lập trình
viên đông đảo trên iOS.

.III.3. Cơ bản về Cocos2D:

Trong phần này sẽ giới thiệu những thành phần cơ bản, những lớp thường sử dụng trong
Cocos2D cũng như cấu trúc của Cocos2D engine.

.III.3.1. Singleton:
Mẫu Singleton trong thiết kế mẫu (Design Pattern) là một lớp thông thường nhưng chỉ có
duy nhất một thể hiện (chỉ có duy nhất một đối tượng được tạo ra) trong suốt cả quá trình
thực thi chương trình. Để đảm bảo điều này thì luôn có một phương thức static được sử
dụng trong suốt quá trình tạo và truy cập đến đối tượng được tạo ra.
Trong Cocos2D thay vì sử dụng alloc/init thì để truy cập đến đối tượng singleton ta dùng
phương thức bắt đầu bằng shared.
Một số lớp thông dụng nhất sử dụng singleton trong Cocos2D là:
CCActionManager* sharedManager = [CCActionManager sharedManager];
CCDirector* sharedDirector = [CCDirector sharedDirector];
CCSpriteFrameCache* sharedCache = [CCSpriteFrameCache sharedSpriteFrameCache];
CCTextureCache* sharedTexCache = [CCTextureCache sharedTextureCache];
CCTouchDispatcher* sharedDispatcher = [CCTouchDispatcher sharedDispatcher];
CDAudioManager* sharedManager = [CDAudioManager sharedManager];
SimpleAudioEngine* sharedEngine = [SimpleAudioEngine sharedEngine];

Ưu điểm của sử dụng singleton:

SVTH: Phan Đinh Vỹ. Lớp: 06T3. Khoa: Công Nghệ Thông Tin – Đại học Bách Khoa Đà Nẵng

23


×