Gần đây tôi đã thực hiện một trò chơi Space Invadors đơn giản bằng cách sử dụng 'hệ thống thực thể'. Đó là một mô hình phân tách các thuộc tính và hành vi cực kỳ tốt. Tôi đã mất vài lần lặp lại để hiểu đầy đủ về nó, nhưng một khi bạn nhận được một vài thành phần được thiết kế, nó sẽ trở nên cực kỳ đơn giản để soạn thảo các đối tượng mới bằng cách sử dụng các thành phần hiện có của bạn.
Bạn nên đọc nó:
http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/
Nó được cập nhật thường xuyên bởi một anh chàng cực kỳ hiểu biết. Đây cũng là cuộc thảo luận hệ thống thực thể duy nhất với các ví dụ mã cụ thể.
Lặp đi lặp lại của tôi như sau:
Lặp lại đầu tiên có một đối tượng "EntitySystem" giống như Adam mô tả; tuy nhiên các thành phần của tôi vẫn có các phương thức - thành phần 'có thể hiển thị' của tôi có phương thức paint () và thành phần vị trí của tôi có phương thức move () và v.v. Khi tôi bắt đầu xác định các thực thể tôi nhận ra rằng tôi cần bắt đầu chuyển tin nhắn giữa các thành phần và ra lệnh thực hiện các cập nhật thành phần .... cách quá lộn xộn.
Vì vậy, tôi đã quay lại và đọc lại blog của T-Machines. Có rất nhiều thông tin trong các luồng nhận xét - và trong đó, ông thực sự nhấn mạnh rằng các thành phần không có hành vi được cung cấp bởi các hệ thống thực thể. Theo cách này, bạn không cần chuyển thông điệp giữa các thành phần và cập nhật thành phần vì thứ tự được xác định theo thứ tự toàn cầu của hệ thống thực thi. Đồng ý. Có lẽ đó là quá trừu tượng.
Dù sao cho lần lặp # 2, đây là những gì tôi lượm lặt được từ blog:
EntityManager - hoạt động như "cơ sở dữ liệu" thành phần, có thể được truy vấn cho các thực thể có chứa một số loại thành phần nhất định. Điều này thậm chí có thể được hỗ trợ bởi cơ sở dữ liệu trong bộ nhớ để truy cập nhanh ... xem phần 5 của máy t để biết thêm thông tin.
EntitySystem - Mỗi hệ thống về cơ bản chỉ là một phương thức hoạt động trên một tập hợp các quyền. Mỗi hệ thống sẽ sử dụng thành phần x, y và z của một thực thể để hoàn thành công việc. Vì vậy, bạn sẽ truy vấn người quản lý cho các thực thể với các thành phần x, y và z sau đó chuyển kết quả đó cho hệ thống.
Thực thể - chỉ là một id, giống như một dài. Thực thể là nhóm các nhóm thành phần với nhau thành một 'thực thể'.
Thành phần - một tập hợp các lĩnh vực .... không có hành vi! Khi bạn bắt đầu thêm các hành vi, nó bắt đầu trở nên lộn xộn ... ngay cả trong một trò chơi Space Invadors đơn giản.
Chỉnh sửa : nhân tiện, 'dt' là thời gian delta kể từ lần gọi vòng lặp chính cuối cùng
Vì vậy, vòng lặp Invadors chính của tôi là:
Collection<Entity> entitiesWithGuns = manager.getEntitiesWith(Gun.class);
Collection<Entity> entitiesWithDamagable =
manager.getEntitiesWith(BulletDamagable.class);
Collection<Entity> entitiesWithInvadorDamagable = manager.getEntitiesWith(InvadorDamagable.class);
keyboardShipControllerSystem.update(entitiesWithGuns, dt);
touchInputSystem.update(entitiesWithGuns, dt);
Collection<Entity> entitiesWithInvadorMovement = manager.getEntitiesWith(InvadorMovement.class);
invadorMovementSystem.update(entitiesWithInvadorMovement);
Collection<Entity> entitiesWithVelocity = manager.getEntitiesWith(Velocity.class);
movementSystem.move(entitiesWithVelocity, dt);
gunSystem.update(entitiesWithGuns, System.currentTimeMillis());
Collection<Entity> entitiesWithPositionAndForm = manager.getEntitiesWith(Position.class, Form.class);
collisionSystem.checkCollisions(entitiesWithPositionAndForm);
Thoạt nhìn có vẻ hơi lạ, nhưng nó cực kỳ linh hoạt. Nó cũng rất dễ dàng để tối ưu hóa; đối với các loại thành phần khác nhau, bạn có thể có các kho dữ liệu sao lưu khác nhau để phục hồi nhanh hơn. Đối với lớp 'biểu mẫu', bạn có thể hỗ trợ lớp bốn để tăng tốc độ truy cập để phát hiện va chạm.
Tôi thích bạn; Tôi là một nhà phát triển dày dạn kinh nghiệm nhưng không có kinh nghiệm viết trò chơi. Tôi đã dành một chút thời gian nghiên cứu đưa ra các mẫu dev, và cái này lọt vào mắt tôi. Đây không phải là cách duy nhất để làm mọi thứ, nhưng tôi đã thấy nó rất trực quan và mạnh mẽ. Tôi tin rằng mô hình đã được thảo luận chính thức trong cuốn 6 của loạt bài "Đá quý lập trình trò chơi" - http://www.amazon.com/Game-Programming-Gems/dp/1584500492 . Bản thân tôi chưa đọc bất kỳ cuốn sách nào nhưng tôi nghe chúng là tài liệu tham khảo thực tế cho lập trình trò chơi.