-->

  • Learning Construct 2 - Chương 7 - Phần 1



    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.

    Chúng ta sẽ thay đổi thuộc tính Obstacle thành Custom để hành vi Pathfinding nhìn chúng như một trở ngại.


    Vậy, làm thế nào để nói với hành vi Pathfinding đối tượng nào là trở ngại? Đúng, chúng ta sẽ dùng code. Khi tankBase được tạo, chúng ta sẽ nói đối tượng nào là trở ngại bằng cách sử dụng hành động add obstacle. Chúng ta thêm đối tượng tiledObstacle và civilians như những trở ngại; chúng ta muốn thêm những solid object theo cách này bởi vì thuộc tính của hành vi Pathfinding dã chuyển thành Custom. Chính vì vậy ở event sheet, chỉnh sửa hành động on created của thuộc tính tankBase như sau:


    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é

  • DONATE TINH THẦN CHO BLOG TẠI ĐÂY

    Nếu các bạn thấy blog có ích hãy ủng hộ blog hàng ngày tại đây. Chỉ cần thi thoảng chơi game và tìm bug cho tụi mình là được. Đây là ủng hộ tinh thần, không phải tiền mặt, vật chất và không bắt buộc. Xin chân thành cảm ơn ahihi. Chúc các bạn một ngày zui zẻ.

    TELEPHONE

    02273 7x2 xxx
    02273 xxx 27x

    MOBILE

    0162 x15 xx33