Làm cách nào tôi có thể cập nhật HUD dựa trên Giai đoạn từ Diễn viên của Giai đoạn khác trong libGDX?


7

Tôi cảm thấy như đây là một vấn đề đơn giản, nhưng tôi gặp vấn đề khi tìm cụm từ tìm kiếm chính xác.

Tôi có một Screenbao gồm hai Stages.

  1. Đầu tiên, stagechứa một số đối tượng xuất phát Actorvà được thêm vào thông qua tiêu chuẩn stage.addActor(Actor). Điều này là cho các đối tượng trò chơi thực tế.

  2. Thứ hai, hudStagebao gồm một Tablediễn viên duy nhất . Bảng này bao gồm một nút cũng như hai Labels. Cái này dành cho giao diện người dùng tĩnh / HUD.

Tôi đang xử lý các sự kiện chạm vào các diễn viên tùy chỉnh của mình trong giai đoạn trò chơi như sau:

public class GameObject extends Actor {
    private final static String TAG = GameObject.class.getName();
    // ...

    public GameObject() {
        // ...

        addListener(new InputListener() {
            @Override
            public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
                Gdx.app.log(TAG, "touchDown on GameObject actor: <" + x + "," + y + ">");
                return super.touchDown(event, x, y, pointer, button);
            }
        });
    }

Điều này hoạt động hoàn hảo và ghi lại những gì tôi cần. Tuy nhiên, bây giờ tôi muốn cập nhật HUD với thông tin về đối tượng mà người dùng chạm vào.

Màn hình của tôi đã xác định Labeltôi muốn cập nhật (được thêm thông qua hudStage), nhưng tôi không chắc chắn làm thế nào để đi từ một diễn viên vào stagemàn hình hoặc đến hudStagenhãn.

public class GameScreen implements Screen {
    Stage stage;
    Stage hudStage;
    // This is the label I want to update.
    Label infoLabel;
    // ...
}

Tôi biết tôi có thể gọi setText(String)trên nhãn, nhưng tôi không chắc chắn cách tốt nhất để đánh bóng nhấp chuột lên. Rất nhiều ví dụ có các phiên bản đơn giản hóa trong đó các đối tượng được xác định trong lớp chính (trong trường hợp của tôi GameScreen) và có thể tham chiếu chúng theo cách đó, nhưng tôi đã phá vỡ chúng.

Tôi bắt đầu xem xét việc tạo ra một sự kiện tùy chỉnh mà diễn viên của tôi có thể kích hoạt và sân khấu sẽ xử lý, nhưng tài liệu thì thưa thớt và tôi không chắc điều này là bắt buộc.

Tôi cũng đã nghĩ đến việc loại bỏ ý tưởng có một nhãn hiệu hudStagevà thay vào đó, diễn viên của tôi sẽ vẽ văn bản nơi HUD sẽ có. Tuy nhiên, từ những gì tôi tiếp tục thấy, tôi nghĩ rằng Cảnh2D là hướng đi đúng đắn cho UI.

Cảm ơn!

EDIT: Những gì tôi đang tìm kiếm:

  1. Một diễn viên trong GameScreen.stagelà mục tiêu của một touchDownsự kiện.
  2. Logic trong diễn viên bắn và cập nhật đối tượng.
  3. Touchdown sự kiện trong kết thúc diễn viên bằng cách cập nhật infoLabeltrong GameScreen.hudStage hoặc cập nhật Chuỗi giá trị trong GameScreen(nếu dễ dàng hơn, tôi sẽ đi tuyến đường này).

Do sân khấu không có quyền truy cập lẫn nhau? Và nếu họ không, tại sao không?
StrongJoshua

Câu hỏi hay. Tôi nghĩ rằng câu trả lời là không, ít nhất là trừ khi bạn đi qua GameScreen. Có vẻ như cửa sổ duy nhất tôi mở là câu trả lời này trên SO về nhiều giai đoạn. Lưu ý rằng máy ảnh của tôi là khác nhau, điều đó khiến tôi nghĩ rằng hai giai đoạn anh chị em sẽ được yêu cầu.
James Skemp

Nhưng bạn đã sử dụng 2 giai đoạn (một cho hud và một cho trò chơi), làm thế nào khác với câu trả lời bạn liên kết?
StrongJoshua

Nó không khác nhau, đó thực sự là lý do tại sao tôi đã đi qua hai giai đoạn ... Xin lỗi, đó là một nỗ lực để trả lời câu hỏi của bạn "[Tôi] nếu họ không, tại sao không?" / tại sao tôi mã hóa điều này như tôi đã làm. Tôi cho rằng họ sẽ có quyền truy cập lẫn nhau nếu người này là con của người khác.
James Skemp

Ok, vậy vấn đề với việc thực hiện hiện tại của bạn là gì? Điều gì làm bạn bởi bạn muốn sự kiện nhấp vào bong bóng? Điều gì sẽ xảy ra?
StrongJoshua

Câu trả lời:


1

Để thực hiện công việc này, bạn cần hai giai đoạn để giao tiếp. Có hai cách bạn có thể có kết quả mà bạn mong muốn.

  1. Có mỗi diễn viên bạn tạo (có thể chạm vào) có chứa một tham chiếu đến giai đoạn HUD. Sau đó, khi diễn viên được chạm vào, chỉ cần cập nhật HUD bằng cách gọi một phương thức với diễn viên là tham số ( hudStage.update(thisActor)).
  2. Đừng chỉ định người nghe cho các diễn viên của bạn. Thay vào đó chỉ định một người nghe cho giai đoạn HUD của bạn (không phải bảng trong đó) lắng nghe các nhấp chuột trên toàn bộ màn hình. Khi một nhấp chuột được đăng ký, hãy gọi hit(x, y, true)và xem diễn viên nào được nhấn. Gọi phương thức cập nhật của diễn viên đó (hoặc bất cứ điều gì bạn muốn làm khi chạm vào diễn viên) và cập nhật thông tin của HUD với diễn viên đó.

Tôi nghĩ rằng đây sẽ là những cách dễ nhất để thực hiện những gì bạn muốn, nhưng tất nhiên, bạn có thể thực hiện các biến thể trên hai ý tưởng này khi bạn cần.

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.