Chương 7. Làm game bắn xe tăng
Bạn đã học
được rất nhiều cho đến bây giờ, điều cuối cùng tôi cần đề cập đó
là lưu trữ nhiều giá trị trong mảng hoặc từ điển và cách truy cập
chúng. Bạn cũng đã học về WebStorage, lưu trữ dữ liệu trong máy của
người chơi, dữ liệu này có thể truy cập khi trò chơi được chơi sau 1
thời gian.
Tuy
nhiên bây giờ ta sẽ phát triển cái mà ta biết từ trước đến nay. Tôi
sẽ chỉ cho bạn nhiều cách trong đó chúng ta sẽ sử dụng các mảng
khác để lưu trữ điểm của người chơi. Chúng ta sẽ tạo ra một loại kẻ
địch mới. trước đó, kẻ thù của chúng ta rất đơn giản và dễ dàng
thực hiện, chúng chỉ cần đi xuống và bắn thẳng xuống. Bây giờ,
chúng ta sẽ cung cấp cho chúng 1 AI (trí tuệ nhân tạo) nhỏ để khiến
chúng thông minh hơn, bằng cách làm một trò chơi bắn xe tăng.
Trong
chương này, ta sẽ học về:
- Kết hợp mảng với bộ máy gameplay.
- Nhóm các đối tượng lại thành một nhóm.
- Tạo một nòng súng để phát hiện kẻ địch gần đó.
- Chơi nhạc và âm thanh trong game.
- Tạo AI đơn giản cho kẻ thù.
Bài 1. Thiết lập layout
Như thường
lệ, chúng ta sẽ bắt đầu bằng cách tạo bố cục cho trò chơi của
chúng ta. Thật ko may là tôi ko có sprite phù hợp cho trò bắn xe tăng,
tuy nhiên, ta có thể sử dụng 2 sprite để làm 1 cái xe tăng: một cái
để làm thân xe tăng, còn một cái để làm nòng súng.
Đầu
tiên, thêm 2 sprite object vào layout và đặt tên chúng là tankTurret và tankBase. Sprite tankBase
từ UI elements / Adventure pack.
Chọn bất kì biểu tượng hình vuông nào đó, ví dụ tôi sẽ chọn buttonSquare_blue_pressed. Đối với
nòng súng, hãy chọn một ảnh hình mũi tên, ví dụ arrowSilver_right, nếu bạn đặt 2 hình ảnh này lên nhau, bạn
sẽ thấy một biểu tượng tương tự như hình dưới đây:
Chỉ cần
một chút tượng tượng là trông nó khá giống xe tăng rồi :’))). Tuy
nhiên, thân xe và nòng súng phải hoạt động như một, tức là nếu một
cái được sinh ra thì cái kia cũng phải đc sinh ra, cái này bị phá hủy
tức là cái kia cũng phải bị phá hủy. Vậy ta làm như thế nào? Vâng,
C2 có một tính năng gọi là container
dùng để nhóm các đối tượng lại với nhau.
1. Sử dụng container
Vậy container là cái gì? Container là
một tính năng trong C2 giúp giảm bớt sự tạo ra của một đối tượng
chứa nhiều đối tượng nhỏ bên trong. Đôi khi, khi làm một trò chơi, bạn
sẽ có một đối tượng rất phức tạp để thể hiện trong một đối tượng.
Sử dụng container, chúng ta có thể hợp nhất nhiều đối tượng thành
một. Trong trường hợp này, ta có một cái xe tăng chứa 2 sprite: thân xe
và nòng súng. Thêm 2 cái này vào 1 container để cho phép chúng xoay
và di chuyển một cách độc lập; chúng cũng có biến thực thể riêng.
Cái này rất hữu ích, ví dụ khi bạn muốn tạo ra một side-scrolling
game nơi bạn có thể khiến tay và thanh kiếm chống lại va chạm với kẻ
thù để tấn công chúng và cơ thể người chơi chống lại va chạm với
đòn tấn công của kẻ thù.
Tất cả đối tượng trong 1 container có
những đặc điểm sau:
- Nếu một đối tượng trong 1 container được tạo ra, tất cả những đối tượng cùng 1 container cũng được tạo ra.
- Nếu một đối tượng trong container bị phá hủy, tất cả các đối tượng cùng container cx bị phá hủy.
- Nếu một sự kiện thao tác một đối tượng trong 1 container, các đối tượng cùng container cũng sẽ bị thao tác.
Bây giờ, hãy tạo một container. Để làm vậy, chọn một trong các đối tượng mà bạn muốn cho vào container, chẳng hạn như đối tượng tankTurret. Sau đó bạn có thể thấy phần Container ở thanh Properties. Nếu ko có container nào, nó sẽ nói là No containercùng với đường dẫn màu xanh nước biển Create bên cạnh; kích vào đường dẫn để tạo container.
C2 sẽ mở ra một cửa sổ mới để lựa chọn đối tượng thêm vào container này. Bây giờ chúng ta chỉ có đối tượng tankBase; vì vậy hãy thêm cái này, kích vào nó và nhấn nút OK. Đối tượng tankBase đã được thêm vào container; nếu bạn nhìn vào thanh Properties bạn sẽ thấy nó. Kích vào hai đối tượng lần lượt và nhìn vào thanh Properties, bạn có thể thấy chúng được thêm vào mỗi container khác nhau.
Bạn có thể thêm đối tượng khác tới container đó hoặc gỡ thành viên đã ở trong đó. Bây giờ, mỗi lần đối tượng tankBase được tạo, C2 sẽ tạo cả đối tượng tankTurret. Tuy nhiên, ko đủ để chúng tạo ra cùng 1 lúc. Chúng ta muốn khẩu pháo gắn vào thân xe để khi xe tăng di chuyển, khẩu pháo sẽ theo sau.
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. Ghim đối tượng này vào một đối tượng khác
Chúng
ta có thể ghim đối tượng này vào đối tượng khác bằng một hành vi
được gọi là Pin. Hành vi này
ghim một đối tượng này vào một đối tượng khác, làm cho nó duy trì
khoảng cách và góc với đối tượng mà nó được ghim vào. Bởi vì
chúng ta sẽ di chuyển đối tượng tankBase
và đối tượng tankTurret sẽ theo
sau nó, nên chúng ta sẽ thêm hành vi này vào đối tượng tankTurret.
Sau khi thêm hành vi Pin, chúng ta sẽ sử dụng nó để ghim các đối tượng khác, trong trường hợp này là đối tượng tankBase. Việc ghim này được thực hiện bằng code, và ta sẽ ghim đối tượng tankTurret khi khẩu pháo được tạo. Khẩu pháo được tạo khi thân xe được tạo, chính vì vậy ta sẽ thực hiên hành động ghim khi thân xe được tạo. Trong khi ghim, ta phải quyết định ghim theo vị trí, góc hay cả hai.
Ghim
theo vị trí tức là khiến các đối tượng được ghim giữ vị trí của
nó tương ứng với đối tượng kia, nhưng khi đối tượng kia quay, các đối
tượng được ghim sẽ không thay đổi góc của nó.
Ghim
theo góc tứ là khiến đối tượng được ghim giữ góc của nó tương ứng
với đối tượng kia, nhưng nó sẽ ko thay đổi vị trí khi đối tượng kia
di chuyển.
Ghim
bằng cả góc và vị trí sẽ làm cho các đối tượng bị ghim giữ cả vị
trí và góc tương đối với đối tượng kia.
Bây
giờ, ta muốn ghim cả góc và vị trí, code như sau:
3. Di chuyển các đơn vị
Chúng ta đã
nhóm 2 đối tượng vào một container; giờ hãy làm cho chúng di chuyển.
Để di chuyển, đầu tiên ta cần chọn chúng và kích vào một nơi trong
trò chơi để di chuyển đơn vị được chọn. Chúng ta cần một biến thực
thể để đơn vị biết được chúng có được chọn hay ko. Biến thực thể
này là biến Boolean; hãy gọi
nó là selected, và chúng ta sẽ
tạo nó trong đối tượng tankBase.
Để
có thể lựa chọn một đơn vị, trò chơi phải đáp ứng đầu vào của con
chuột, chính vì vậy hãy thêm đối tượng Mouse vào project của ta. Sau
đó, ta phải di chuyển đơn vị, nhưng ta làm như thế nào? C2 có một
cách đơn giản để di chuyển một đơn vị, đó là hành vi Pathfinding. Hành vi này tạo một vị
trí để di chuyển đến và khiến đối tượng di chuyển đến vị trí này.
Hãy thêm hành vi này vào đối tượng tankBase.
Bây giờ ta đã có hành vi này, hãy di chuyển đơn vị của ta. Có một cách để di chuyển chúng; người chơi phải kích vào đơn vị họ muốn di chuyển để lựa chọn chúng, chúng ta sẽ đánh dấu các đơn vị được chọn bởi chuyển biến thực thể của chúng thành true.
Sau đó, người chơi phải bấm vào một địa điểm trong trò chơi mà họ muốn các đơn vị được lựa chọn di chuyển tới, và ta sẽ nói cho các đơn vị đường tới đó bằng cách sử dụng hành vi Pathfinding:
Nếu
đơn vị tìm được đường tới đó, chúng sẽ tới:
Chúng
ta đã làm cho các đơn vị được chọn tới điểm mà ta muốn. Test game bây
giờ và bạn sẽ thấy đơn vị di chuyển đến nơi bạn bấm chuột vào.
Chúng thậm chí còn xoay hướng rất đẹp.
4. Thêm chướng ngại vật
Tôi
nghĩ một cái background trắng xóa thì rất nhàm chán cho một trò
chơi, phải ko? Vì vậy hãy thêm một ít chướng ngại vật trên đường đi
của đơn vị. Chúng ta sẽ đặt những chướng ngại vật này vào layer của
chúng ta, vì vậy hãy tạo một layer mới gọi là Obstacles và đặt nó ở giữa Main và Background
layer.
Chúng
ta sẽ sử dụng tiled background để tạo nhiều loại trở ngại. Ko may là
chúng ta ko có sprite với kích cỡ 16x16 hoặc 32x32 mà ta có thể sử
dụng nó, chính vì vậy hãy tự tạo sprite cho mình. Đầu tiên ta sẽ
tạo một tiled background object và
đặt tên nó là tiledObstacle, và
sau đó ở cửa sổ chỉnh sửa hình ảnh, ta sẽ sửa kích cỡ của nó
bằng cách kích vào biểu tượng Resize.
Bây
giờ, thay đổi giá trị thành 32x32:
Sau
khi chúng ta thay đổi kích cỡ của nó, ta sẽ tô cho nó màu cam. Đóng
cửa sổ chỉnh sửa hình ảnh và đặt nó theo 3 đường: dọc, ngang và
chéo giống như dưới đây:
Chúng
ta đã có 3 loại trở ngại; đây là cơ hội tốt để cho bạn thấy hành vi
Pathfinding hoạt động như thế
nào. Nếu bạn test game bây giờ, đơn vị của ta vẫn có thể đi xuyên qua
các trở ngại. Tại sao? Bởi vì hành vi Pathfinding ko nhìn thấy chúng như những trở ngại.
Có 2
cách để hành vi Pathfinding nhận
ra trở ngại: solid và custom. Theo mặc định hành vi Pathfinding sẽ phân tích solid object và cố đi quanh
chúng. Theo thiết lập khác, Custom,
nghĩa là chúng ta phải nói với hành vi Pathfinding rằng những đối
tượng này là trở ngại. Hãy nhớ rằng các solid object là những đối
tượng với hành vi Solid, khiến
chúng ko thể bị xuyên qa bởi các đối tượng khác. Bạn có thể thay
đổi thiết lập ở thành Properties.
Bây
giờ, cho phép tôi chỉ cho bạn cách sử dụng solid object như một trở
ngại. Chúng ta chỉ cần thêm hành vi Solid vào đối tượng tiledObstacle, và hành vi Pathfinding
sẽ biết đó là những trở ngại. Test game sau khi bạn thêm hành vi Solid
tới trở ngại, bạn sẽ thấy đơn vị của mình cố gắng tránh chúng.
5. Tạo trở ngại custom cho đơn vị
Được rồi, chúng ta đã biết cách tạo trở ngại với solid object, nhưng làm thế nào để tạo một trở ngại custom mà ko phải là solid object? Để trả lời câu hỏi này, đầu tiên ta sẽ tạo một đối tượng khác để trở thành trở ngại custom. Thêm sprite object khác vào layout, và tất nhiên là ta ko có sẵn sprite này, hãy tự làm nó, chỉnh kích cỡ của nó thành 32x32 và tô màu xanh biển. Đặt tên nó là civilians; nó sẽ khiến xái xe tăng phải tránh nó. Chúng ta tạo trở ngại custom khi chúng ta muốn một đối tượng với hành vi Pathfinding tránh trở ngại, và khi ta muốn một đối tượng khác ko tránh trở ngại này.
Sau đó, đặt đối tượng civilians ở bất cứ đâu để nó cản trở sự di chuyển của xe tăng. Nó được thể hiện trong ảnh sau:
Nếu bạn test game bây giờ, bạn sẽ thấy xe tăng cố tránh khỏi các civilian.
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é
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é