EDIT: Để làm rõ chính xác câu hỏi của tôi là gì: đây có phải là cách tốt để xử lý trạng thái hoạt hình / hoạt hình trong một công cụ trò chơi với con mắt về sáng tạo / quản lý nội dung không? Những sai sót khi làm theo cách này là gì và đâu là cách khác để làm điều đó? - Mặc dù câu trả lời của tôi đã được trả lời một phần trong các ý kiến, vì nó dường như là cách để đi.
Tôi đang cố gắng xử lý các hình ảnh động trong một dự án sở thích công cụ trò chơi 2D , mà không mã hóa chúng. Trạng thái hoạt hình mã hóa cứng có vẻ như là một hiện tượng phổ biến nhưng rất kỳ lạ, với tôi.
Một chút nền tảng: Tôi đang làm việc với một hệ thống thực thể nơi các thành phần là các túi dữ liệu và các hệ thống con hoạt động theo chúng. Tôi đã chọn sử dụng một hệ thống bỏ phiếu để cập nhật trạng thái hoạt hình.
Với các trạng thái hoạt hình, ý tôi là: "walk_left", "running_left", "walk_right", "shooting", ...
Ý tưởng của tôi để xử lý hình ảnh động là thiết kế nó như một mô hình hướng dữ liệu . Dữ liệu có thể được lưu trữ trong tệp xml, rdbms, ... Và có thể được tải khi bắt đầu trò chơi / cấp / ... Bằng cách này, bạn có thể dễ dàng chỉnh sửa hình động và chuyển tiếp mà không phải thay đổi mã ở mọi nơi trong trò chơi.
Như một ví dụ tôi đã thực hiện một bản nháp xml về các định nghĩa dữ liệu mà tôi có trong đầu.
Một phần dữ liệu rất quan trọng chỉ đơn giản là mô tả của một hình ảnh động . Một hình ảnh động sẽ có một id duy nhất (một tên mô tả). Nó sẽ giữ một id tham chiếu cho một hình ảnh (bảng sprite mà nó sử dụng, bởi vì các hình ảnh động khác nhau có thể sử dụng các bảng sprite khác nhau). Các khung hình mỗi giây để chạy hình ảnh động trên. "Phát lại" ở đây xác định nếu một hình ảnh động nên được chạy một lần hoặc vô hạn. Sau đó, tôi xác định một danh sách các hình chữ nhật là khung.
<animation id='WIZARD_WALK_LEFT'>
<image id='WIZARD_WALKING' />
<fps>50</fps>
<replay>true</replay>
<frames>
<rectangle>
<x>0</x>
<y>0</y>
<width>45</width>
<height>45</height>
</rectangle>
<rectangle>
<x>45</x>
<y>0</y>
<width>45</width>
<height>45</height>
</rectangle>
</frames>
</animation>
Dữ liệu hoạt hình sẽ được tải và lưu giữ trong nhóm tài nguyên hoạt hình và được tham chiếu bởi các thực thể trò chơi đang sử dụng nó. Nó sẽ được coi là một tài nguyên như hình ảnh, âm thanh, kết cấu, ...
Phần dữ liệu thứ hai cần xác định sẽ là một máy trạng thái để xử lý các trạng thái hoạt hình và chuyển tiếp. Điều này xác định mỗi trạng thái mà một thực thể trò chơi có thể ở trong đó, trạng thái có thể chuyển sang và trạng thái nào thay đổi trạng thái đó.
Máy trạng thái này sẽ khác nhau từ thực thể để thực thể. Bởi vì một con chim có thể có trạng thái "đi bộ" và "bay" trong khi con người chỉ có trạng thái "đi bộ". Tuy nhiên, nó có thể được chia sẻ bởi các thực thể khác nhau vì nhiều người có thể sẽ có cùng trạng thái (đặc biệt là khi bạn xác định một số NPC phổ biến như quái vật, v.v.). Ngoài ra, một con Orc có thể có cùng trạng thái với con người. Chỉ để chứng minh rằng định nghĩa trạng thái này có thể được chia sẻ nhưng chỉ bởi một nhóm các thực thể trò chơi được chọn .
<state id='IDLE'>
<event trigger='LEFT_DOWN' goto='MOVING_LEFT' />
<event trigger='RIGHT_DOWN' goto='MOVING_RIGHT' />
</state>
<state id='MOVING_LEFT'>
<event trigger='LEFT_UP' goto='IDLE' />
<event trigger='RIGHT_DOWN' goto='MOVING_RIGHT' />
</state>
<state id='MOVING_RIGHT'>
<event trigger='RIGHT_UP' goto='IDLE' />
<event trigger='LEFT_DOWN' goto='MOVING_LEFT' />
</state>
Những trạng thái này có thể được xử lý bởi một hệ thống bỏ phiếu . Mỗi trò chơi đánh dấu nó lấy trạng thái hiện tại của một thực thể trò chơi và kiểm tra tất cả các kích hoạt. Nếu một điều kiện được đáp ứng, nó sẽ thay đổi trạng thái của thực thể thành trạng thái "goto".
Phần cuối cùng tôi đã đấu tranh là làm thế nào để liên kết dữ liệu hoạt hình và trạng thái hoạt hình với một thực thể . Cách tiếp cận hợp lý nhất đối với tôi là thêm một con trỏ vào dữ liệu máy trạng thái mà một thực thể sử dụng và để xác định cho từng trạng thái trong máy đó sử dụng hoạt hình nào.
Dưới đây là một ví dụ xml về cách tôi sẽ xác định hành vi hoạt hình và biểu diễn đồ họa của một số thực thể phổ biến trong trò chơi, bằng cách giải quyết trạng thái hoạt hình và id dữ liệu hoạt hình. Lưu ý rằng cả "wizard" và "orc" có cùng trạng thái hoạt hình nhưng hoạt ảnh khác nhau. Ngoài ra, một hình ảnh động khác nhau có thể có nghĩa là một tấm sprite khác nhau, hoặc thậm chí là một chuỗi hoạt hình khác nhau (một hình ảnh động có thể dài hơn hoặc ngắn hơn).
<entity name="wizard">
<state id="IDLE" animation="WIZARD_IDLE" />
<state id="MOVING_LEFT" animation="WIZARD_WALK_LEFT" />
</entity>
<entity name="orc">
<state id="IDLE" animation="ORC_IDLE" />
<state id="MOVING_LEFT" animation="ORC_WALK_LEFT" />
</entity>
Khi thực thể được tạo, nó sẽ thêm một danh sách các trạng thái với dữ liệu máy trạng thái và tham chiếu dữ liệu hoạt hình.
Trong tương lai tôi sẽ sử dụng hệ thống thực thể để xây dựng toàn bộ thực thể bằng cách xác định các thành phần theo định dạng xml tương tự.
-
Đây là những gì tôi đã đưa ra sau một số nghiên cứu. Tuy nhiên tôi đã gặp một số rắc rối khi phải quay đầu lại, vì vậy tôi đã hy vọng có một số phản hồi. Có điều gì ở đây không có ý nghĩa gì, hoặc có cách nào tốt hơn để xử lý những điều này? Tôi đã nắm bắt được ý tưởng lặp qua các khung nhưng tôi gặp khó khăn để tiến thêm một bước và đây là nỗ lực của tôi để làm điều đó.