Được rồi,
giờ bạn đã biết về đối tượng Audio
và cách hoạt động, đã đến lúc thêm âm thanh vào trò chơi của
chúng ta. Có 2 nơi chúng ta muốn chơi hiệu ứng âm thanh: khi xe tăng bắn
và khi xe tăng bị phá hủy. Chúng ta sẽ chơi tệp âm thanh SFX1 cho cả 2
sự kiện; chỉnh sửa chúng như sau:
Chúng ta sẽ
chỉnh sửa sự kiện nơi xe tăng của người chơi và kẻ địch bị phá hủy:
Ở đây, ta sẽ
viết code cho sự kiện tankBase bị
phá hủy:
Nếu bạn test
game bây giờ, bạn sẽ nghe thấy âm thanh khi xe tăng bắn và khi xe tăng bị
phá hủy, nhưng hình như trò chơi vẫn hơi yên tĩnh. Có lẽ ta cần thêm
một chút nhạc, khi chơi nhạc, hãy chắc chắn rằng bạn chơi nó trên sự
kiện trigger, hoặc ko bạn có thể vô tình bắt đầu cùng một bản nhạc
nhiều lần, nó sẽ làm âm thanh bị loạn xị ngậu.
Chính vì
vậy, chúng ta sẽ chơi nhạc nền ở đầu cấp độ. Chúng ta sẽ sử dụng MattOglseby-3 từ tệp Music và nhập nó vào project của
ta, giống như SFX1 (hãy chắc chắn rằng bạn ko nhập tệp .ogg hoặc .m4a), và chơi nó ở đầu layout:
Test game bây
giờ, bạn có cảm thấy thêm nhạc nền vào khiến trò chơi thú vị và
hấp dẫn hơn ko ^^.
Bài 3. Khiến kẻ địch thông minh hơn
Chúng ta đã
tạo ra kẻ địch ở ví dụ trước, những kẻ địch này đang rơi xuống màn
hình và bắn, nhưng bây giờ ta sẽ làm cho chúng khôn hơn. Chủ đề về AI
là một quá trình phức tạp, và rất khó để đề cập trong chương này.
Vì thế, thay vì những lí thuyết về AI, tôi sẽ trình bay cho bạn xem
bằng kĩ thuật, tuy ko chi tiết nhưng cx dễ hiểu hơn.
1. Cho phép kẻ địch đi tuần
Điều đầu
tiên ta muốn làm với kẻ thù là cho chúng khả năng di chuyển xung quanh
màn hình, giống như đơn vị của chúng ta. Để làm điều này, ta cần
thêm hành vi Timer cho đối tượng enemyBase để nó có thể làm điều
gì đó liên tục. Chúng ta cũng cần thêm một biến thực thể cho nó để
ghi lại trạng thái của kẻ thù; chúng ta ko muốn chúng cứ di chuyển khi
đang bắn mục tiêu của ta. Đặt tên biến thực thể này là patrolling và loại Boolean; đừng quên
thay đổi giá trị ban đầu thành true.
Chúng ta
muốn kẻ địch đi tuần mỗi vài giây, nhưng để trông nó thực tế hơn,
chúng ta sẽ ngẫu nhiên hóa khoảng thời gian mà đối tượng timer kích hoạt để xe tăng của kẻ
địch ko di chuyển cùng lúc đó. Chúng ta chỉ kích hoạt timer này 1
lần bởi vì trong khoảng thời gian tuần tra tiếp theo cũng được chọn
ngẫu nhiên và có thể ko giống cái này.
Khi timer
được kích hoạt, enemyBase sẽ sẽ
tìm một điểm trên màn hình; vị trí này ngẫu nhiên để kẻ địch đi
tới những nơi khác nhau. Tìm một điểm bất kì trên layout nghãi là ta
muốn giá trị ngẫu nhiên giữa 0
và chiều rộng của layout cho điểm x
và giá trị giữa 0 và chiều dài
của layout cho điểm y. May thay, C2
có một biểu thức cho điều này: layoutWitdth
và layoutHeight. Ta có thể sử dụng
chúng để lấy giá trị chiều dài và chiều rộng của layout:
Sau đó, kẻ
địch sẽ tìm vị trí đi tuần của mình và con đường để tới đó, chúng
chỉ cần đi qua nó.
Sau khi tới
vị trí đó, kẻ địch sẽ bắt đầu đi tuần, chúng ta làm điều này tương
tự với cách chúng ta bắt đầu đi tuần ở đầu layout:
Chúng ta
cũng cần xem xét tình huống khi kẻ địch gặp đơn vị của người chơi
khi đang đi tuần. Chúng ta muốn kẻ địch dừng lại nơi gặp đơn vị ngừoi
chơi và bắn, thay vì bắn trong khi di chuyển. Chính vì vậy, ta sẽ
dừng đơn vị kẻ địch ở đây và chúng ta sẽ thay đổi giá trị biến
thực thể patrolling thành false, bởi vì nó ko tuần tra bây
giờ nữa:
Test game bây
giờ và bạn sẽ thấy kẻ địch dừng trước khi bắn.
WAITING FOR LUV
Bạn có muốn cải thiện khả năng thiết kế đồ họa của mình? Chắc hẳn các bạn cũng biết, nếu các dòng code là linh hồn của một trò chơi, thì đồ họa chính là bộ mặt của trò chơi đó. Đồ họa đẹp, dễ nhìn sẽ khiến trò chơi của bạn tăng tỉ lệ hấp dẫn người xem đến 90%. Hiện tại có hai công cụ hỗ trợ thiết kế đồ họa game tiện nhất mà mình biết, đó là Photoshop và Illustrator. Mình sẽ cố gắng tìm kiếm và chia sẻ các đồ họa game miễn phí cho các bạn tại blog này; tuy nhiên,
một trò chơi mà 100% do chính mình tạo ra vẫn hơn là đi cóp nhặt hình ảnh từ nơi khác đúng không nào. Tiện đây, mình có chia sẻ một khóa học thiết kế đồ họa Game 2D cho Mobile. Các bạn có thể tham khảo dưới đây để được giảm 40% học phí nhé.
2. Tạo ra người chỉ dẫn cho kẻ địch
Kẻ địch có
thể đi tuần trên chiến trường trò chơi, nhưng ko có ai hướng dẫn chúng,
chúng sẽ chỉ đi loanh quanh ko mục đích. Để khiến cho chúng nhanh nhạy
hơn, chúng ta có thể tạo một người chỉ dẫn cho chúng. Người chỉ dẫn
này sẽ tìm kiếm người chơi và nói cho các đơn vị khác biết người
chơi ở đâu.
Chúng ta sẽ
thêm một sprite object mới như một người chỉ dẫn; về hình ảnh, ta sẽ
sử dụng red_sliderRight từ tệp Base pack. Giống như chúng ta làm
với enemyBase, chúng ta sẽ thêm
hành vi Pathfinding cho đối tượng này, chúng ta cũng thêm hành vi Turret
cho đối tượng này. Hành vi Turret sẽ ko bắn người chơi mà sẽ phát
hiện ra người chơi mà nó nhắm vào. Do đó, ta ko muốn nó xoay, vì vậy
hãy thiết lập thuộc tính Rotate
thành No.
Bây giờ, nó
đã săn sàng tìm kiếm đơn vị của người chơi.
Logic cho đơn
vị hướng dẫn là như này: nó sẽ đi lang thanh tại một khu vực được
chỉ định để tìm kiếm đơn vị của người chơi; nếu nó tìm thấy người
chơi, nó sẽ thông báo cho tất cả các đơn vị khác vị trí của người
chơi để tất cả kẻ địch đến đó.
Chính vì
vậy điều đầu tiên chúng ta cần làm là nói cho đơn vị hướng dẫn tìm
kiếm người chơi, điều này được làm bởi thêm đơn vị của người chơi như
mục tiêu của nó:
Sau đó,
chúng ta sẽ nói với đối tượng enemyScout
đi tới một điểm bất kì trên layout để tìm kiếm xe tăng của người
chơi. Điều này cũng tương tự như khi ta muốn xe tăng địch đi xung quanh,
ngoại trừ việc ta ko muốn nó tìm kiếm toàn bộ layout. Chúng ta chỉ
cần người chỉ dẫn tìm kiếm một nửa layout để khiến chúng dễ dàng
và nhanh chóng hơn khi tìm kiếm người chơi.
Chính vì
vậy, thêm hành vi Timer cho người
chỉ dẫn, giống như chúng ta đã làm với các đơn vị kẻ địch khác. Và
giống như thế, chúng ta sẽ bắt đầu bộ đếm để tìm kiếm ở đầu
layout:
Khi bộ đếm
được kích hoạt, người chỉ dẫn sẽ bắt đầu tìm kiếm. Giống như các
đơn vị kẻ địch khác, những người tìm kiếm sẽ di chuyển trên đường
và bắt đầu scout timer sau khi đi
tới một vị trí ngẫu nhiên nó nhận khi bộ đếm bắt đầu.
Chúng ta sẽ xác định điều gì sẽ xảy ra nếu người chỉ dẫn tìm thấy xe tăng của người chơi. Chúng ta quyết định rằng người chỉ dẫn sẽ thông báo cho các đơn vị khác về địa điểm của nó. Nhưng chúng ta làm như thế nào? Chúng ta có thể sử dụng mảng để lưu trữ 2 giá trị: vị trí x sẽ được lưu trữ ở mục lục số 0 và mục lục số 1 sẽ được lưu trữ ở vị trí y. Bằng cách này, khi chúng ta muốn đơn vị kẻ địch khác đi tới, chúng ta chỉ cần bảo chúng nhìn vào mảng này.
Vì vậy hãy
thêm một mảng vào project và gọi nó là scoutArray; chúng ta sẽ điền vào mảng này khi người chỉ
dẫn phát hiện ra đơn vị của người chơi. May thay, có một trigger có
thể sử dụng cho tình huống này: On
turret target acquired. Trigger này được kích hoạt khi đối tượng tìm
thấy mục tiêu trong phạm vi; đây là khi ta muốn lưu trữ vị trí x và y
của đối tượng tới mảng.
Được rồi,
cái này sẽ lưu trữ vị trí mà ta muốn các đơn vị khác đi tới. Để
làm cho các đơn vị khác đi tới địa điểm này, chúng ta cần thêm một
hành động như sau:
Điều này sẽ
khiến eneemyBase tìm đường đến
nơi mà người chỉ dẫn bảo. Bạn có thể test game để thấy nó hoạt
động, nhưng trước đó, ta nên vô hiệu hóa hành động bắt đầu đếm giờ
của đối tượng enemyBase ở đầu
layout để những đối tượng kẻ địch ko di chuyển đến khi người chỉ dẫn
tìm thấy người chơi.
Tổng kết
Chúng ta đã đề
cập rất nhiều thứ trong chương này. Bạn đã học về một container trong C2, về những đặc điểm của nó và cách nó hoạt động.
Bạn cũng được học về hai hành vi mới: hành vi Pin để dễ dàng theo dõi một đối tượng và hành vi Pathfinding để tìm kiếm một con đượng
và di chuyển bên trên nó. Bạn cũng biết được rằng hành vi Pathfinding có thể trốn tránh kẻ thù trên màn hình.
Một hành vi
khác mà tôi đã đề cập trong chương này là hành vi Turret – có thể nhận ra mục tiêu và bắn chúng. Bạn cũng biết hành động
dùng để cuộn layout mà không cần sử dụng hành vi Scroll to. Bạn đã được học cách nhập âm thanh vào C2 và đâu là loại
tệp tốt nhất để nhập, cho dù là thêm chúng vào tệp Music hoặc Sounds, và
cách chơi chúng trong trò chơi với đối tượng Audio. Cuối cùng, chúng ta sử dụng giá trị được lưu trữ trong một mảng
trong gameplay, thay vì chỉ sử dụng nó để lưu trữ điểm cao của người chơi.
Hãy thử tự
mình phát triển trò chơi này. Điều gì sẽ xảy ra ở cuối game? Bạn có cần thêm một
màn chơi nữa sau khi thắng? Hệ thống điểm số có đúng vị trí không? Bạn có thể
thêm bảng xếp hạng vào cuối game chứ? Có rất nhiều sự lựa chọn để phát triển
trò chơi này. Hãy cố gắng lên nhé ^^.
Thật sự có rất
nhiều thứ, và chúng ta đang bắt đầu một trò chơi khá phức tạp. Tuy nhiên, có lẽ
tất cả chúng ta đều biết rằng tất cả các trò chơi đều có một số lỗi nhất định.
Đó là tại sao họ lại thử nghiệm rất nhiều và QA (Quality Assurance) – một quá
trình ngăn chặn lỗi trong trò chơi trước khi nó được xuất bản. Tiếp theo, chúng
ta sẽ nghiên cứu về kiểm tra lỗi trong C2.
Bản dịch do construct2vn.ga thực hiện
Ai sao chép hay chia sẻ hãy ghi nguồn và đưa link www.construct2vn.ga vào đầu bài chia sẻ nhé