1. Trang chủ
  2. » Luận Văn - Báo Cáo

Ứng dụng trí tuệ nhân tạo trong xây dựng GAME

138 167 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 138
Dung lượng 2,74 MB

Nội dung

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN KHOA CÔNG NGHỆ THÔNG TIN BỘ MÔN CÔNG NGHỆ TRI THỨC NGUYỄN THANH PHONG ỨNG DỤNG TRÍ TUỆ NHÂN TẠO TRONG XÂY DỰNG GAME KHÓA LUẬN CỬ NHÂN TIN HỌC TP HCM, 2005 TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN KHOA CÔNG NGHỆ THÔNG TIN BỘ MÔN CÔNG NGHỆ TRI THỨC NGUYỄN THANH PHONG - 0112191 ỨNG DỤNG TRÍ TUỆ NHÂN TẠO TRONG XÂY DỰNG GAME KHÓA LUẬN CỬ NHÂN TIN HỌC GIÁO VIÊN HƯỚNG DẪN TH.S BÙI TIẾN LÊN NIÊN KHÓA 2001-2005 NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN LỜI CẢM ƠN Em khơng thể hồn thành luận văn khơng có hướng dẫn bảo tận tình thầy Bùi Tiến Lên Em xin chân thành cảm ơn bảo thầy Em cảm ơn thầy cô khoa Công nghệ Thông tin trường Đại học Khoa học Tự nhiên Tp.Hồ Chí Minh tận tình giảng dạy, truyền đạt kiến thức quý báu tạo điều kiện cho em hoàn thành luận văn Xin chân thành cảm ơn giúp đỡ, động viên của tất bạn trình thực luận văn Em muốn cảm ơn người thân gia đình động viên, giúp đỡ tạo điều kiện để hoàn thành luận văn Mặc dù cố gắng hoàn thành luận văn với tất nổ lực thân, luận văn chắn khơng tránh khỏi thiếu xót Em mong nhận thông cảm bảo tận tình thầy bạn Tp.HCM 7/2005 Sinh viên thực Nguyễn Thanh Phong Mục lục MỤC LỤC Chương GIỚI THIỆU 1 Lý chọn đề tài 1.1 Các ngôn ngữ lập trình game 1.2 Phân loại game 1.2.1 Game hành động 1.2.2 Game nhập vai 1.2.3 Game đua xe Mục đích đề tài Chương CÁC THUẬT TỐN TÌM ĐƯỜNG ĐI Mơ tả thủ tục tìm kiếm rộng, sâu sâu dần T Thuật giải tìm đường có giá thành nhỏ A 3.Tìm kiếm với tri thức bổ sung 4.Tìm đường đồ thị tổng quát Chương GAME ENGINE 12 I WED editor: 13 Những khái niệm 13 a Giao diện người dùng 13 b Thanh Icon 15 c Mode 15 d Thiết kế khung cảnh 14 e Hướng đối tượng 16 f Cửa sổ dự án 18 Các lệnh WED 19 2.1.Các lệnh thực đơn 19 2.1.1 Thực đơn file 20 2.1.2 Thực đơn edit: 24 i Mục lục 2.1.3 Thực đơn mode 25 2.1.4 Thực đơn Object 29 2.1.5 Thực đơn Texture 32 2.1.5 Thực đơn View 33 2.1.6 Thực đơn help 34 2.2 Giao diện sử dụng 35 2.3 Cửa sổ dự án 36 2.3.1 Tab đối tượng 36 2.3.2 Tab Views 38 2.3.3 Tab Texture 38 2.3.4 Tab Resource 41 2.4 Cửa sổ Bookmark 41 2.5 Thuộc tính khối 41 2.6 Thuộc tính thực thể 43 Thiết kế map 45 Thực thể 46 4.1 Thực thể mơ hình 46 4.2 Thực thể Sprite 47 4.3 Thực thể Map 47 4.4 Thực thể Địa hình (terrain) 48 4.5 Bóng 48 4.5 Thuộc tính suốt 49 II CÁCH SỬ DỤNG MED 50 Trình thiết kế 50 1.1 Các thực đơn 50 1.1.1 Thực đơn File 50 1.1.2 Thực đơn Edit 53 1.1.3 Thực đơn View 55 ii Mục lục 1.1.4 Thực đơn Options 56 1.1.5 Thực đơn Help 57 1.2 Toolbars 58 1.2.1 Toolbar File 58 1.2.2 Toolbar Edit 58 1.2.3 Toolbar Select 60 1.2.4 Toolbar Mesh 60 1.2.5 Toolbar đối tượng sở 61 1.2.6 Toolbar view 62 1.2.7 Toolbar Frame 63 1.2.8 Thanh trạng thái 64 2.Trình thiết kế Skin 64 2.1 Các thực đơn 65 2.1.1 Thực đơn File 65 2.1.2 Thực đơn Edit 66 2.1.3 Thực đơn View 67 2.2 Các Toolbar 68 2.2.1 Toolbar Skin 68 2.2.2 Toolbar Edit 68 2.2.3 Toolbar Paint 69 III SED, C-Script editor 70 Giao diện sử dụng 71 Soạn thảo 72 2.1 Lệnh Insert 72 2.2 Dòng thích 72 2.3 Nhảy đến đoạn mã 72 2.4 Sử dụng danh sách thành phần 73 2.5 Kiểm tra cú pháp 73 Mục lục 2.6 Soạn thảo thông minh 73 Cấu hình 74 Thực đơn 75 4.1 Thực đơn File 75 4.2 Thực đơn Edit 76 4.3 Thực đơn Options 76 4.4 Thực đơn Tools 77 4.5 Thực đơn Debug 77 IV Giao tiếp với DLL 79 Bắt đầu với SDK 79 Sử dụng đối tượng C-Script DLL 82 Sử dụng hàm API 83 Lập trình game C++ 87 Chương CÀI ĐẶT 89 I Người chơi 89 Chuyển động vật lý 89 a Gia tốc, quán tính lực ma sát 89 b Rơi từ xuống 93 Cách di chuyển camera theo người chơi 97 2.1 Tầm nhìn người thứ 97 2.2 Quay tự tầm nhìn người thứ 101 2.3 Cách camera tránh chạm vào tường 106 II Xe tự động 108 Tránh chướng ngại vật đường 108 Chương 1: Giới thiệu Hàm update_views, cập nhật sau trạng thái thay đổi tọa độ x, y, z camera game Ở đây, thay đổi đến tọa độ người chơi, làm cho camera ln ln bên người chơi Đoạn mã chưa hồn hảo Ví dụ, camera đặt điểm trung tâm mơ hình người chơi, khơng đầu, ngun nhân làm cho khung nhìn đặt gần đất Như chưa thể nhìn lên xuống Chúng ta định nghĩa thêm biến đầu đoạn mã var eye_height = 20; thay 1st_person.z = player.z; viết lại là: 1st_person.z = player.z + eye_height; Nó điều chỉnh camera lên cao 20 quant Nếu giá trị chưa tốt, điều chỉnh lại lúc chơi game Bây giờ, muốn người chơi nhìn lên nhìn xuống Để thực được, cần biến sau: var tilt_1st = 0; var cam_turnspeed = 2; var max_tilt_1st = 40; thay đổi dòng mã: 1st_person.tilt = player.tilt; thành: 1st_person.tilt = player.tilt + tilt_1st; thêm hàm sau: 99 function look_up() { if (tilt_1st < max_tilt_1st) { tilt_1st += cam_turnspeed; } } function look_down() { if (tilt_1st > -max_tilt_1st) { tilt_1st -= cam_turnspeed; } } Những hàm phải gọi lúc chơi game Ví dụ, định nghĩa này: on_pgup = look_up; on_pgdn = look_down; Hãy lưu lại chạy thử Khơng tồi, chưa có tác dụng mong muốn Nếu ấn phím giữ nó, khung nhìn di chuyển khơng thay đổi Chúng ta phải ấn nhiều lần để khung nhìn di chuyển điều chậm chạp Chúng ta thay đổi nào? Thay đổi định nghĩa on_pageup on_pagedown sau: on_pgup = handle_pageup; on_pgdn = handle_pagedown; Và định nghĩa hàm sau: 100 function handle_pageup() { while (key_pgup) { look_up(); wait(1); } } function handle_pagedown() { while (key_pgdn) { look_down(); wait(1); } } Theo cách hàm gọi trạng thái phím ấn Nếu camera quay nhanh chậm, điều chỉnh giá trị cam_turnspeed Nếu phạm vi khung nhìn nhỏ để người chơi thay đổi góc nhìn nhiều hơn, thay đổi biến max_tilt_1st Giá trị 90 có nghĩa là: người chơi nhìn thẳng lên xuống Giá trị 90 tức người chơi nhìn ngược sau 2.2 Quay tự tầm nhìn người thứ Bây muốn tạo khung nhìn quay người thứ Có hai cách thực hiện: cách thứ tạo camera bên ngồi người chơi khơng quay, đi, ln ln đối diện với từ hướng Cách thứ tạo camera rẽ người chơi rẽ, nằm đằng sau người chơi (hoặc trước, bên cạnh …) Chúng ta làm cho camera rẽ phóng to thu nho tự Để bắt đầu, tạo khung nhìn người thứ ln ln đối mặt với 101 người chơi từ hướng thay đổi muốn khung nhìn quay với thực thể Định nghĩa khung nhìn thứ sau: view 3rd_person { layer = 1; pos_x = 0; pos_y = 0; } Thêm dòng sau vào bên hàm "init_cameras": 102 3rd_person.size_x = screen_size.x; 3rd_person.size_y = screen_size.y; Chúng ta chưa làm cho nhìn thấy Thay vì, thay đổi camera lúc chơi game Chúng ta định nghĩa thủ tục chuyển đổi camera bây giờ: var cam_mode = 0; // cho người thứ nhất, cho người thứ function toggle_cams() { if (cam_mode == 0) { // Thay đổi đến người thứ 1st_person.visible = off; 3rd_person.visible = on; cam_mode = 1; } else { // thay đổi đến người thứ 3rd_person.visible = off; 1st_person.visible = on; cam_mode = 0; } } on f8 = toggle cams; 103 Như vậy, cách nhấn f8 ta chuyển đổi khung nhìn Tuy nhiên, chưa có tác dụng, tọa độ x, y, z người thứ chưa định nghĩa Chúng ta định nghĩa cách thay đổi hàm "update_views" Nhưng định nghĩa camera quay quanh người chơi nào? Nó nên nằm mặt phẳng, giá trị z giống Nhưng tính giá trị x y nào? Chúng ta cần chút toán học Tưởng tượng người chơi quan sát từ phía Cách tốt lấy tờ báo đặt điểm nó, nơi đó, để vị trí người chơi thấy từ phía Vẽ đường tròn xung quanh điểm Đây vòng tròn mà camera di chuyển Vòng tròn có bán kính Giả sử vòng tròn có điểm điểm gốc, xác định điểm P vòng tròn cung đường thẳng vẽ từ gốc đến tâm từ P đến tâm đường tròn Như vậy, có khoảng cách đến người chơi (bán kính đường tròn) góc mặt phẳng vị trí camera xác định var dist_planar = 300; // khoảng cách đến người chơi var cam_angle = 0; function update_views() { if (cam_mode == 0) { 1st_person.x = player.x; 1st_person.y = player.y; 1st_person.z = player.z + eye_height; 1st_person.pan = player.pan; 1st_person.roll = player.roll; 1st_person.tilt = player.tilt + tilt_1st; } else { 3rd_person.x = player.x - cos (cam_angle) * dist_planar; 3rd_person.y = player.y - sin (cam_angle) * dist_planar; 3rd_person.z = player.z; 3rd_person.pan = cam_angle; 3rd_person.roll = 0; 3rd_person.tilt = 0; } } Lưu mã nguồn chạy Chọn f8 để chuyển đổi khung nhìn Nên xem người chơi khung nhìn người thứ Khi di chuyển, camera luôn di chuyển khoảng cách với người chơi, không thay đổi vị trí người chơi rẽ Nếu thay đổi giá trị biến dist_planar camera tiến lại gần lùi xa Nếu thay đổi góc cam_angle quay xung quanh người chơi, ln ln đối diện với người chơi Tuy nhiên vấn đề người chơi gần tường Camera thường xuyên xuyên qua tường, chướng ngại vật chắn tầm nhìn người chơi Chúng ta giải vấn đề phần sau Bây thay đổi mã nguồn ít…chúng ta muốn di chuyển camera lên phía đối diện với người chơi Và cần phải giữ khoảng cách đến người chơi, di chuyển khơng theo đường tròn mà theo hình cầu Chúng ta thực điều nào? Hãy tưởng tượng người chơi nhìn từ bên cạnh Nếu camera nằm mặt phẳng XY người chơi Hãy vẽ đường thẳng từ đến người chơi, nhận góc mặt phẳng XY đường Góc xác định xác vị trí người chơi Hình sau biểu diễn vị trí camera trường hợp này: Lúc cần chỉnh lại mã nguồn sau: var dist_total = 300; // thay đổi giá trị để tiến lại gần xa thực thể var tilt_3rd = 0; function update_views() { else { dist_planar = cos (tilt_3rd) * dist_total; 3rd_person.x = player.x - cos (cam_angle) * dist_planar; 3rd_person.y = player.y - sin (cam_angle) * dist_planar; 3rd_person.z = player.z + sin (tilt_3rd) * dist_total; 3rd_person.pan = cam_angle; 3rd_person.roll = 0; 3rd_person.tilt = - tilt_3rd; } Bằng cách thay đổi giá trị biến tilt_3rd, cam_angle, dist_total, di chuyển camera tự xung quanh người chơi Nó di chuyển mặt cầu với bán kính thay đổi cách thay đổi giá trị biến 2.3 Cách camera tránh chạm vào tường Ý tưởng gửi tia từ người chơi đến vị trí camera, thấy có chướng ngại vật nằm tia Khi đó, khoảng cách người chơi camera cần thay đổi… khoảng cách người chơi chướng ngại vật Thêm dòng sau vào hàm update_views: function update_views() { 3rd_person.roll = 0; 3rd_person.tilt = - tilt_3rd; validate_view(); } } hàm định nghĩa sau: var dist_traced; function validate_view() { my = player; trace_mode = ignore_me + ignore_passable; dist_traced = trace (player.x, 3rd_person.x); if (dist_traced == 0) { return; } // khơng chạm vào chướng ngại vật if (dist_traced < dist_total) { dist_traced -= 5; // Di chuyển tường dist_planar = cos (tilt_3rd) * dist_traced; 3rd_person.x = player.x - cos (cam_angle) * dist_planar; 3rd_person.y = player.y - sin (cam_angle) * dist_planar; 3rd_person.z = player.z + sin (tilt_3rd) * dist_traced; } } ị sử dụng khoảng cách đến người chơi, khoảng cách từ người chơi đến chướng ngại vật Nó thay đổi từ từ để ngăn chặn việc camera nằm bên tường Để đặt camera sau người chơi, thay đổi dòng: 3rd_person.x = player.x - cos (cam_angle) * dist_planar; Hàm xác =định v trí -của cách hồn tồn giống cách 3rd_person.y player.y sin camera (cam_angle) * dist_planar; trên, thành: 3rd_person.x = player.x - cos (cam_angle + player.pan) * dist_planar; 3rd_person.y = player.y - sin (cam_angle + player.pan) * dist_planar; cần thêm góc quay thực thể (player.pan) vào cam_angle II Xe tự động Tránh chướng ngại vật đường Giả sử người chơi muốn di chuyển từ điểm bắt đầu đến điểm kết thúc Tất nhiên khơng có chướng ngại vật hết đơn giản, cần cho di chuyển theo đường thẳng qua điểm bắt đầu điểm kết thúc Ở đặc biệt ý đến trường hợp: điểm bắt đầu kết thúc có chướng ngại vật: xe khác chướng ngại vật tĩnh Hình Ví dụ đây: để người chơi di chuyển đến vị trí ta nhấp chuột đến vị trí cần người chơi cần đến: Lúc điểm bắt đầu vị trí người chơi, điểm kết thúc vị trí nút chuột Có hướng khác xung quanh người chơi, hướng khác ta xem nút Một nút có độ rộng khác tùy thuộc vào muốn chọn Hình Nếu nút chứa chướng ngại vật ta xem nút nút khơng có giá trị, khơng chọn lúc tìm đường đến đích kt v v v v bđ v V Hình Giả sử từ nút bắt đầu bđ, muốn tìm đường đi đến nút cần đến (nút kt) Và nút v chướng ngại vật: Ở đây, nút trung gian (như nút 0, … 7), chứa giá trị chi phí đường (waycost), chi phí tồn nút (nodecost) Mỗi nút có nút cha, nút cha có nút (trong trường hợp bình thường), nằm xung quanh nút Giả sử nút có chi phí đường waycost, nút có waycostcon=waycostcha+1; Trong nút bắt đầu khơng có nút cha ta cho waycost Ở ta sử dụng heuristic, khoảng cách từ nút đến nút đích (nút kt), ta kí hiệu goal_dist, chi phí nút là: nodecost=waycost+goal_dist Như thuật toán gồm bước sau: Bước 1: Mở nút bắt đầu Bước 2: - Chọn danh sách nút mở nút có nodecost nhỏ - Nếu khơng nút kết thúc thuật toán Bước 3: - Nếu nút nút đích thuật tốn kết thúc - Nếu khơng thì: + Tạo nút từ nút này, với điều kiện nút nút chứa chướng ngại vật + Đóng nút lại mở tất nút tạo Bước 4: Với thuật tốn vậy, hình để tìm đường từ điểm bắt đầu (bd) đến điểm kết thúc (kt), ta qua đường qua nút 1, 2, 3, 4, TÀI LIỆU THAM KHẢO [1] Hướng dẫn có sẵn chương trình 3D Game Studio [2] Các tài liệu hướng dẫn trang web: www.3DGameStudio.com [3] Bạch Hưng Khang, Hoàng Kiếm, Trí tuệ nhân tạo, phương pháp ứng dụng, Nhà xuất Khoa học Kỹ thuật Hà Nội - 1999 ... NGHỆ THÔNG TIN BỘ MÔN CÔNG NGHỆ TRI THỨC NGUYỄN THANH PHONG - 0112191 ỨNG DỤNG TRÍ TUỆ NHÂN TẠO TRONG XÂY DỰNG GAME KHÓA LUẬN CỬ NHÂN TIN HỌC GIÁO VIÊN HƯỚNG DẪN TH.S BÙI TIẾN LÊN NIÊN KHÓA 2001-2005... thích hợp với game nhỏ Tại lại sử dụng ngôn ngữ 3D Game Studio để viết game? 3D Game Studio chương trình chuyên dụng dùng để tạo game 3D Với hàng trăm game phát hành, 3D Game Studio xứng đáng ngơn... loại game phong phú đa dạng, xét thể loại game thường thấy là: 1.2.1 Game hành động Game hành động xuất nhiều game 3D game 2D Game loại có đặc điểm chúng tính co giật game, game bắn súng Game

Ngày đăng: 23/05/2019, 08:53

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w