Xử lý các lệnh hoặc sự kiện chờ đợi một hành động được hoàn thành sau đó


7

Giả sử bạn có hai sự kiện: Action1 và Action2. Khi bạn nhận được Action1, bạn muốn lưu trữ một số dữ liệu tùy ý sẽ được sử dụng vào lần tiếp theo Action2 xuất hiện. Tối ưu, Action1 thường là một lệnh tuy nhiên nó cũng có thể là các sự kiện khác. Ý tưởng vẫn vậy.

Cách hiện tại tôi đang thực hiện điều này là bằng cách lưu trữ trạng thái và sau đó chỉ cần kiểm tra khi Action2 được gọi nếu trạng thái cụ thể đó ở đó. Điều này rõ ràng là một chút lộn xộn và dẫn đến rất nhiều mã dư thừa. Đây là một ví dụ về cách tôi đang làm điều đó, ở dạng mã giả (và bị phá vỡ khá nhiều, rõ ràng):

void onAction1(event) {
    Player = event.getPlayer()
    Player.addState("my_action_to_do")
}

void onAction2(event) {
    Player = event.getPlayer()

    if not Player.hasState("my_action_to_do") {
        return
    }

    // Do something
}

Khi làm điều này cho rất nhiều hành động khác, nó trở nên hơi xấu và tôi muốn biết liệu tôi có thể làm gì để cải thiện nó không.

Tôi đã nghĩ về một cái gì đó như thế này, sẽ không yêu cầu truyền dữ liệu xung quanh, nhưng đây có phải là hướng đi đúng không?

void onAction1(event) {
   Player = event.getPlayer()
   Player.onAction2(new Runnable() {

       public void run() {
           // Do something
       }

   })
}

Nếu một người muốn đưa nó đi xa hơn, bạn có thể không đơn giản làm điều này?

void onPlayerEnter(event) { // When they join the server
    Player = event.getPlayer()
    Player.onAction1(new Runnable() {

       public void run() {

           // Now wait for action 2
           Player.onAction2(new Runnable() {
               // Do something
           })

       }

    }, true) // TRUE would be to repeat the event,
             // not remove it after it is called.
}

Bất kỳ đầu vào sẽ là tuyệt vời.


4
Tra cứu mẫu Danh sách hành động (cũng là hàng đợi lệnh). Tuy nhiên, nói chung, mong đợi một số sự chậm chạp vẫn còn; logic trò chơi thường không có khả năng bị biến thành các mô hình gọn gàng.
Sean Middleditch

Câu trả lời:


1

Tôi nghĩ ví dụ ban đầu của bạn là đơn giản nhất. Nếu tôi phải làm bất cứ điều gì tôi sẽ có một ActionManager trung tâm. Các hành động có thể đăng dữ liệu lên nó để các hành động khác nhận sau. Tôi gần như giống như một hệ thống Sự kiện ngoại trừ việc "Tin nhắn" không được gửi đến một thực thể, họ ngồi đơn giản, chờ đợi một Hành động để nhận chúng.

Điều đó sẽ giúp tách rời Action1 khỏi Action2 để nếu bạn muốn kết nối Action3 với Action2 tốt nhất có thể. Action2 không biết hoặc quan tâm đến 1 hoặc 3, tất cả những gì nó quan tâm là tìm kiếm Action2Message.


0

Thật khó để đưa ra giải pháp mà không biết ActionListener / Handler / Manager của bạn trông như thế nào

theo cách tôi sẽ làm (tôi là nhà phát triển ac #, nhưng tôi nghĩ điều tương tự là có thể có trong java):

thay vì đăng ký nhà nước

Player.addState("my_action_to_do")

tôi sẽ có một Stack of ActionListener cho các sự kiện Action2, trong đó sự kiện void onAction1 () sẽ thêm một trình xử lý sẽ được gọi nếu Action2 được gọi:

(tôi sẽ thử trong java, có thể không thực thi được):

Stack<ActionListener> onAction2Events = new ...;

void onAction1(event) {
    Player = event.getPlayer();
    onAction2Events.add(new ActionListener() {
      public void actionPerformed(ActionEvent e) { 
          // this code will be called if onAction2 is invoked
      }
    });
}

void onAction2(event) {
    Player = event.getPlayer()

    InvokeEvent(onAction2Events); // calls all ActionListeners / states that ware added

    // ...
}

void InvokeEvent(Stack<ActionListener> listenerStack) {

    while(listenerStack not empty)
    {
        listenerStack.pop().actionPerformed(...);
    }
}
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.