Làm thế nào để chuyển đổi giữa các trạng thái và trộn trạng thái trong một máy trạng thái hữu hạn?


7

Tôi không hiểu cách sử dụng máy trạng thái hữu hạn với thực thể do người chơi điều khiển.

Ví dụ tôi có một trò chơi theo phong cách Mario (nền tảng 2d). Tôi có thể nhảy, chạy, đi bộ, gây sát thương, bơi lội, v.v. Vì vậy, suy nghĩ đầu tiên của tôi là sử dụng hành động này như các trạng thái. Nhưng điều gì xảy ra, nếu bạn đang chạy khi bạn nhận sát thương? Hoặc nhảy, nhận sát thương và bắn cùng một lúc?

Tôi chỉ muốn thêm các chức năng (hành động) cho người chơi một cách sạch sẽ (không sử dụng nó cho tất cả các hành động trong bản cập nhật thực thể).


2
Câu hỏi có phần kỳ quái; Tại sao các hành động sẽ là trạng thái trong FSM? Tại sao họ không phải là đầu vào cho FSM?

Câu trả lời:


7

Tôi đoán cách thông thường là có nhiều máy trạng thái. Bằng cách này, bạn có thể bám vào các trạng thái nguyên tử thường làm cho cuộc sống của bạn dễ dàng hơn nhiều so với việc phải đối phó với các trạng thái phức tạp.

Ví dụ:

  • Chế độ sát thương: Bình thường, bất khả xâm phạm (như vừa đánh), bất khả chiến bại (như có một ngôi sao)
  • Tốc độ: Chế độ đi bộ, Chế độ chạy
  • Khả năng: Bình thường, Siêu, Lửa, Bay
  • Loại chuyển động: Đi bộ, Bơi, Bay

Trong thiết kế hướng đối tượng có mẫu sate cho việc này. Nó sôi sùng sục khi có một giao diện cho mỗi máy trạng thái. Và một lớp cho mỗi trạng thái có thể thực hiện giao diện này.

Để đưa ra một ví dụ: Sẽ có một giao diện DamageMode và các lớp con NormalDamageMode, InvulnerableDamageMode và InvincibleDamageMode. Bất cứ khi nào người chơi va chạm với kẻ thù, phương thức DamageMode.collision (kẻ thù) được gọi. Nó được xử lý bởi các lớp chịu trách nhiệm cho tình trạng hiện tại.

Vì vậy, nếu damageMode == NormalDamageMode, người chơi sẽ bị hỏng và biến trạng thái sẽ được đặt thành InvulnerableDamageMode. Trong InvulnerableDamageMode không có gì xảy ra và trong InvincibleDamageMode kẻ thù sẽ bị tổn hại. Tất nhiên cần phải có bộ định thời để quay trở lại từ InvulnerableDamageMode và InvincibleDamageMode sang NormalDamageMode.

Ưu điểm chính của mẫu trạng thái so với if-otherif-otherif-otherif-blocks là nó cho phép cấu trúc mã của bạn tốt hơn.


+1 để tạo nhiều FSM nhỏ, thay vì một 'un lớn. Grainularity rất hữu ích ở đây.
tenpn

Tôi thích ý tưởng của nhiều máy trạng thái. Nhưng làm thế nào chúng được tích hợp để làm việc với một thực thể? Chúng có được cập nhật song song không? hoặc chúng được lồng trong một máy trạng thái thực thể?
Dani

@Dani, mỗi máy trạng thái được tham chiếu như một thuộc tính của các đối tượng thực thể. Hầu hết trong số họ là độc lập chẳng hạn, bạn có thể bất khả chiến bại với Khả năng nhỏ, siêu, lửa và bay. Một số sự kiện kích hoạt nhiều chuyển trạng thái: Ví dụ: bị kẻ thù tấn công sẽ làm giảm khả năng và thay đổi chế độ sát thương thành bất khả xâm phạm. Điều này chỉ để lại một vài trường hợp trong đó hai máy trạng thái thực sự được liên kết. Ví dụ như chế độ chạy lực trong khi bất khả chiến bại.
Hendrik Brummermann

7

Các trạng thái không phải là hành động, trong trò chơi của bạn, chúng sẽ kiểm soát cách cập nhật nhân vật (ví dụ: mỗi trạng thái có thể có chức năng cập nhật () riêng).

Hãy xem sơ đồ trên trang này: http://en.wikipedia.org/wiki/State_diagram . Các tiểu bang cho chúng ta biết một cái gì đó về thế giới (cánh cửa đang mở hoặc đóng). Các hành động cho chúng ta thấy những gì đưa thế giới từ trạng thái này sang trạng thái khác.

Trong trường hợp của bạn, bạn có thể có các trạng thái như:

  • nhảy
  • đang chạy
  • trong tình trạng đau đớn
  • té ngã
  • đã chết

Và quá trình chuyển đổi giữa các trạng thái (các sự kiện / mũi tên giữa các trạng thái) sẽ là đầu vào và phản ứng của người chơi với thế giới, như:

  • đánh quái vật
  • nhấn nút nhảy
  • nhấn nút

Mỗi tiểu bang cần kiểm tra nếu có bất kỳ sự kiện liên quan đã xảy ra. Thông thường, điều này được thực hiện với câu lệnh if.

Nhưng điều gì xảy ra khi bạn đang chạy khi bạn nhận sát thương?

Sự hit by monsterkiện này sẽ được kích hoạt và chuyển người chơi vào in paintrạng thái.

hoặc nhảy nhận sát thương và bắn cùng một lúc?

Người chơi sẽ chuyển sang in paintrạng thái một lần nữa, đó là nơi bạn có thể hiển thị sprite "hit" của mình cho thấy nhân vật ngã về phía sau.

Bạn có thể sẽ không thoát nếu phát biểu, nhưng bạn có thể tránh các tuyên bố lồng nhau sâu sắc.

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.