Bài đăng

Hiển thị các bài đăng có nhãn game programming

SERIES SOLID PHẦN 2: Single Responsibility Principle

Hình ảnh
Nội dung nguyên lý : Một class chỉ giữ một trách nhiệm duy nhất , hay nói cách khác , muốn modify class này thì chỉ có một lý do duy nhất Vi phạm SRP( Single Responsibility Principle) Ta có ví dụ điển hình trên, một con dao có quá nhiều chức năng. Khi một phần nào đó trong dao bị hư, ta phải tháo ra toàn bộ chức năng sau đó lấp lại, trong khi đó các con dao khác lại không bị hư hỏng gì => tốn kém, tốn thời gian modify, quản lý thời gian không hiệu quả. Tại sao nên áp dụng SRP? Đối với các quy trình phần mềm nói chung việc thay đổi requirement là liên tục và rất dynamic , vì vậy việc chỉnh sửa code cũng liên tục. Việc một class quá to sẽ rất khó quản lý , quá cồng kềnh dẫn đến modify rất cực , muốn modify phải đọc lại toàn source? Dễ ảnh hưởng đển các module khác. Áp dụng Single responsibility principle như thế nào? Để áp dụng với single responsibility principle cụ thể với con dao phía trên ta chỉ phần tách các con dao chức năng thành các class nhỏ hơn, thế là xong. Khi 1 phần dao nà...

SERIES SOLID PHẦN 1: SOLID là gì? 5 nguyên tắc vàng cho dev xịn

Theo sách game programming pattern: một kiến trúc phần mềm tốt là một phần mềm được thiết kế như thể nó đúng hoàn toàn như dự đoán từ đầu đã đề ra, nghĩa là ta sẽ giải quyết mọi task một cách dễ dàng chỉ với một vài function với vị trí đặt function là hoàn hảo, không ảnh hưởng đến các đoạn mã đã viết, không để lại một chút "gợn" nào trên bề mặt yên bình của các dòng mã. Đễ làm được điều đó dễ dàng, các dev như chúng ta không thể nào bỏ qua được SOLID, những nguyên lý vàng trong việc phát triển và xây dựng phần mềm( tất nhiên phải có sự kết hợp của cả design pattern, nhưng trong phạm vi bài này mình sẽ chỉ nói SOLID). SOLID RA ĐỜI NHƯ THẾ NÀO? Lập trình hướng đối tượng là mô hình lập trình cực kì mạnh mẽ và được áp dụng nhiều nhất ngày nay, Các tính chất đặc biệt của nó khiến nó trở nên nổi bật hơn bất kì mô hình lập trình nào khác đó chính là: Encapsulation( Đóng gói ) Abstraction( Trừ tượng ) Inheritance( Kế thừa ) Polymorphism( Đa hình ) Tuy nhiên, không phải lập trình viê...

Toán vector là cái vẹo gì?

Hình ảnh
Cứ nhắc đến vector lại nhớ đến những năm tháng lớp 10 hoàng kim , thời mà đầu những năm cấp 3 lại phải chơi cùng những thứ gọi là vector nhưng chả biết để phải làm gì :)) . Mình khá may mắn vì có người thầy tâm huyết chỉ cho mình từng ứng dụng chi tiết sau mỗi bài học nhưng rồi cũng quên cho đến khi mình bắt đầu làm game thì mới đụng lại vector và hiểu ứng dụng của nó cực kì mạnh mẽ trong làm game nói riêng . Trong ngữ cảnh bài này , mình sẽ giới thiệu sơ qua toán vector và cách ứng dụng toán vector trong làm game cụ thể là unity engine. 1. Toán vector cơ bản Trong toán học , người ta định nghĩa vector là đại lượng biểu diễn cho hướng và độ lớn . Trong không gian vector được xác định bởi 3 đại lượng x , y ,z Tương tự , trong unity ta có cấu trúc Vector3 , nó đại diện cho cả Points và Vectors. Một point đại diện cho 1 vị trí nào đó trong không gian trò chơi , còn một Vector đại diện cho hướng và độ lớn Trong không gian , Đối với một point có tọa độ x ,y ,z là một vị trí duy nhất và đối...

Make AI with State Design Pattern

Hình ảnh
Hôm nay đang trong thời gian chạy deadline nhập môn kỹ thuật phần mềm , cụ thể là con game "The Walker" của team tụi mình , mình cần phải làm một con AI cụ thể là con zombie với các chức năng : tìm đường , tự động tấn công trong phạm vi cố định , chuyển sang trạng thái đứng yên khi ông có người chơi đứng gần , vân vân mây mây. Đây có lẽ là một tính năng rất bình thường , mọi chuyện vẫn suôn sẻ cho đến khi mình thêm 1 state mới và cứ như vậy code của mình hầu như phải sửa đi sửa lại nhìn rất không được clean theo phong cách OOP mà mình hướng đến Trong phạm vi bài viết này mình sẽ nói cách làm ban đầu của mình và sự cải tiến khi dùng State Design Pattern Cách giải quyết ban đầu Mình nghĩ mọi người đều sẽ nghĩ rằng : tạo 1 enum cho zombie , và dùng if else để thay đổi trạng thái của nó ví dụ : enum Status { Idle, Chase, } IEnumerator AIZombie() { float dis = Vector3.Distance(transform.position, player.transform.position); switch (W...