Duy trì / Cập nhật số lượng lớn các quốc gia người chơi


7

Tôi đang phát triển một trò chơi chiến đấu để rèn luyện các kỹ năng của mình trong Java và tôi muốn biết đâu sẽ là cách tiếp cận tốt nhất để tìm ra cách dễ dàng mở rộng số lượng trạng thái mà người chơi có thể có mà không phải loay hoay với một lượng lớn mã. Với một số lượng nhỏ các trạng thái như, inAir, isHurt, isRucky, tôi có thể mã hóa tất cả các điều kiện tôi cần. Những điều như 'nhảy' chỉ có thể xảy ra khi '! InAir', v.v. Tuy nhiên, đối với dự án của tôi, có một số lượng lớn các trạng thái tôi không biết cách tổ chức. Đây là một sơ đồ nhỏ tôi đã vẽ lại:

FSM

Cách tiếp cận của tôi là lập một bảng liệt kê gọi là Nhà nước và thực hiện một trường hợp chuyển đổi giữa chúng. Tôi không chắc đây có phải là cách tốt để làm việc này không và tôi đang cố gắng học một phương pháp tốt hơn nếu có.


4
đọc một điều này có thể giúp ích, hy vọng rằng một câu trả lời chi tiết hơn đi kèm với tôi quá quan tâm.
lozzajp

Mũi tên đỏ là gì? Bạn không thể rẽ khi đi bộ?
1000ml

Và làm thế nào để bạn hiện xử lý đầu vào và chuyển đổi giữa các trạng thái?
1000ml

Câu trả lời:


1

Tôi sẽ tổ chức nó tương tự như những gì bạn mô tả.

Mã giả:

enum totalStates = {STATE_1, STATE_2, ..., STATE_N};
totalStates state = totalStates.STATE_1;

void Update() {

    switch (state) {

        case totalStates.STATE_1:
            // update STATE_1
            break;

        // ... other states ...

    }

}

bool initState(totalStates newState) {

    switch (newState) {

        case totalStates.STATE_1:
            // check if the object's data allow the object to move to STATE_1
            if (canState1) {
                state = totalStates.STATE_1;
                return true;
            }
            return false;

        // ... other states ...
    }

Vì vậy, mỗi khi bạn muốn đối tượng của mình chuyển sang trạng thái mới, hãy gọi initState(totalStates.STATE_2)(hoặc bất kỳ trạng thái nào khác) và nếu nó trả về truethì đối tượng đã chuyển sang trạng thái đó, nếu nó quay trở lại false, đối tượng sẽ từ chối chuyển sang trạng thái đó. Ví dụ: nếu một nhân vật ở trên không và người dùng nhấn nút nhảy lần nữa, chương trình sẽ yêu cầu đối tượng chuyển sang trạng thái nhảy, đối tượng sẽ thấy nó đã ở trên không và từ chối.

Nếu bạn lo lắng về khả năng mở rộng và tổ chức vì bạn có quá nhiều trạng thái, bạn có thể tách logic trạng thái để sử dụng các chức năng khác nhau, như updateState1()hoặc updateState2()v.v.


1

Ngoài ra, bạn có thể thử cơ cấu lại mã của mình để có một vài loại Trạng thái khác nhau được đặt độc lập, như Stance, Movement, IsDazed, v.v. Ngoài ra, bạn có thể tạo một hệ thống Bang / SubState nơi SubState cung cấp chi tiết hơn ở trên cùng Nhà nước nói chung.

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.