-->

  • Learning Construct 2 - Chương 5 - Phần 3



    1. Forces, impulses, torques và Joint

    Khi ta sử dụng hành vi Physics, chúng ta cần phải làm quen với các thuật ngữ cùng với nó, đặc biệt nếu chúng được sử dụng trong C2. Các thuật ngữ như sau:
    • Force (lực): Lực là một ảnh hưởng từ bên ngoài thay đổi tốc độ hoặc phương hướng của đối tượng. Lực được áp dụng theo thời gian, vì vậy tốt nhất nên sử dụng các lực trong event có giá trị true trong một thời gian dài, ví dụ như Is key dowm keyboard event.
    • Impulses (xung lực): gần giống với lực, nhưng thay vì áp dụng theo thời gian, nó là một sự thay đổi đột ngột. Khi bạn áp dụng một lực vào đối tượng, tốc độ và hướng của nó sẽ thay đổi theo thời gian, nhưng khi bạn tác dụng một xung lực vào đối tượng, bạn sẽ thay đổi phương hướng của nó ngay lập tức. Xung lực được sử dụng tốt nhất trong các sự kiện có giá trị của true thay đổi lập tức, ví dụ như các trigger.
    • Torque (momen xoắn): là một lực được tác dụng để xoay; nó sẽ thay đổi tốc độ quay thay vì sự di chuyển của đối tượng.
    • Joint (Khớp): khớp nối 2 đối tượng với nhau. Chúng vẫn có thể quay một cách độc lập nhưng vị trí của chúng luôn liên quan đến nhau; nếu bạn di chuyển một đối tượng thì khớp nối cũng sẽ di chuyển. Ví dụ, cái này được sử dụng để tạo một số thiết bị hoặc máy móc the nguyên tắc vật lí.
    2. Thêm các phần tử thử thách

    Bây giờ ta đã biết các thuật ngữ sử dụng trong physics, hãy sử dụng chúng bằng cách thêm tính năng khác: phần tử câu đố. Câu đố khá phổ biến trong platformer game; chúng thường là những rào cản mà bạn phải vượt qua để tiến về đích.

    Chính vì vậy, hãy tạo một cái đơn giản ngay bây giờ. Chúng ta có nhân vật để đẩy tảng đá đập vào cái nút ở dưới mặt đất; nó sẽ mở cánh cửa. Chúng ta sẽ học cách làm thế nào để tác dụng một lực tới physic object với trường hợp nhân vật đẩy viên đá. Tiếp tục từ layout 3, thêm một vài sprite object vào nó. Chúng ta sẽ thêm một cánh cửa để ngăn chặn chúng ta tiến về phía trước; bạn có thể lấy nó từ tệp Tiles. Sau đó, ta thêm cái nút. Có hai hoạt cảnh cho nó: Default và Pressed. Bạn có thể lấy cả 2 từ tệp Items. Thêm hành vi Physics vào chúng, thiết lập Immovable Thành Yes, và đặt chúng như sau:


    3. Di chuyển nhân vật với hành vi Physics

    Chúng ta cũng sẽ thêm alien vào Layout 3 để đẩy tảng đá. Giống như bất kì các object khác trong layout này, chúng ta sẽ thêm hành vi Physics vào alien. Nhưng một điều quan trọng cần biết khi thêm hành vi Physics vào nhân vật mà người chơi điều khiển. Khi di chuyển, physics object ko chỉ trượt trên bề mặt mà còn xoay theo rất nhiều thứ tác dụng vào chúng (ví dụ như các lực, các xung và va chạm với object khác). Chúng ta chắc chắn ko muốn nhân vật của chúng ta xoay vòng, vì vậy ta sẽ ngăn chặn nó bằng cách đặt thuộc tính Prevent rotation thành Yes ở thành Properties của alienGreen.

    Khi thêm hành vi Physics vào nhân vật chính, đừng quên đổi thuộc tính Prevent rotation nếu ko nhân vật chính sẽ xoay vòng.

    Một điều khác cần ghi nhớ: khi di chuyển physics object, chúng ta phải sử  dụng các physics action và các biểu thức. Điều này đảm bảo C2 sẽ tính toàn vật lí chính xác. Nếu chúng ta di chuyển một physics object sử dụng hành vi khác, như hành vì Platform thì có thể chúng ta đã làm điều gì đó ko nên làm, ví dụ như đi qa một object bất động. Đầu tiên, ta sẽ vô hiệu hóa hành vi Platform bởi thiết lập thuộc tính của nó thành Disable.


    Sau đó, ta sẽ di chuyển nhân vật bằng tác động của lực và xung lực vào nó. Để làm điều này, di chuyển tới layout 3 event sheet. Có 3 tính huống ta muốn di chuyển nhân vật:
    • Di chuyển sang phải: Khi ta ấn nút mũi tên phải, chúng ta sẽ tác động một lực ở giá trị dương trên trục x để khiến nó di chuyển sang phải.
    • Di chuyển sang trái: Khi chúng ta ấn nút mũi tên trái , chúng ta sẽ tác động một lực tại giá trị âm trên trục x.
    • Nhảy: Khi chúng ta nhảy, chúng ta sẽ tác động một lực ở một mức độ nhất định để nó di chuyển lên trên.
    Dòng code như này khi mũi tên phải được ấn:




    Tương tự với mũi tên trái:


    Cuối cùng là khi mũi tên lên trên được ấn:


    4. Thay đổi tính chất của tảng đá

    Bây giờ bạn có thể test game và di chuyển xung quanh layout. Bạn có thể thấy đối tượng duy nhất mà nhân vật có thể tương tác là với tảng đá, bởi vì nó là object duy nhất ko phải bất động. Tuy nhiên, tảng đá di chuyển quá dễ dàng, hãy làm nó khó hơn để di chuyển.

    Để làm vậy, ta cần thay đổi giá trị thuộc tính của nó, đó là ma sát và giảm tuyến tính:

    • Ma sát: Điều này xác định sự dễ dàng cho những đối tượng để di chuyển đối với những cái khác trong khi chạm vào. Bạn có thể thiết lập giá trị giữa 0 và 1, với 0 là ko có ma sát và 1 là ma sát tối đa.
    • Giảm tuyến tính: Đây là tốc độ chậm dần của một đối tượng di chuyển, với giá trị 0 là ko có sự chậm dần và 1 là chậm dần tối đa.
    Thiết lập giá trị ma sát và giảm tuyến tính sẽ làm tảng đá khó đẩy hơ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é.



    5. Chọn đối tượng thông qua UID của nó

    Bây giờ, mọi thứ đã được thiết lập và sẵn sàng, chúng ta có thể bắt đầu khiến các nút phản ứng khi va chạm với tảng đá, và sau đó, ta sẽ phá hủy ổ khóa màu xanh lam. Các chúng ta phá hủy chúng không chỉ làm cho chúng biến mất với hành động phá hủy, nhưng chúng ta sẽ sử dụng xung lực để ném chúng vào một góc và phá hủy chúng khi chúng ở ngoài layout. Tuy nhiên, trước tiên tôi muốn giải thích UID là gì.

    UID là những số nhận dạng duy nhất được gán cho mọi đối tượng khi chúng được tạo (bạn ko thể thay đổi), dù là trong layout hay do code. Không có object nào trùng UID và những con số này là duy nhất cho mỗi object, chúng ta có thể lựa chọn object bởi UID. Nếu bạn làm theo đúng ví dụ của tôi, thì UID của các object khóa sẽ ở giữ 98 và 103, nếu ko phải thế, bạn có thể tìm giá trị của UID bằng cách ấn vào object và nhìn vào phần trên cùng của thanh Properties.


    Bây giờ, ta sẽ sử dụng UID trong event sheet để lựa chọn các khóa riêng. Những gì ta muốn là khi tảng đá va chạm với cái nút, chúng ta muốn hoạt ảnh của cái nút chuyển sang Pressed và sau đó tác động một xung lực lên cái hộp. Chúng ta có thể tác động những xung lực tương đương lên tất cả cái hộp, khiến chúng di chuyển theo cùng một hướng, nhưng thay vào đó, chúng ta sẽ khiến chúng di chuyển theo những hướng khác nhau cho giống hiệu ứng vụ nổ. Nhớ thiết lập các lockBlue object có thể di chuyển, hoặc chúng ta sẽ không thể di chuyển chúng xung quanh.


    UID của lockBlue của bạn có thể sẽ khác với tôi, vì vậy hãy kiểm tra trước khi viết mã. Chúng tôi cũng muốn phá hủy những ổ khóa sau khi được mở, để chính xác hơn, chúng ta muốn phá hủy chúng khi chúng ra khỏi layout. May thay, có một hành vi cho cái này. Hành vi này có tên là Destroy Outside Layout và nó sẽ phá hủy các đối tượng nào ra khỏi layout. Thêm nó vào lockBlue object.

    Một điều quan trọng nữa là trước khi test game của bạn đó là kiểm tra các đa giác va chạm của hoạt ảnh, đặc biệt là hoạt ảnh của cái nút. Nếu bạn chỉ tải hình ảnh cái nút và để C2 tự thiệt lập đa giác va chạm thì bạn sẽ nhận được cái này:


    Điều này không tốt chút nào, có 2 đường kẻ giao nhau, nó sẽ làm ảnh hưởng đến hành vi Physics và gây ra lỗi trong trò chơi bởi vì hành vi Physics ko thể tính toán chính xác vùng va chạm của vật thể này, để khắc phục điều này, chỉnh sửa đa giác va chạm như sau:


    Điều này sẽ giúp ngăn chặn các lỗi trong trò chơi và khiến game của chúng ta mượt mà hơn. Test thử game và đẩy tảng đá vào cái nút; bạn sẽ thấy ổ khóa bị thổi bay. Lưu project lại trước khi bạn đánh mất nó, chúng ta sẽ tiếp tục.

    6. Nối 2 đối tượng

    Tôi đã đưa ra ví dụ về cách sử dụng các lực và xung lực để di chuyển các đối tượng vật lí xung quanh, nhưng tôi chưa đề cập đến các khớp nối. Các khớp dùng để nối 2 đối tượng lại với nhau để khoảng cách của chúng là như nhau. Chúng ta sẽ làm một cái cầu sử dụng khớp nối. Chính vì vậy, hãy tạo một layout giống như dưới đây:



    Các sprite cho cây cầu và hàng rào được đặt trong tệp Tiles. Trước khi tiếp tục hãy kiểm tra các đa giác va chạm của cây cầu và chỉnh sửa nó để ko có đường nào giao nhau như cái nút.

    Luôn luôn kiểm tra đa giác va chạm của object mà bạn muốn thêm hành vi Physics, đặc biệt là những sprite nhỏ.

    Hàng rào và câu là những đối tượng vật lí, nhưng chỉ hàng rào là không thể di chuyển, cây cầu vẫn có thể di chuyển. Chúng ta sẽ buộc cây cầu vào hàng rào bằng cách sử dụng các khớp. Một điều cần nhớ về khớp nối là bạn chỉ có thể làm khớp giữa các loại đối tượng, chứ ko phải là các phiên bản khác của cùng một đối tượng. Đó là tại sao ta có một đối tượng hàng rào và một đối tượng cây cầu, chứ ko phải một đối tượng cây cầu với một đối tượng cây cầu khác.

    Sử dụng khớp nối, ta nối chúng dựa trên điểm ảnh của chúng; nếu một đối tượng ko có điểm ảnh, thì nó sẽ dựa trên origin point (điểm gốc), theo mặc định thì nó nằm ở giữa sprite. Bây giờ, chúng ta không muốn nối cây cầu bởi điểm gốc của nó, bởi vì nếu bạn nhìn vào nó, điểm gốc sẽ nổi trên cây cầu, vì vậy, ta sẽ tạo một điểm ảnh ở giữa sprite, gọi là imagepoint 1.



    Sau đó, ta sẽ ngăn chặn cây cầu xoay vòng bằng cách thiết lập thuốc tính Prevetn rotation thành Yes. Chuyển tới event sheet của layout 4, ta sẽ nối chúng lại với nhau. Bạn chỉ nên tạo các khớp trên những trigger, chứ ko phải các sự kiện bình thường có giá trị true trên một thời gian dài. Trong ví dụ của chúng ta, chúng ta sẽ tạo một khớp nối ở đầu layout. Làm một khớp nối chỉ cần một hành động, nhưng  chúng ta có 2 cây cầu nên ta sẽ sử dụng một hành động 2 lần.



    Đã xong. Chúng ta đã tạo ra một khớp nối. Sao chép code để  khiến nhân vật di chuyển từ layout 3 và test thử. Bạn có thể di chuyển lên đỉnh đầu của cây cầu nêu bạn muốn.

    7. Các engine vật lí trong Construct 2

    C2 có 3 engine vật lí để chạy các tính toán vật lí:

    • Box2dweb: Mặc định, C2 sử dụng bản box2dweb của engine vật lí. Box2dweb dựa trên engine vật lí box2d; là một engine vật lí thường đc sử dụng trong các trò chơi. Bản box2dweb là bản JavaScript được dự định sử dụng trong các trò chơi web.
    • Box2dweb asm.js: đây là phiên bản nhanh hơn của box2dweb. Nó sử dụng công nghệ emscripten (một công nghệ từ Mozilla) sử dụng C và C++ để tạo ra JavaScript có hiệu năng cao. Đó là cái được gọi là asm.js, và tất cả trình duyệt được tối ưu cho asm.js có thể dịch code này để cho phép hiệu suất nhanh mà bạn nhận được code từ C và C++. Tuy nhiên, tất cả những cái này xảy ra trong trình duyệt của bạn.
    • CocoonJS native: Đây là engine vật lí được tối ưu hóa cho gói CocoonJS. Nếu bạn ko biết về nó, thì CocoonJS là dịch vụ giúp bạn gói hoặc bao bọc HTML5 game, giống như những thứ được tạo ra trong C2, tới Android và IOS game. Nếu bạn tạo game mobile và dự định sử dụng CocoonJS để xuất bản chúng thì CocooonJS native chính là lời khuyên dành cho bạn.

    Bây giờ có thể có một số bạn tự hỏi rằng nếu asm.js nhanh hơn box2dweb thông thường, thì tại sao ko sử dụng box2dweb asm.js làm engine vật lí mặc định? Có 2 nhược điểm sau của asm.js:

    • Nó ko hỗ trợ hành động vô hiệu hóa va chạm. Một số trò chơi cũ được tạo ra trước khi tính năng engine vật lí được thêm vào có thể sử dụng action để vô hiệu hóa những va chạm, và thiết lập asm.js như một engine vật lí mới sẽ phá vỡ những trò chơi này.
    • Trong các ứng dụng gốc của IOS, nó sẽ chậm hơn. Lí do là các bit kĩ thuật. Trình duyệt Safari trên IOS có một biên dịch JIT giải thích JavaScript code và chạy nó. Khi bạn chạy một ứng dụng IOS gốc, ví dụ, khi bạn gói game của bạn mà sử dụng CocoonJS hay PhoneGap  thì JIT sẽ không hỗ trợ. Chú ý rằng đây vẫn là hiệu suất nhanh cho nhiều trò chơi. Tuy nhiên, nó vẫn chậm hơn phiên bản ko asm.js. Chính vì vậy, nếu bạn muốn làm game cho IOS thì ko nên sử dụng box2dweb asm.js.

    Được rồi, giờ bạn đã biết về 3 engine vật lí trong C2. Nên dùng cái nào? Nếu bạn triển khai game mobile, hãy sử dụng CoconJS, nếu bạn nhắm đến nền tảng IOS, sử dụng box2dweb, và nếu sử dụng các action vô hiệu hóa va chạm, hãy sử dụng box2dweb. Nếu bạn gặp bất kì thứ gì khác những cái trên, sử dụng box2dweb asm.js.

    Tổng kết

    Vật lí là một chủ đề phức tạp, chúng ta đã nghiên cứu về nó trong chương này. Bạn đã học cách tạo hoạt ảnh của sprite cùng và không cùng vòng lặp. Bạn cũng học về 3 hành vi mới: Platform, Scroll toBound to Layout. Hơn thế nữa, bạn đã học về cách tạo layout mới trong C2 và cách thay đổi layout trong trò chơi. Bạn cũng được biết về 3 engine cung cấp vật lí của C2 và khi nào chúng nên được sử dụng. Bạn cũng học được rằng chúng ta có thể chọn một cá thể riêng lẻ bằng UID, thay vì chọn tất cả các phiên bản cùng một lúc. Cuối cùng, bạn cũng được chỉ về cách sử dụng các khớp trong đối tượng vật lí.

    Sự hiểu biết của chúng ta về việc tạo ra một trò chơi trong Construct 2 đã tăng lên, nhưng cho đến bây giờ, chúng ta chưa hề thêm một khía cạnh cạnh tranh nào trong trò chơi của chúng ta. Một ví dụ cho sự cạnh tranh đó chính là một cái bảng xếp hạng cho các game thủ. Và chúng ta sẽ làm điều này trong chương tiếp theo.


    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