Tải bản đầy đủ (.pdf) (90 trang)

Đề tài battle plane

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 (4.31 MB, 90 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>BÔ GIO DC V ĐO TO</b>

<b>TRƯỜNG ĐI HỌC SƯ PHM KỸ THUẬT TP.HCMKHOA CÔNG NGHỆ THÔNG TIN</b>

<b>ĐỀ TI: BATTLE PLANE</b>

<b>Giáo viên hướng dẫn : Lê Thị Minh Châu</b>

Sinh viên thực hiện : Trần Đăng Khoa - 23110118

<b> Nguyễn Vũ Bảo - 23110079 </b>

<b> </b>

<b>Tp.HCM, ... tháng 12 năm 2023</b>

ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP.HCM KHOA CƠNG NGHỆ THƠNG TIN

CỘNG HỊA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập – Tự do – Hạnh phúc

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

 

<b>NHIỆM V THỰC HIỆN KHĨA LUẬN TỐT NGHIỆP</b>

Mơn: NHẬP MƠN NGÀNH CƠNG NGHỆ THƠNG TIN

Tên đề tài: Xây dựng một chương trình giao diện đồ họa bằng C/C++

<b>Nội dung thực hiện:</b>

<i>Lý thuyết: </i>

 Tìm hiểu thư viện đồ họa SDL

<i>Thực hành: </i>

 Xây dựng chương trình game Battle Plane

<b>Thời gian thực hiện: 4 tuần</b>

Chữ ký của SV: Chữ ký của SV:

<i> TP.HCM, Ngày…. tháng…. năm…..</i>

<b>NHẬN XÉT CỦA GIO VIÊN HƯỚNG DẪN</b>

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

<b>NHẬN XÉT CỦA GIO VIÊN PHẢN BIỆN</b>

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

Để hoàn thành bài tiêu luận này, chúng em xin gửi lời cảm ơn đến Ban giám hiệu Trường Đại học Sư phạm Kỹ thuật TP.HCM đã tạo điều kiện về cơ sở vật chất với phịng học sạch đẹp, có wifi, máy chiếu để phục vụ cho việc học tập và tìm kiếm thơng tin của em.

Với lịng biết ơn sâu sắc nhất, em xin gửi đến quý Thầy Cô ở Khoa Khoa Công Nghệ Thông Tin – Trường Đại học Sư phạm Kỹ thuật TP.HCM đã cùng với tri thức và tâm huyết của mình để truyền đạt vốn kiến thức quý báu cho chúng em trong suốt thời gian học tập tại trường.

Trong vòng gần 4 tuần, em sẽ khơng thể hồn thành dự án nếu khơng có sự giảng dạy tận tâm, giúp đỡ nhiệt tình của cơ Lê Thị Minh Châu. Với lịng biết ơn sâu sắc nhất, em xin gửi đến cô. Chúc cô sẽ luôn thành công và tâm huyết hơn với nghề để tiếp tục truyền đạt những kiến thức quý báu cho em trong quá trình học tập ở trường và xa hơn là ngồi cuộc sống.

Do chưa có nhiều kinh nghiệm nên khơng thể tránh khỏi những thiếu sót và hạn chế, rất mong nhận được ý kiến đóng góp từ phía cơ để đề tài được hồn thiện hơn.

<b>Chúng em xin chân thành cảm ơn!</b>

<b>MC LC</b>

LỜI NÓI ĐẦU...1

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

CHƯƠNG 1 :TỔNG QUAN VỀ THƯ VIỆN SDL...2

1.1 Khái niệm thư viện SDL...2

2.1 Download thư viện...5

2.2 Tích hợp thư viện vào Visual Studio...5

CHƯƠNG 3: GAME BATTLE PLANE...13

BẢNG PHÂN CÔNG CƠNG VIỆC...81

TÀI LIỆU THAM KHẢO...81

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

<b>LỜI NĨI ĐẦU</b>

  

Chào mừng các bạn đến với thế giới đầy màu sắc và động lực của thư viện SDL (Simple DirectMedia Layer)! Trong lời nói đầu này, chúng ta sẽ khám phá một công cụ mạnh mẽ và linh hoạt, mang đến cho chúng ta khả năng tạo ra những ứng dụng đồ họa và đa phương tiện tuyệt vời.

Thư viện SDL không chỉ là một cơng cụ hỗ trợ đơn giản, mà cịn là một hành trang vững chắc cho những người sáng tạo muốn thách thức bản thân trong lĩnh vực đồ họa máy tính. Từ việc vẽ đồ thị cơ bản đến xử lý sự kiện và âm thanh, SDL cung cấp một giao diện đơn giản nhưng mạnh mẽ để thực hiện những ý tưởng sáng tạo của mình.

Trong hành trình này, chúng ta sẽ tìm hiểu về cách sử dụng SDL để tạo ra các ứng dụng đồ họa thú vị, làm cho mọi điều từ trò chơi nhỏ đến ứng dụng đa phương tiện phức tạp trở nên dễ dàng hơn bao giờ hết. Với sự linh hoạt và sức mạnh của SDL, chỉ tưởng tượng là giới hạn, và chúng ta có thể thách thức mình để đưa ý tưởng thành hiện thực.

Hãy bắt đầu hành trình sáng tạo của bạn với SDL và khám phá cùng chúng tôi những khả năng vô tận mà thư viện này mang lại. Chúng ta hãy cùng nhau tạo ra những tác phẩm nghệ thuật số động, và từng bước nhỏ sẽ trở thành những cánh cửa mở ra thế giới rộng lớn của đồ họa máy tính.

Sau cùng , chúng em hy vọng báo cáo này sẽ đóng góp tích cực trong việc cải tiến sự hiểu biết về lĩnh cơng nghệ thơng tin và mong nhận được sự góp ý của cô.

1

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

<b>CHƯƠNG 1 :TỔNG QUAN VỀ THƯ VIỆN SDL</b>

<b>1.1 Khái niệm thư viện SDL</b>

Simple DirectMedia Layer (thường được viết tắt là SDL) là một thư viện lập trình có khả năng trừu tượng hóa các phần cứng đồ họa, âm thanh hay thiết bị vào và ra. Thư viện này giúp các lập trình viên viết các chương trình giải trí hay các ứng dụng đa phương tiện (multimedia) trên nhiều hệ điều hành khác nhau như: GNU/Linux, Windows, Mac OS Classic, Mac OS X, BeOS và một vài hệ điều hành khơng chính thức khác. Qua thư viện này, lập trình viên có thể điều khiển phần hiển thị, sự kiện, âm thanh, ổ dĩa CD-ROM, thread và đồng hồ đo giờ.

<b>1.2 Lịch sử</b>

Sam Lantinga là người tạo ra thư viện này vào năm 1998, lúc ơng cịn làm cho hãng Loki Software. Ông nảy ra ý định này khi mang các chương trình Windows vào mơi trường Macintosh. Sau đó ơng dùng thư viện này để đem chương trình giải trí Doom sang hệ điều hành BeOS (Xem mã nguồn của chương trình Doom). Một vài thư viện tự do khác như SMPEG và OpenAL có thể hoạt động chung với SDL.

SDL được chia thành nhiều hệ thống con (subsystem) như : Video, Audio, CD-ROM, Joystick và Timer. Bên cạnh những hệ thống con cơ bản này, do đây là thư viện cấp thấp, cịn có một số thư viện chính thức riêng biệt, cung cấp các chức năng khác. Bao gồm:

* SDL_image: cung cấp các hàm để đọc các định dạng ảnh phổ biến ngày nay như: JPEG, PNG, BMP...

* SDL_mixer: các hàm audio dùng để hòa âm (mixing) hay đọc các tập tin âm thanh hay nhạc như: WAV, OGG, MP3

* SDL_net: hỗ trợ lập trình mạng đa hệ điều hành

* SDL_ttf: hỗ trợ hiển thị các phông chữ TTF (true type font) * SDL_rtf: hỗ trợ hiển thị định dạng RTF đơn giản

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

<b>1.3 Sơ lược</b>

Đây là thư viện đa phương tiện, đa nền (cross-platform), được thiết kế để cung cấp sự truy cập ở mức cấp thấp đến âm thanh, hình ảnh, bàn phím, chuột, cần điều khiển game (joystick), phần cứng 3D (3D hardware)... thông qua OpenGL và 2D video framebuffer.

SDL hỗ trợ các hệ điều hành sau: Linux, Windows, Windows CE, BeOS, MacOS, MacOS X, FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, IRIX và QNX. Ngồi ra cịn hỗ trợ một số hệ điều hành khác như: AmigaOS, Dreamcast, Atari, AIX, OSF/Tru64, RISC OS, SymbianOS và OS/2 nhưng khơng chính thức.

Thư viện SDL được viết bằng C chuẩn, nhưng hỗ trợ tốt với C++ và nhiều ngơn ngữ lập trình khác như: Ada, C#, Eiffel, Erlang, Euphoria, Guile, Haskell, Java, Lisp, Lua, ML, Objective C, Pascal, Perl, PHP, Pike, Pliant, Python, Ruby và Smalltalk.

<b>1.4 Kiến trúc</b>

SDL thật sự là một gói bao bọc (wrapper) xung quanh các chức năng xác định của hệ điều hành. Mục đích chính của SDL là lập thành một giao diện lập trình cốt lõi đa hệ điều hành phổ biến cho việc truy cập chức năng đa phương tiện.

Do cách thiết kế của SDL, hầu hết mã nguồn của thư viện được tách thành nhiều phần cho từng hệ điều hành. Khi SDL được biên dịch cho một hệ điều hành, các phần thích hợp được chọn cho hệ điều hành đó.

Trong sơ đồ, đối với hệ điều hành Windows, SDL thật sự bao bọc xung quanh DirectX. Phiên bản cũ của SDL sử dụng DirectX 5. Phiên bản ổn định hiện tại của SDL sử dụng DirectX 7. Trong môi trường đồ họa X11, bao gồm Linux, SDL sử dụng Xlib để giao tiếp với hệ thống X11 khi làm việc với đồ họa và sự kiện.

3

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

<b>1.5 Thí dụ bằng ngơn ngữ C</b>

Dưới đây là một chương trình rất đơn giản dùng thư viện SDL. Nó khởi động các hệ thống đa phương tiện, đợi 2 giây rồi sau đó nó đóng thư viện SDL và trở về hệ điều

// Khởi động thư viện SDL

if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

Để download thư viện SDL ta vào Ở mục Development Libraries có các thư viện hổ trợ các nền tảng như Windows, Mac OS X, Linux, iOS và Android.

<b>2.2 Tích hợp thư viện vào Visual Studio</b>

Mở Visual Studio để tạo một Empty Project bằng cách vào File > New > Project, sau đó chọn Empty Project, đặt tên và nhấn OK để tạo Project.

Hình 2.2.1: Minh họa

Tiếp theo, ta tạo hai thư mục Lib và Output để chứa thư viện SDL và file thực thực thi *.exe cùng cấp với file .sln.

Sau đó copy hai thư mục là include và lib download ở trên để vào thư mục Lib vừa tạo và file SDL2.dll nằm trong thư mục lib/x86 vào thư mục Output chứa file thực thi.

Nhấn chuột phải (Right click) vào Project để mở hộp thoại Properties. Chọn C/C+ + > General và mở hộp thoại Additional Include Directories để thêm đường dẫn thới thư mục header của SDL là thư mục include:

5

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

2.2.2: Minh họa

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

Tương tự, chọn Linker/General mở hộp thoại Additional Library Directories để thêm đường dẫn tới các file thư viện của SDL nằm trong thư mục lib:

Hình 2.2.3: Minh họa

7

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

Ở mục Linker chọn Input và mở hộp thoại Additional Dependencies thêm vào SDL2.lib

<b>và SDL2main.lib: </b>

họa

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

Cuối cùng là cấu hình lại thư mục chứa file thực thi bằng cách chọn Configuration Properties/General và mở hộp thoại Output Directory thêm vào đường dẫn như sau:

Lưu ý: Nên để đường dẫn tương đối bằng cách dùng $(SolutionDir) để lấy về đường dẫn tới Solution thay vì là để đường dẫn tuyệt đối vì lý do nếu Project copy sang máy khác có thể khơng chạy được do khơng có thư viện.

Khởi tạo cửa sổ

Để sử dụng thư viện SDL đã thêm ở trên ta include các file header như sau: 1. #include <SDL.h>

Khởi tạo thư viện SDL có cung cấp cho chúng ta một hàm để khởi tạo thư viện. Hàm này có prototype như sau:

1. int SDL_Init(Uint32 flags)

Hàm trả về 0 nếu khởi tạo thành công và ngược lại trả về -1 nếu khởi tạo thất bại. Có thể sử dụng hàm SDL_GetError(); để lấy về thông báo lỗi nếu khởi tạo thất bại.

Tham số của SDL_Init là 1 tham số flags kiểu int, nằm trong những giá trị sau đây hoặc có thể dùng toán tử '|' để kết hợp nhiều lựa chọn.

SDL_INIT_TIMER Timer subsystem

SDL_INIT_VIDEO Video subsystem SDL_INIT_JOYSTICK Joystick subsystem

9

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

SDL_INIT_HAPTIC Haptic (force feedback) subsystem

SDL_INIT_NOPARACHUTE Compatibility; this flag is ignored Mã khởi tạo thư viện SDL:

1. //Initializes the subsystems

Hàm SDL_CreateWindow trả về NULL nếu thất bại, hàm có prototype như sau: 1. SDL_Window* SDL_CreateWindow(const char* title,int x,int y,int w,int h,

Uint32 flags)

Với các tham số lần lượt là tiêu đề cửa cửa sổ, vị trí x, y, chiều rộng, chiều cao của cửa sổ. Tham số cuối cùng nằm trong những giá trị sau hoặc có thể dùng toán tử '|' để kết hợp nhiều lựa chọn. Trong bài viết tối sử dụng SDL_WINDOW_SHOWN để chắc chắn cửa sổ luôn luôn được hiểu thị.

SDL_WINDOW_FULLSCREEN Fullscreen window

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

SDL_WINDOW_FULLSCREEN_DESKTOP Fullscreen window at the current desktop resolution

SDL_WINDOW_RESIZABLE Window can be resized SDL_WINDOW_MINIMIZED Window is minimized SDL_WINDOW_MAXIMIZED Window is maximized

SDL_WINDOW_INPUT_GRABBED Window has grabbed input focus

SDL_WINDOW_ALLOW_HIGHDPI Window should be created in high-DPI mode if supported (>= SDL 2.0.1)

SDL_WINDOW_MOUSE_CAPTURE Window has mouse captured (unrelated to INPUT_GRABBED, >= SDL 2.0.4)

Sau khi cửa sổ được tạo thành cơng thì tơi cho cửa sổ hiển thị 5 giây sau đó tự đóng bằng cách sử dụng hàm SDL_Delay() với tham số truyền vào tính theo đơn vị miliseconds:

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

Kết quả sau khi biên dịch và chạy chương trình:

Hình 2.2.5: Hình minh họa

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

CHƯƠNG 3: GAME BATTLE PLANE

3.1 Ý tưởng

 Thiết kế một trò chơi gần gũi. Thân thiện với người chơi.

 Lấy bối cảnh những năm 1939. Khi chiến tranh thế giới thứ II bắt đầu.  Người chơi sẽ được nhập vai anh phi công trẻ trên chiếc F86 Sabre của

quân đội Mỹ đi giải cứu thế giới . 3.2 Mơ hình

- Sử dụng mơ hình hướng đối tượng

3.3 Common_Funcion

- Đây là cách hàm hoạt động, sử dụng logic cơ bản của tốn học và hình học để xác định va chạm giữa hai hình chữ nhật trong khơng gian 2D.

<b>Hàm LoadImage</b>

SDL_Surface* SDLCommonFunc::LoadImage(std::string file_path) { SDL_Surface* load_image = NULL;

SDL_Surface* optimize_image = NULL; load_image = IMG_Load(file_path.c_str()); if (load_image != NULL) {

13

</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">

optimize_image = SDL_DisplayFormat(load_image); SDL_FreeSurface(load_image);

if (optimize_image != NULL) {

UINT32 color_key = SDL_MapRGB(optimize_image->format, 0, 0xFF, 0xFF); SDL_SetColorKey(optimize_image, SDL_SRCCOLORKEY, color_key);

2. Dùng hàm <b>IMG_Load</b> để tải ảnh từ đường dẫn được chỉ định.

3. Kiểm tra xem ảnh có được tải thành cơng khơng. Nếu có, tiếp tục tối ưu hóa ảnh.

<b>4. SDL_DisplayFormat được sử dụng để chuyển đổi ảnh vừa tải thành định</b>

dạng tối ưu cho việc hiển thị.

5. Giải phóng bộ nhớ của ảnh gốc sau khi tối ưu.

6. Thiết lập màu transparent cho ảnh tối ưu qua việc sử dụng

1. Tạo một <b>SDL_Rect</b> để xác định vị trí áp đặt trên surface đích.

<b>2. SDL_BlitSurface được sử dụng để sao chép surface nguồn (src</b>) lên surface đích (<b>des</b>) tại vị trí xác định.

</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">

<b>Hàm ApplySurfaceClip</b>

void SDLCommonFunc::ApplySurfaceClip(SDL_Surface* src, SDL_Surface* des, SDL_Rect* clip, int x, int y) {

<b>Mục đích: Hàm này tương tự như ApplySurface, nhưng cho phép sao chép một phần cụ</b>

thể của surface nguồn.

<b>Các bước:</b>

1. Tạo một <b>SDL_Rect</b> để xác định vị trí áp đặt.

<b>2. SDL_BlitSurface được sử dụng với tham số clip</b> để chỉ định phần cụ thể của surface nguồn cần được sao chép.

<b>Mục đích: Kiểm tra xem có va chạm giữa hai đối tượng hình chữ nhật (object1 vàobject2) hay khơng.</b>

<b>Các bước:</b>

1. Tính tốn vị trí các cạnh của mỗi đối tượng.

2. Thực hiện nhiều kiểm tra để xác định xem có bất kỳ góc nào của một đối tượng nằm trong đối tượng kia hay không.

15

</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23">

3. Trong trường hợp cụ thể của các đối tượng có cùng kích thước và vị trí, xác định va chạm ngay lập tức.

<b>Hàm CheckCollision</b>

bool SDLCommonFunc::CheckCollision(const SDL_Rect& object1, const SDL_Rect& object2) {

int left_a = object1.x;

int right_a = object1.x + object1.w; int top_a = object1.y;

int bottom_a = object1.y + object1.h; int left_b = object2.x;

int right_b = object2.x + object2.w; int top_b = object2.y;

int bottom_b = object2.y + object2.h; // Kiểm tra va chạm ở đây

Tính tốn vị trí cạnh của mỗi đối tượng

<small></small> <b>left_a right_a top_a bottom_a</b>, , , : Lần lượt là cạnh trái, phải, trên và dưới của

<small></small> <b>left_b right_b top_b bottom_b</b>, , , : Tương tự cho <b>object2</b>. Kiểm tra va chạm

Đoạn code sau đây kiểm tra các trường hợp khác nhau để xác định va chạm:

<b>1. Case 1: Kích thước của đối tượng 1 lớn hơn kích thước của đối tượng 2</b>

Ở đây, code kiểm tra xem có bất kỳ góc nào của đối tượng 2 (<b>object2</b>) nằm trong đối tượng 1 (<b>object1</b>) hay khơng.

<b>2. Case 2: Kích thước của đối tượng 1 nhỏ hơn kích thước của đối tượng 2</b>

Tương tự, nhưng kiểm tra xem có bất kỳ góc nào của đối tượng 1 nằm trong đối tượng 2 hay khơng.

<small></small> <b>Ví dụ: if (left_b > left_a && left_b < right_a) kiểm tra xem cạnh trái của</b>

đối tượng 2 có nằm giữa cạnh trái và phải của đối tượng 1 hay không. <small></small> Tương tự cho cạnh trên, cạnh dưới và cạnh phải của đối tượng 2.

<b>3. Case 3: Kích thước của đối tượng 1 bằng kích thước của đối tượng 2</b>

</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">

Trường hợp này kiểm tra xem hai đối tượng có chính xác cùng vị trí và kích thước hay khơng, tức là hồn tồn trùng khít lên nhau.

<small></small> <b>if (top_a == top_b && right_a == right_b && bottom_a == bottom_b):</b>

Nếu tất cả các cạnh tương ứng giữa hai đối tượng bằng nhau, xác định có va chạm.

Hàm này kết thúc với việc trả về <b>true</b> nếu tìm thấy bất kỳ điểm va chạm nào trong các trường hợp trên, và <b>false</b> nếu khơng có va chạm nào được phát hiện.

3.4 BaseObject

- Lớp BaseObject được thiết kế để quản lý các đối tượng cơ bản trong một ứng dụng đồ họa SDL, bao gồm việc tải hình ảnh, quản lý bộ nhớ và hiển thị các đối tượng trên màn

<b>2. p_object_ = NULL;: Khởi tạo con trỏ p_object_ là NULL. p_object_ là</b>

một con trỏ đến một <b>SDL_Surface</b> được dùng để lưu trữ hình ảnh của đối

</div><span class="text_page_counter">Trang 25</span><div class="page_container" data-page="25">

1. Kiểm tra nếu <b>p_object_</b> không phải là <b>NULL, nghĩa là nó đang giữ một</b>

2. Kiểm tra xem hình ảnh có được tải thành cơng khơng. Nếu <b>p_object_</b> là

<b>NULL</b>, trả về <b>false</b>. Nếu không, trả về <b>true</b>.

2. Sử dụng <b>SDLCommonFunc::ApplySurface</b> để vẽ <b>p_object_</b> lên surface đích (<b>des</b>) tại vị trí xác định bởi <b>rect_.x </b>và <b>rect_.y</b>.

3.5 TextObject

- TextObject được thiết kế để quản lý việc tạo và hiển thị văn bản trong các ứng dụng SDL, bao gồm việc thiết lập font, màu sắc và vị trí của văn bản trên màn hình.

<b>Hàm Tạo (Constructor) TextObject</b>

</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26">

1. rect_.x = 500; rect_.y = 10;: Đặt vị trí xuất phát của văn bản trên màn hình. 2. text_color_: Khởi tạo màu sắc của văn bản là màu trắng (RGB: 255, 255,

</div><span class="text_page_counter">Trang 27</span><div class="page_container" data-page="27">

<b>Các bước:</b>

1. Dựa trên giá trị <b>type</b>, chọn một màu sắc cụ thể cho văn bản.

<b>2. SDL_Color là cấu trúc chứa thông tin màu sắc (RGB).3. text_color_ được cập nhật với màu sắc được chọn.</b>

1. Sử dụng <b>TTF_RenderText_Solid</b> để tạo một <b>SDL_Surface</b> từ văn bản

<b>(str_val_), sử dụng font đã chỉ định và màu sắc (text_color_).</b>

2. Gọi hàm <b>Show</b> để hiển thị surface văn bản trên một surface đích (<b>des).</b>

3.6 ExplosionObject

- ExplosionObject được thiết kế để quản lý việc hiển thị các khung hình của hiệu ứng vụ nổ, cho phép lặp qua các khung hình để tạo hiệu ứng động.

<b>Hàm Tạo (Constructor) ExplosionObject</b>

ExplosionObject::ExplosionObject() {

// Khởi tạo ban đầu }

<b>Mục đích: Khởi tạo một đối tượng ExplosionObject.Hàm Hủy (Destructor) ~ExplosionObject</b>

</div><span class="text_page_counter">Trang 28</span><div class="page_container" data-page="28">

1. Đối với mỗi khung hình, thiết lập kích thước và vị trí của nó trên sprite sheet (giả sử là một hình ảnh chứa tất cả khung hình vụ nổ).

<b>2. EXP_WIDTH và EXP_HEIGHT</b> là kích thước của mỗi khung hình.

<b>3. clip_ là một mảng của SDL_Rect</b>, mỗi phần tử định nghĩa kích thước và vị trí của một khung hình cụ thể trên sprite sheet.

2. Sử dụng <b>SDLCommonFunc::ApplySurfaceClip</b> để vẽ khung hình hiện tại

<b>(clip_[frame_]) lên surface đích (des).</b>

<b>3. frame_ là chỉ số của khung hình hiện tại trong mảng clip_</b>. 3.7 AmoObject

- AmoObject quản lý các đối tượng đạn trong trò chơi, bao gồm việc khởi tạo, xử lý chuyển động, và các sự kiện đầu vào liên quan đến đạn.

<b>Hàm Tạo (Constructor) AmoObject</b>

</div><span class="text_page_counter">Trang 29</span><div class="page_container" data-page="29">

1. Khởi tạo vị trí của đạn (<b>rect_.x</b> và <b>rect_.y</b>) là <b>(0, 0)</b>.

2. Thiết lập giá trị ban đầu cho tốc độ theo trục x và y (<b>x_val_ y_val_</b>, ) là 0. 3. Khởi tạo <b>is_move_</b> là <b>false</b>, có lẽ để chỉ ra rằng đạn chưa được di chuyển. 4. Thiết lập loại đạn (<b>amo_type_</b>) là <b>NONE</b> (có thể là trạng thái mặc định

hoặc khơng loại đạn cụ thể nào).

<b>Hàm Hủy (Destructor) ~AmoObject</b>

<b>1. Cập nhật vị trí của đạn dựa trên tốc độ (x_val_).</b>

2. Kiểm tra xem đạn có vượt qua ranh giới xác định (<b>x_border</b>) hay khơng. Nếu có, đặt <b>is_move_</b> là <b>false</b>, có lẽ để dừng chuyển động của đạn.

<b>Hàm HandleMoveRightToLeft</b>

</div><span class="text_page_counter">Trang 30</span><div class="page_container" data-page="30">

1. Giảm giá trị <b>rect_.x</b> dựa trên tốc độ (<b>x_val_</b>) để di chuyển đạn.

2. Kiểm tra xem đạn có ra khỏi màn hình ở bên trái hay khơng. Nếu có, dừng

<b>Mục đích: Xử lý sự kiện đầu vào. Trong trường hợp này, hàm khơng thực hiện gì cả và</b>

có thể được mở rộng trong tương lai. 3.8 MainObject

#ifndef MAIN_OBJECT_H_ #define MAIN_OBJECT_H_

- Kiểm tra xem macro " MAIN_OBJECT_H_ “đã được định nghĩa trước đó hay chưa. Nếu chưa được định nghĩa đoạn mã bên trong được thực hiện .

- Nếu macro “MAIN_OBJECT_H_” chưa được định nghĩa, dòng này sẽ định nghĩa nó. Điều này ngăn chặn việc định nghĩa lại nếu tệp tin được bao gồm nhiều lần .

23

</div><span class="text_page_counter">Trang 31</span><div class="page_container" data-page="31">

#include " Comom_Funcion.h" #include"BaseObject.h" #include "AmoObject.h" #include<vector>

- Các dòng này để đưa nội dung của các tệp tin “Comom_Funcion.h”, ”BaseObject.h”, ”Amoobbject.h”. Điều này giúp sử dụng các khai báo và định nghĩa từ tệp tin khác trong mã nguồn, và đưa vào mã nguồn c++ tệp tin tiêu chuẩn của thư viện c++ cho lớp vector. Cung cấp các khai báo cần thiết để sử dụng lớp mẫu vector.

#define WIDTH_MAIN_OBJECT 77 #define HEIGHT_MAIN_OBJECT 52

- Hai dòng này dùng để đặt giá trị hằng số cho chiều dài và chiều rộng của máy bay chính với chiều rộng bằng 77 và chiều cao bằng 52.

class MainObject : public BaseObject

</div><span class="text_page_counter">Trang 32</span><div class="page_container" data-page="32">

<b>Các phương thức :</b>

<b>MainObject():Đây là hàm constructor, được gọi khi một đối tượng của lớp `MainObject`</b>

được tạo ra. Trong hàm này, có thể có các cài đặt khởi tạo như đặt giá trị mặc định cho các biến thành viên hoặc cấp phát bộ nhớ.

<b>~MainObject(): Đây là hàm destructor, được gọi khi một đối tượng của lớp</b>

`MainObject` bị hủy. Trong hàm này, bạn có thể thực hiện các cơng việc giải phóng bộ nhớ hoặc tài nguyên khác.

void HandleInputAction(SDL_Event events):

Hàm này xử lý sự kiện đầu vào,là sự kiện từ bàn phím và chuột.Quản lý các hành động liên quan đến đầu vào từ người chơi.

void HandleMove();

Hàm này quản lý việc di chuyển của đối tượng `MainObject`.

void SetAmoList(std::vector<AmoObject*> amo_list) { p_amo_list_ = amo_list; } SetAmoList: Thiết lập danh sách đối tượng đạn (`amo_list`) cho đối tượng `MainObject`. Đây có thể là một phương thức hữu ích khi cần cập nhật danh sách đạn từ bên ngoài.

std::vector<AmoObject*> GetAmoList() const { return p_amo_list_; }

GetAmoList: Trả về danh sách đối tượng đạn hiện tại của đối tượng `MainObject`. Phương thức này có thể được sử dụng để lấy thông tin về đối tượng đạn từ bên ngoài.

void MakeAmo(SDL_Surface*des);

Hàm này quản lý việc tạo và hiển thị các đối tượng đạn. Nó duyệt qua danh sách đạn và gọi các phương thức `HandleMove` và `Show`(ở BaseObject.h) của mỗi đối tượng đạn.

25

</div><span class="text_page_counter">Trang 33</span><div class="page_container" data-page="33">

void ReMoveAmo(const int& idx);

Hàm này quản lý việc xóa đối tượng đạn tại vị trí chỉ định `idx` khỏi danh sách đạn. Có thể giả sử rằng `idx` là chỉ số của đối tượng đạn cần xóa.

Phần `private` của lớp `MainObject` bao gồm:

- `int x_val_;` và `int y_val_;`: Lưu trữ tốc độ di chuyển theo chiều ngang và chiều dọc của đối tượng `MainObject`.

- `std::vector<AmoObject*> p_amo_list_;`: Vector chứa con trỏ đến các đối tượng đạn (`AmoObject`) mà `MainObject` tạo ra hoặc quản lý.

</div><span class="text_page_counter">Trang 34</span><div class="page_container" data-page="34">

- Trong hàm constructor của lớp `MainObject`, thực hiện các bước để khởi tạo một đối tượng của lớp này. Đây là giải thích chi tiết:

<b>Vị trí và Kích thước (“rect_”):</b>

 “rect_” là một biến kiểu “SDL_Rect ”

 Trong constructor, bạn đặt giá trị cho các thành phần của “rect_”, bao gồm “x” , “y”, “w” (chiều rộng), và “h” (chiều cao)

 Trong trường hợp này, “x” và “y” được đặt là 0, và “w” và “h” được đặt dựa trên hằng số “WIDTH_MAIN_OBJECT” và “HEIGHT_MAIN_OBJECT”.

<b>Tốc độ di chuyển (“x_val_” và “y_val_”):</b>

 “x_val_” và “y_val_” là biến đại diện cho tốc độ di chuyển của đối tượng theo hai chiều x và y.

 Trong constructor, khởi tạo tốc độ ban đầu của đối tượng là 0, ngụ ý rằng đối tượng không di chuyển khi mới được tạo.

- Như vậy, khi tạo một đối tượng `MainObject` bằng cách gọi `MainObject mainObj;`, đối tượng này sẽ được khởi tạo với vị trí (0,0) và kích thước dựa trên các hằng số chiều dài và chiều rộng đã được định nghĩa trước đó, và có tốc độ ban đầu là 0.

void HandleInputAction(SDL_Event events);

</div><span class="text_page_counter">Trang 35</span><div class="page_container" data-page="35">

case SDLK_UP: y_val_ += SPEED_MAIN_OBJECT; break; case SDLK_DOWN: y_val_ = SPEED_MAIN_OBJECT; break; case SDLK_LEFT: x_val_ += SPEED_MAIN_OBJECT; break; case SDLK_RIGHT: x_val_ = SPEED_MAIN_OBJECT; break;

</div><span class="text_page_counter">Trang 36</span><div class="page_container" data-page="36">

- Đoạn mã đưa ra là một phần của cấu trúc `switch` trong hàm `HandleInputAction`, chịu trách nhiệm xử lý sự kiện khi một phím mũi tên hoặc chuột được nhấn xuống . - Dưới đây là giải thích chi tiết về cách đoạn mã này hoạt động:

</div><span class="text_page_counter">Trang 37</span><div class="page_container" data-page="37">

“switch (events.key.keysym.sym): Đây là cấu trúc `switch` sử dụng để kiểm tra giá trị của `events.key.keysym.sym`, tức là mã phím mà đã nhấn xuống.

 case SDLK_UP:`:

Nếu mã phím là `SDLK_UP` (mũi tên lên), đoạn mã bên trong `case` sẽ được thực hiện.

`y_val_ = SPEED_MAIN_OBJECT;`: Đây là hành động thực hiện khi mũi tên lên được nhấn xuống. Nó giảm giá trị của `y_val_` đi một lượng bằng `SPEED_MAIN_OBJECT`, có thể hiểu là di chuyển đối tượng lên trên màn hình.  `case SDLK_DOWN:`:

Nếu mã phím là `SDLK_DOWN` (mũi tên xuống), đoạn mã bên trong `case` sẽ được thực hiện.

`y_val_ += SPEED_MAIN_OBJECT;`: Hành động này là tăng giá trị của `y_val_` lên một lượng bằng `SPEED_MAIN_OBJECT`, di chuyển đối tượng xuống dưới màn hình.

 `case SDLK_RIGHT:`:

 Nếu mã phím là `SDLK_RIGHT` (mũi tên phải), đoạn mã bên trong `case` sẽ được thực hiện.

`x_val_ += SPEED_MAIN_OBJECT`: Hành động này tăng giá trị của `x_val_` lên một lượng bằng `SPEED_MAIN_OBJECT`, di chuyển đối tượng sang phải.  `case SDLK_LEFT:`:

Nếu mã phím là `SDLK_LEFT` (mũi tên trái), đoạn mã bên trong `case` sẽ được thực hiện.

</div><span class="text_page_counter">Trang 38</span><div class="page_container" data-page="38">

`x_val_ = SPEED_MAIN_OBJECT;`: Hành động này giảm giá trị của `x_val_` đi một lượng bằng `SPEED_MAIN_OBJECT`, di chuyển đối tượng sang trái.  `default:`:

Nếu mã phím khơng phù hợp với bất kỳ trường hợp nào (`SDLK_UP`, `SDLK_DOWN`, `SDLK_RIGHT`, `SDLK_LEFT`), thì đoạn mã trong `default` sẽ được thực hiện. Trong trường hợp này, nó khơng làm gì cả (`break;`). - Cuối cùng , đoạn mã này xử lý sự kiện khi một trong bốn phím mũi tên được nhấn xuống và điều chỉnh tốc độ di chuyển của đối tượng `MainObject` tương ứng theo hướng

case SDLK_UP: y_val_ += SPEED_MAIN_OBJECT; break; case SDLK_DOWN: y_val_ = SPEED_MAIN_OBJECT; break; case SDLK_LEFT: x_val_ += SPEED_MAIN_OBJECT; break; case SDLK_RIGHT: x_val_ = SPEED_MAIN_OBJECT; break; }

- Sau khi nhấn phím xuống thì phím sẽ nhả phím ra .

- Những hàm này có tác dụng cập nhật lại giá trị của biến x_val_ , y_val_ .

- Nếu khơng có đoạn mã này thì máy bay sẽ tiếp tục di chuyển trên màn hình mặc dù đã ngừng nhấn phím.

else if (events.type==SDL_MOUSEBUTTONDOWN){ 31

</div><span class="text_page_counter">Trang 39</span><div class="page_container" data-page="39">

AmoObject*p_amo = new AmoObject();

- Phần mã này xử lý sự kiện khi một nút chuột được nhấn xuống (`SDL_MOUSEBUTTONDOWN`) và khi nút chuột được nhả ra (`SDL_MOUSEBUTTONUP`). Dưới đây là giải thích chi tiết:

- Kiểm tra xem nút chuột nào được nhấn xuống(SDL_BUTTON_LEFT hoặc SDL_BUTTON_RIGHT)

- Trong đoạn mã này, đang thực hiện một số cài đặt cho đối tượng đạn (`p_amo`) sau khi nó được tạo ra. Dưới đây là giải thích chi tiết:

</div><span class="text_page_counter">Trang 40</span><div class="page_container" data-page="40">

p_amo>LoadImg(g_name_bullet_main_laser); p_amo>set_type(AmoObject::LASER);

 p_amo>SetWidthHeight(WIDTH_AMO_LASER, HEIGHT_AMO_LASER);`: + `SetWidthHeight` là một phương thức (hàm thành viên) của lớp `AmoObject`. + Phương thức này dùng để đặt chiều rộng và chiều cao cho đối tượng đạn (`p_amo`). nó được sử dụng để đặt chiều rộng là`WIDTH_AMO_LASER` và chiều cao là `HEIGHT_AMO_LASER` cho đối tượng đạn.

 `p_amo>LoadImg(g_name_bullet_main_laser);`:

<i>+ LoadImg là một phương thức (hàm thành viên) của lớp `BaseObject’</i>

+ Phương thức này được thiết kế để tải hình ảnh từ một đường dẫn cụ thể và thiết lập nó cho đối tượng đạn. Trong trường hợp này, nó được sử dụng để tải hình ảnh đạn từ biến `g_name_bullet_main_laser` và thiết lập nó cho đối tượng đạn.

 `p_amo>set_type(AmoObject::LASER);`:

+ `set_type` là một phương thức (hàm thành viên) của lớp `AmoObject`. + Phương thức này được sử dụng để đặt loại của đối tượng đạn.

+ Trong trường hợp này, nó được sử dụng để đặt loại là `AmoObject::LASER`. + `g_name_bullet_main_laser` được định nghĩa trước đó trong “Comom_Funcion.h”

SDL_MOUSEBUTTONUP) {

- Khi Nút Chuột Được Nhả Ra (`SDL_MOUSEBUTTONUP`):

- Trong trường hợp này, phần xử lý khi nút chuột được nhả ra là trống. Không thực hiện gì cả.

33

</div>

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×