Trạng thái hoạt hình dựa trên dữ liệu


14

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 đó.


1
Tôi đã nghĩ ra một ý tưởng tương tự để lưu trữ dữ liệu hoạt hình, mặc dù tôi chưa xem xét các yếu tố kích hoạt. Đây là một bài viết ngắn tôi đã viết về nó và một liên kết đến một dự án XNA mà tôi đã viết tiêu thụ XML và xử lý khía cạnh hoạt hình của mọi thứ. Tôi có một vài điều khác biệt, như khái niệm về Bộ và Chuỗi, nhưng ngoài ra, tôi nghĩ bạn đang đi đúng hướng.
John McDonald

2
Không phải là thiết kế của bạn tệ (không phải vậy, nó rất giống với hệ thống tương tự tôi đã xây dựng trong thời gian qua), nhưng chính xác câu hỏi của bạn ở đây là gì? Tôi nghĩ rằng nó thực sự có thể đứng để rõ ràng hơn.
MrCranky

@ John - Cảm ơn bạn, tôi sẽ xem nó vào tối nay. @ MrCranky - Chà, chủ yếu chỉ là những gì bạn nói. Nếu đó là bất kỳ lời khuyên / liên kết tốt đến các phương pháp được thiết lập nhiều hơn. Tôi thực sự ở trong bóng tối ở đây kinh nghiệm khôn ngoan.
dùng8363

1
Tôi muốn đưa ra một khuyến nghị cho độ sâu của thông tin được cung cấp nhưng, để lặp lại MrCranky, tôi không thực sự làm theo câu hỏi là gì. Đối với lời khuyên cá nhân của riêng tôi (mà sinh ra từ việc xây dựng loại hệ thống này một vài tuần trở lại đây) tôi muốn nói rằng bạn đang ở trên đó.
Mike Cluck

@MikeC Đó chỉ là câu trả lời tôi cần. Tôi xin lỗi vì thực tế tôi không thể nói rõ hơn về câu hỏi của mình. Có lẽ nếu tôi không phát hiện ra nó sẽ giống một câu hỏi hơn :). Thực tế là tôi không thể tìm thấy nhiều tài nguyên liên quan đến trạng thái hoạt hình và những tài nguyên đã mã hóa cứng nên việc tạo / thay đổi nội dung sẽ là một cơn ác mộng. Vì vậy, câu hỏi của tôi là: cách tiếp cận này có đúng hay không? Và nếu các bạn nói vậy, thì tốt thôi :).
dùng8363

Câu trả lời:


4

Các clip hoạt hình được mô tả tốt nhất bằng dữ liệu cũ, như bạn đã thực hiện trong đoạn mã XML đầu tiên của mình. Bạn có thể làm điều này bằng tay, hoặc xuất nó từ một gói nghệ thuật. Dù bằng cách nào, có lẽ bạn sẽ muốn tạo một đường ống lấy nó từ định dạng trung gian có thể đọc được của con người như XML và đặt nó vào một thứ gì đó đẹp và nhanh chóng để tải.

Bước tiếp theo là có thể kết xuất đồ vật. Nếu bạn đang sử dụng một số loại biểu đồ cảnh, điều đó có thể có nghĩa là tạo một Nút hoạt hình cho nó. Bạn sẽ có thể cho biết nút hoạt hình mà nó hiện đang phát và hiện tại nó đang ở đâu trong dòng thời gian. Hãy chắc chắn rằng bạn giữ thông tin hộp giới hạn có thể truy cập ở cấp độ này để bạn có thể dễ dàng đưa thông tin vào hệ thống loại bỏ của mình.

Bây giờ, bạn sẽ muốn liên kết một hình ảnh động với một thực thể trò chơi. Tôi có xu hướng sử dụng một mô hình dựa trên thành phần, vì vậy đối với tôi điều này có nghĩa là thành phần AnimState. Đây là lớp trung gian của bạn giữa trò chơi và kết xuất. Nó theo dõi hoạt hình nào mà một thực thể đang phát, các chế độ phát (lặp, một lần, bóng bàn, v.v.), thời gian, v.v. Nó có thể gửi các sự kiện như "hoạt hình" trở lại thực thể và cập nhật trạng thái của mã hoạt hình khi thích hợp . AnimStates cho các thực thể hoạt động sẽ được cập nhật một lần trên mỗi sim nếu họ đang chơi hoạt hình.

Một thành phần hoạt hình có lẽ là đủ cho các mục trò chơi đơn giản (đạo cụ nền cơ bản và tương tự), nhưng đối với các thực thể phức tạp hơn, bạn sẽ muốn sử dụng một máy trạng thái để điều chỉnh nó. Điều này được thể hiện tốt nhất bằng một ngôn ngữ kịch bản như Lua hoặc Python. Một trạng thái có thể có một số khối chức năng (on Entry, onExit, onUpdate, onEvent), cũng như một dòng thời gian chỉ định một số hành động và kích hoạt nhất định sẽ xảy ra vào những thời điểm nhất định. Bạn có thể sẽ có một số loại trình quản lý chịu trách nhiệm cập nhật các máy trạng thái này khi thích hợp, cũng như kích hoạt các cuộc gọi lại dòng thời gian khi chúng xảy ra. Bạn nên cố gắng giữ những điều này dựa trên sự kiện càng tốt, vì mỗi OnUpdate bạn viết sẽ là một chi phí tuyến tính với số lượng thực thể. Bạn cũng sẽ muốn có thể chỉ định các thẻ ('tấn công', 'nhàn rỗi', 'Bỏ qua', v.v.) được liên kết với cả trạng thái và các vùng thời gian nhất định của các trạng thái. Có lẽ bạn cũng muốn một số trình xử lý sự kiện cấp cao áp dụng cho toàn bộ biểu đồ trạng thái chứ không chỉ là một trạng thái cụ thể.

Các nhân vật 'Sentient' có thể cũng sẽ có một loại AI. Tôi có xu hướng tạo ra một thành phần 'đầu máy' cụ thể xử lý việc đi bộ xung quanh. Nó giao tiếp với máy phân loại sử dụng hệ thống tín hiệu và sự kiện và truy vấn các thẻ trạng thái và có thể được yêu cầu "đi bộ tới điểm" hoặc "chạy theo một hướng nhất định ở một tốc độ nhất định". Các thành phần AI cấp cao hơn (như cây hành vi hoặc bất cứ thứ gì) sau đó có thể sử dụng giao diện này mà không phải lo lắng về các chi tiết.


1

Hệ thống hoạt hình dựa trên dữ liệu tốt nhất mà tôi thấy cho đến nay là Blend Tree . Thực sự, nó rất tốt và nó có thể làm tất cả những gì bạn yêu cầu ở đây. Theo AIGameDev.com, giờ đây nó là tiêu chuẩn thực tế trong ngành và tôi tin rằng họ đúng.

Thật không may, tôi không tìm thấy tài nguyên tốt nào với việc nhanh chóng, nhưng bạn có thể thử cái này hoặc cái kia để có cái nhìn tổng quan. Ngoài ra còn có một bài viết trả tiền trên AIGameDev.com, không biết có đáng để có một tài khoản cao cấp không.


Đây là một nguồn rất tốt, cảm ơn bạn. Tôi đang tìm kiếm thông tin như thế này.
user8363

1
Không thể trộn hoạt ảnh với các tấm sprite rời rạc, chỉ với hoạt hình
khung
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.