--------------- <> -----------------
--- KHOA HỌC - CÔNG NGHỆ - GIÁO DỤC - VIỆC LÀM ---
--- Học để đi cùng bà con trên thế giới ---

Tìm kiếm trong Blog

Lập trình Scratch (13) - Hoạt hình 1

Bài trước: Lập trình Scratch (12) - Hiển thị
-----

13. Hoạt hình 1

Trong Scratch, bạn có thể dễ dàng làm cho các nhân vật cử động được. Rất nhiều nhân vật đã có sẵn nhiều "trang phục" (costumes) khác nhau rồi. Bạn chỉ cần cho nhân vật thay đổi liên tục giữa hai bộ trang phục là đã tạo ra cảm giác như nhân vật đó đang bước đi hoặc đang bay vậy.

Để xem các trang phục của một nhân vật: Trong giao diện lập trình Scratch > chọn chọn một nhân vật trong vùng Sprites > bấm vào nhãn (tab) Costumes > bạn sẽ thấy được các trang phục khác nhau của một nhân vật > bạn có thể thêm hoặc thiết kế lại trang phục cho các nhân vật.

Bài tập 13a. Chúng ta cùng lập trình để có một đàn dơi bay trong một khu rừng.

Bạn hãy làm theo các bước sau:

[Bước 1]: Thiết kế khu rừng

- Chọn hình nền (backdrop): Nhấn vào biểu tượng Backdrop (góc dưới bên phải)

- Chọn Forest hoặc Woods từ thư viện. Bạn nên chọn một hình nền có tông màu tối một chút để phù hợp với dơi

[Bước 2]: Chuẩn bị con dơi

- Xóa chú mèo (nếu có)

- Nhấn vào biểu tượng Choose a Sprite và tìm Bat (con dơi)

- Kiểm tra Trang phục (Costumes): Vào mục Costumes. Bạn sẽ thấy con dơi có nhiều tư thế (bat-a, bat-b, bat-c, bat-d). Bạn sẽ xóa tư thế thứ 4 (bat-d). Chỉ cần để lại 3 tư thế đầu tiên để tạo hiệu ứng vỗ cánh

[Bước 3]: Lập trình cho "Dơi chúa" (nhân vật gốc)

Ở phần này, chúng ta sẽ tạo ra một đàn dơi bằng cách sử dụng tính năng nhân bản (tạo bản sao) (clone).

Chọn con dơi và lập trình theo hướng dẫn sau:

Mã Scratch

Giải thích

when green flag clicked

Khi nhấn nút Bắt đầu (Lá cờ xanh)

hide

Ẩn con dơi gốc đi, để chỉ thấy các bản sao

set size to 0%

Đảm bảo con dơi gốc siêu nhỏ, không hiện lên

repeat (15)

    create clone of [myself] 

    wait (0.1) seconds

end

Tạo ra 15 con dơi (có thể thay đổi số lượng)

- Tạo một bản sao của chính con dơi gốc

- Đợi một chút để các con dơi không xuất hiện cùng lúc

[Bước 4]: Lập trình cho "đàn Dơi con" (các bản sao)

Mỗi bản sao của con dơi sẽ có hai hành động song song là: vỗ cánh và bay lượn.

Phần A: Vỗ cánh (Animation) - Tạo hiệu ứng dơi đang bay

Mã Scratch

Giải thích

when I start as a clone

Khi một bản sao được tạo ra

show 

Hiện bản sao lên (vì dơi gốc đã ẩn)

set size to (pick random 30 to 70)%

Đặt kích thước ngẫu nhiên (dơi to, dơi nhỏ)

set (color) effect to (pick random -50 to 50)

Tạo màu sắc ngẫu nhiên (hoặc bỏ qua nếu muốn dơi cùng màu)

forever

    next costume

    wait (pick random 0.08 to 0.15) seconds 

end

Lặp lại mãi mãi

Chuyển sang trang phục kế tiếp (tạo hiệu ứng vỗ cánh)

Đợi một chút, giúp cánh vỗ tự nhiên hơn


Phần B: Bay lượn (Movement) - Di chuyển ngẫu nhiên trong rừng

Mã Scratch

Giải thích

when I start as a clone

Khi một bản sao được tạo ra

forever

    glide (pick random 2 to 5) secs to [random position]

end

Lặp lại mãi mãi

Lướt đến vị trí ngẫu nhiên trong 2-5 giây


Chạy chương trình:

- Khi bạn nhấn lá cờ xanh

- Sẽ có 15 con dơi (hoặc số lượng bạn đặt) xuất hiện trong khu rừng

- Mỗi con dơi sẽ có kích thước và màu sắc hơi khác nhau

- Tất cả chúng sẽ liên tục vỗ cánh và bay lượn một cách ngẫu nhiên khắp màn hình, tạo nên cảnh một đàn dơi sống động trong rừng

Bài tập 13b. Bạn hãy thêm hiệu ứng âm thanh cho đàn dơi hoặc làm cho chúng phản ứng khi chạm vào cạnh màn hình.

Bài tập 13c. Học hết nghĩa của các từ mới trong mã nguồn.

13. Animation 1

With Scratch you can easily animate sprites. Many sprites already have multiple costumes. You can give the impression of walking or flying by simply alternating between two different costumes.

Tham khảo: https://scratch-tutorial.readthedocs.io/fr/latest/3_animate/animate.html

-----
Bài sau:

CNPM (2) - Các mô hình phát triển phần mềm

Bài trước: CNPM (1) - Giới thiệu
-----
2. Các mô hình phát triển phần mềm

Ở phần trước đã đề cập, để làm ra một phần mềm, cần trải qua 6 công đoạn là: [1] Lấy và phân tích yêu cầu, [2] Thiết kế, [3] Lập trình, [4] Kiểm thử, [5] Triển khai, [6] Vận hành và Bảo trì.

Tuy nhiên, trong thực tế, tùy thuộc vào quy mô và tính chất của dự án, người ta sẽ có cách thức tổ chức các công đoạn theo nhiều cách khác nhau.

Chúng ta cùng tìm hiểu một số cách thức tổ chức các công đoạn của quá trình phát triển phần mềm. Mỗi cách thức tổ chức được gọi là một Mô hình phát triển phần mềm.

Có rất nhiều mô hình phát triển phần mềm, ví dụ:

- Mô hình thác nước

- Mô hình chữ V

- Mô hình xoắn ốc

- Mô hình hợp nhất

- Mô hình tiếp cận lặp

- Mô hình nguyên mẫu

- Mô hình Scrum

- Mô hình Kanban

- Mô hình XP

Chúng ta cùng tìm hiểu một số mô hình.

2.1 Mô hình Thác nước

- Đặc điểm: Đây là mô hình tuần tự, các giai đoạn phát triển diễn ra theo một trình tự tuyến tính, từ trên xuống dưới như một dòng thác. Mỗi giai đoạn phải được hoàn thành trước khi chuyển sang giai đoạn tiếp theo và không có sự quay lại.

- Áp dụng: Phù hợp với các dự án có yêu cầu ổn định, đã được xác định rõ ràng ngay từ đầu và không có khả năng thay đổi. Ví dụ: các dự án phát triển phần mềm nhúng hoặc các dự án quốc phòng.

Công việc cụ thể của mỗi công đoạn:

[1] Lấy và phân tích yêu cầu

Giai đoạn này xác định phần mềm phải làm gì.

Công việc cụ thể:

- Làm việc trực tiếp với khách hàng để xác định các tính năng, giao diện và hiệu suất

- Sử dụng các kỹ thuật như phỏng vấn, khảo sát hoặc viết user stories

- Phân loại yêu cầu thành nhóm chức năng và phi chức năng

- Xây dựng tài liệu Đặc tả yêu cầu phần mềm (SRS - Software Requirements Specification)

Công cụ sử dụng: 

- Các phần mềm soạn thảo văn bản (Word, Google Docs), Confluence

[2] Thiết kế

Chuyển các yêu cầu thành bản vẽ kỹ thuật

Công việc cụ thể:

- Thiết kế kiến trúc hệ thống (Client-Server, Microservices...)

- Thiết kế cơ sở dữ liệu, thuật toán và giao diện người dùng

- Vẽ sơ đồ lớp UML (UML Class Diagrams)

Công cụ sử dụng: 

- Enterprise Architect, Visual Paradigm, Lucidchart (vẽ UML); Figma (thiết kế UI/UX)

[3] Lập trình

Sử dụng ngôn ngữ lập trình để viết mã, dựa trên bản thiết kế.

Công việc cụ thể:

- Viết mã theo tiêu chuẩn: SOLID, DRY, KISS

- Đặt tên biến/hàm theo chuẩn và viết chú thích đầy đủ

- Xây dựng hệ thống kiểm thử tự động (Unit test) song song khi lập trình

Công cụ sử dụng: 

- VS Code, Cursor, IntelliJ

- Quản lý phiên bản bằng Git

[4] Kiểm thử

Tìm và sửa lỗi để đảm bảo phần mềm chạy đúng và ổn định.

Công việc cụ thể:

- Kiểm thử ở nhiều cấp độ: Unit, Integration, System, Acceptance

- Áp dụng kiểm thử hộp đen (Black-box) và hộp trắng (White-box)

Công cụ sử dụng: 

- Selenium, JMeter, Postman (kiểm thử API)

[5] Triển khai

Cài đặt phần mềm vào môi trường thực tế và bàn giao cho khách hàng.

Công việc cụ thể:

- Đóng gói phần mềm

- Thiết lập luồng tích hợp và triển khai liên tục (CI/CD)

- Hướng dẫn khách hàng sử dụng sản phẩm

Công cụ sử dụng: 

- Docker, Jenkins, GitHub Actions

- Các dịch vụ Cloud (AWS, Azure)

[6] Vận hành và bảo trì

Theo dõi, sửa lỗi phát sinh và nâng cấp hệ thống.

Công việc cụ thể:

- Sửa lỗi, cấu hình phần mềm để thích nghi với môi trường mới và hoàn thiện tính năng

- Tái cấu trúc mã nguồn (refactoring)

Công cụ sử dụng:

- Các hệ thống giám sát (monitoring) như Grafana, Prometheus

2.2 Mô hình chữ V

- Đặc điểm: Là một biến thể của mô hình thác nước, mô hình chữ V nhấn mạnh việc kiểm thử được thực hiện song song với các giai đoạn phát triển. Mỗi giai đoạn phát triển sẽ tương ứng với một giai đoạn kiểm thử cụ thể.

- Áp dụng: Phù hợp cho các dự án yêu cầu độ tin cậy cao, ví dụ như các hệ thống y tế hoặc các hệ thống kiểm soát công nghiệp.

2.3 Mô hình tiếp cận lặp

- Đặc điểm: Mô hình này chia dự án thành nhiều lần lặp (iteration) nhỏ. Mỗi lần lặp sẽ tạo ra một phiên bản sản phẩm có thể hoạt động được, bổ sung thêm tính năng qua mỗi lần lặp.

- Áp dụng: Dành cho các dự án mà yêu cầu không rõ ràng ngay từ đầu, hoặc khi cần phát hành sản phẩm sớm để lấy ý kiến phản hồi từ người dùng.

2.4 Mô hình Agile/Scrum

- Đặc điểm: Là một trong những mô hình Agile phổ biến nhất. Scrum dựa trên việc chia dự án thành các chu kỳ phát triển ngắn (thường 1-4 tuần) gọi là Sprint. Trong mỗi Sprint, đội nhóm sẽ hoàn thành một tập hợp các tính năng được ưu tiên.

- Áp dụng: Phù hợp với các dự án có yêu cầu thường xuyên thay đổi và cần sự linh hoạt, nơi mà sự hợp tác chặt chẽ giữa các thành viên và với khách hàng là yếu tố then chốt.

2.5 Bài tập và câu hỏi

Bài tập 2a. Vẽ lại sơ đồ các mô hình: Thác nước, chữ V, Tăng trưởng lặp và Agile/Scrum. 

Bài tập 2b. Mô tả công việc của mỗi công đoạn, công cụ sử dụng của mô hình Thác nước

Câu hỏi 2.1 Về mô hình Thác nước. Phát biểu nào không đúng?

A. Mỗi giai đoạn phải được hoàn thành trước khi chuyển sang giai đoạn tiếp theo và không có sự quay lại

B. Không phù hợp với các dự án có yêu cầu ổn định, đã được xác định rõ ràng ngay từ đầu và không có khả năng thay đổi

C. Đây là mô hình tuần tự, các giai đoạn phát triển diễn ra theo một trình tự tuyến tính, từ trên xuống dưới như một dòng thác

D. Phù hợp với các dự án có yêu cầu ổn định, đã được xác định rõ ràng ngay từ đầu và không có khả năng thay đổi

Câu hỏi 2.2 Trong mô hình chữ V có đề cập tới 4 loại kiểm thử. Loại kiểm thử nào sau đây không đúng?

A. Acceptance Testing

B. Coding Testing

C. System Testing

D. Integration Testing

Câu hỏi 2.3 Mô hình tiếp cận lặp gồm các công đoạn sau. Phát biểu nào không đúng?

A. Requirements

B. Integration

C. Design & Development

D. Testing

Câu hỏi 2.4 Trong mô hình Agile/Scrum. Phát biểu nào sau đây không đúng?

A. Scope: xác định phạm vi của biến

B. Sprint: một chu kỳ phát triển ngắn, thường là 1 tới 4 tuần

C. Product backlog: danh mục các chức năng của sản phẩm

D. Sprint backlog: danh mục các chức năng của một sprint

-----

Bài sau:

Unity (4) - Hệ thống vật lý

Bài trước: Unity (3) - Logic thực thi chương trình
-----

4. Hệ thống vật lý

Tới thời điểm này, bạn đã biết được:

- Cách tạo và chạy một dự án game

- Hiểu được vòng đời Script

Phần này chúng ta sẽ cùng tìm hiểu về Hệ thống vật lý trong Unity.

Hệ thống vật lý là gì?

Trong Unity, Hệ thống vật lý (physics engine) là bộ công cụ cho phép các đối tượng tương tác với nhau theo các quy luật tự nhiên như rơi tự do, va chạm, ma sát và nảy. Để một trò chơi có cảm giác “thật”, bạn cần nắm vững 4 thành phần cốt lõi sau:

- Rigidbody 

- Colliders

- Physic materials

- Joints

Chúng ta sẽ cùng tìm hiểu về Rigidbody và thực hiện một dự án nhỏ để kết hợp nó với kiến thức Vòng đời Script (Lifecycle) mà bạn đã học.

4.1 Rigidbody

Nói một cách dễ hiểu nhất: Rigidbody là linh hồn vật lý của một đối tượng.

Trong Unity, một vật thể (như khối lập phương, quả cầu) mặc định chỉ là một cái "vỏ" đồ họa đứng yên. Khi bạn thêm thành phần (component) Rigidbody vào, bạn đang nói với Unity rằng: "Hãy áp dụng các quy luật vật lý của trái đất lên vật này".

Cụ thể:

- Trọng lực: Vật sẽ tự rơi xuống khi bắt đầu game

- Lực va chạm: Vật sẽ bị bật ra khi đụng vào vật khác

- Lực đẩy: Bạn có thể lập trình để "đá" hoặc "đẩy" vật di chuyển

Làm game “Viên gạch nhảy lò cò”

Để dễ hiểu hơn về Rigidbody chúng ta cùng làm một game đơn giản có tên là “Viên gạch nhảy lò cò”

Nội dung của game: Bạn điều khiển một viên gạch, nhấn phím Space để nó nhảy lên bằng lực vật lý, và quan sát vòng đời của nó trong Console.

Bước 1: Chuẩn bị môi trường (Scene)

1. Tạo mặt đất: Trong Unity Editor, bạn có thể tạo dự án mới, hoặc sử dụng dự án ScriptLifecycleProject đang mở sẵn ở bài học trước. Tại khung Hierarchy, chuột phải vào Main Camera > 3D Object > Plane. Đặt tên là "MatDat"

2. Tạo nhân vật: Tại khung Hierarchy, chuột phải vào Main Camera > 3D Object > Cube. Đặt tên là "VienGach". Kéo nó lên cao một chút (trục Y = 2)

3. Thêm tính vật lý cho viên gạch: Chọn "VienGach", vào Inspector (khung bên phải của Unity Editor) bấm Add Component > gõ Rigidbody

Bước 2: Viết Script điều khiển

Tại cửa sổ Project > chuột phải vào mục Assets > Create > Scripting > Empty C# Script, đặt tên là GachController. Sau đó mở trình soạn mã nguồn lên và viết như sau:

(bạn nên tự tay gõ từng dòng mã, để nhớ và hiểu mã nguồn, không nên chép/dán)

[GachController.cs]

using UnityEngine;

using UnityEngine.InputSystem;


public class GachController : MonoBehaviour

{

    private Rigidbody rb; // Biến để lưu trữ Rigidbody

    public float lucNhay = 5f; // Độ mạnh của cú nhảy


    void Awake()

    {

        // Giai đoạn Khởi tạo: Lấy Rigidbody gắn trên Cube ngay khi game chạy

        rb = GetComponent <Rigidbody>();

        Debug.Log("1. Awake: Đã kết nối với hệ thống vật lý.");

    }


    void Start()

    {

        Debug.Log("2. Start: Game đã sẵn sàng!");

    }


    void Update()

    {

        // Giai đoạn Cập nhật: Kiểm tra phím bấm mỗi khung hình

        if (Keyboard.current.spaceKey.wasPressedThisFrame)

        {

            Debug.Log("3. Update: Nhấn Space - Chuẩn bị nhảy!");

            // Gọi hàm nhảy ở FixedUpdate để xử lý vật lý chuẩn hơn

            NhayLen();

        }

    }


    void FixedUpdate()

    {

        // Đây là nơi xử lý vật lý lý tưởng nhất

    }


    void NhayLen()

    {

        // Sử dụng Rigidbody để tác động một lực hướng lên trên (Vector3.up)

        rb.AddForce(Vector3.up * lucNhay, ForceMode.Impulse);

    }


    void OnDisable()

    {

        // Giai đoạn Dọn dẹp: Khi tắt script

        Debug.Log("4. OnDisable: Script điều khiển đã dừng.");

    }

}

Bước 3: Hoàn thiện trong Unity

1. Kéo Script GachController thả vào đối tượng VienGach

2. Mở cửa sổ Console

3. Nhấn nút Play

Lưu ý: vì trong khung Hierarchy đang có nhiều object, để tắt các object không cần thiết (không cho nó chạy), bạn chọn object bên khung Hierarchy, và bỏ dấu chọn của nó ở khung Inspector. Xem hình minh họa. 

Bước 4: Quan sát kết quả

- Lúc vừa bấm nút Play: Bạn sẽ thấy viên gạch rơi xuống sàn do trọng lực (Rigidbody làm việc). Console hiển thị: Awake rồi đến Start

- Khi nhấn Space: Viên gạch nảy lên. Console hiện: Update: Nhấn Space....

- Thử nghiệm: Trong lúc game đang chạy, hãy thử bỏ tích (uncheck) cái dấu ở cạnh tên Script GachController trong Inspector. Bạn sẽ thấy dòng OnDisable xuất hiện và bạn không thể nhấn Space để nhảy nữa.

Lưu ý: khi chạy có thể bạn bị lỗi, chỉ thấy màn hình màu xanh, mà không thấy viên gạch đâu?

- Khi chọn VienGach bên Hierarchy > bấm chuột vào màn hình Game > bấm phím Space > vẫn thấy tọa độ Y của VienGach trong Inspector thay đổi > chứng tỏ vẫn có viên gạch, nhưng nó vô hình

- Bạn kiểm tra trong Inspector > Materials > sẽ thấy Element 0 có giá trị là None (Materials), nghĩa là viên gạch đang tàng hình > bạn bấm vào biểu tượng hình tròn bên cạnh > chọn Sprites-Default để viên gạch có màu trắng xám.

Tóm lại, qua bài tập trên bạn đã biết được:

- Phương thức Awake dùng để chuẩn bị các thành phần vật lý (GetComponent<Rigidbody>)

- Phương thức Update dùng để bắt sự kiện người dùng (nhấn phím)

- Rigidbody xử lý liên quan đến vật rơi, nảy và chịu tác động của lực hướng lên (AddForce)

4.2 Bài tập và câu hỏi

Bài tập 4a. Cài đặt game “Viên gạch nhảy lò cò” trong phần lý thuyết.

Câu hỏi 4.1 Hệ thống vật lý (physics engine) trong Unity là gì? Phát biểu nào không đúng?

A. Là bộ công cụ cho phép các đối tượng tương tác với nhau theo các quy luật tự nhiên như rơi tự do, va chạm, ma sát và nảy

B. Colliders là một trong những thành phần của Hệ thống vật lý

C. Rigidbody là một trong những thành phần của Hệ thống vật lý

D. Là bộ công cụ cho phép các đối tượng tương tác với nhau không theo quy luật tự nhiên như rơi tự do, va chạm, ma sát và nảy

-----

Bài sau: