Vấn đề hình chữ nhật màu đen Libgdx


7

Tôi đang làm việc trên một trò chơi dành cho Android bằng Android Studio với LibGDX bằng Java. Gần đây tôi đã tìm thấy một vấn đề kỳ lạ khi đóng và mở lại trò chơi. Khi tôi lần đầu tiên mở trò chơi, nó hoạt động tốt. Nếu tôi nhấp vào nút QUIT và đóng ứng dụng, người quản lý tài sản sẽ xử lý. Khi tôi mở lại trò chơi, một số vùng atlas được hiển thị dưới dạng hình chữ nhật màu đen có cùng kích thước của vùng. Tôi nhận thấy rằng điều đó chỉ xảy ra khi tôi gọi phương thức xử lý tài sản của người quản lý. Nếu tôi loại bỏ nó, vấn đề không xuất hiện. Thật buồn cười, nhưng trò chơi có vẻ hoạt động tốt khi không gọi phương thức đó nhưng tôi đọc rằng nên loại bỏ nó. Đây là lớp AssetsManager của tôi:

public final class AssetManagerWrapper extends AssetManager {
    ArrayMap<String, FileHandle> configs = new ArrayMap<String, FileHandle>();
    public Texture lightTexture;
    public Texture alarmTexture;
    public TextureAtlas particlesAtlas;

    public final void loadGFX() {
        FileHandle dirHandle;
        dirHandle = Gdx.files.internal(Rules.System.GFX.GFX_FOLDER_NAME);
        FileHandle subDirHandle;

        for (FileHandle dir : dirHandle.list()) {
            subDirHandle = Gdx.files.internal(dir.path());
            if (dir.name().equalsIgnoreCase(AssetsPaths.Gfx.Sheets.SHEETS_FOLDER_NAME)) {
                for (FileHandle file : subDirHandle.list()) {
                    if (file.extension().equalsIgnoreCase(Rules.System.GFX.SHEETS_DATA_EXTENSION)) {
                        load(file.path(), TextureAtlas.class);
                    }
                }
            } else {
                for (FileHandle file : subDirHandle.list()) {
                    load(file.path(), Texture.class);
                }
            }
        }
    }

    public final void loadSounds() {
        FileHandle dirHandle;
        dirHandle = Gdx.files.internal(Rules.System.SFX.SFX_FOLDER_NAME);
        FileHandle subDirHandle;

        for (FileHandle dir : dirHandle.list()) {
            subDirHandle = Gdx.files.internal(dir.path());
            if (dir.name().equalsIgnoreCase(Rules.System.SFX.SOUNDS_FOLDER_NAME)) {
                for (FileHandle file : subDirHandle.list()) {
                    if (file.extension().equalsIgnoreCase(Rules.System.SFX.SOUNDS_DATA_EXTENSION)) {
                        load(file.path(), Sound.class);
                    }
                }
            }
        }

    }

    public void loadParticlesConfigs() {
        FileHandle dirHandle;
        dirHandle = Gdx.files.internal(AssetsPaths.Configs.CONFIGS_FOLDER_NAME + '/' + AssetsPaths.Configs.PARTICLE_CONFIGS_FOLDER_NAME);

        for (FileHandle file : dirHandle.list()) {
            if (file.extension().equalsIgnoreCase(Rules.System.GFX.PARTICLE_CONFIGS_DATA_EXTENSION)) {
                configs.put(file.nameWithoutExtension(), file);
            }
        }
    }


    public final void loadMusic() {
        FileHandle dirHandle;
        dirHandle = Gdx.files.internal(Rules.System.SFX.SFX_FOLDER_NAME);
        FileHandle subDirHandle;

        for (FileHandle dir : dirHandle.list()) {
            subDirHandle = Gdx.files.internal(dir.path());
            if (dir.name().equalsIgnoreCase(Rules.System.SFX.MUSIC_FOLDER_NAME)) {
                for (FileHandle file : subDirHandle.list()) {
                    if (file.extension().equalsIgnoreCase(Rules.System.SFX.MUSIC_DATA_EXTENSION)) {
                        load(file.path(), Music.class);
                    }
                }
            }
        }

    }

    public void loadData() {
        loadGFX();
        loadSounds();
        loadMusic();
        loadParticlesConfigs();
        finishLoading();
    }

    @Override
    public void finishLoading() {
        super.finishLoading();
        lightTexture = get(AssetsPaths.Gfx.Other.LIGHT);
        alarmTexture = get(AssetsPaths.Gfx.Menu.ALARM);
        particlesAtlas = get(AssetsPaths.Gfx.Sheets.Misc.PARTICLES_DATA_FILE);
    }

    public ArrayMap<String, FileHandle> getConfigs() {
        return configs;
    }
}

Vòng đời (Lớp chính thực hiện Trình nghe ứng dụng):

   @Override
        public void create() {
            assetsManager = new AssetManagerWrapper();
            assetsManager.loadData();
            soundPlayer = new SoundPlayer(this);
            Gdx.input.setCatchBackKey(true);
            goToMenu();
        }

     @Override
    public void resume() {
        assetsManager.finishLoading();
    }
 @Override
    public void dispose() {
        assetsManager.dispose(); //For some reason this creates the black rectangles bug.
        soundPlayer.dispose();
        if (warScreen != null) {
            warScreen.dispose();
        }
        menuScreen.dispose();
    }

Có ai có bất cứ ý tưởng những gì có thể gây ra nó? Có ổn không khi tôi loại bỏ cuộc gọi đến phương thức đó? Cảm ơn trước.


Vòng đời của AssetManagerWrapperlớp bạn là gì? Ai gọi loadDatavà khi nào, và ai gọi disposevà khi nào?
sinh

tài sảnQuản lý.loadData (); được gọi trong onCreate () của lớp trình nghe ứng dụng. Tài sảnQuản lý.dispose (); được gọi trong dispose () của cùng một lớp.
Gad Wissberg

Câu trả lời:


0

Theo này phần trong trang AssetManager. Khi Android tạm dừng, sau đó các phần tử libgdx được quản lý, như Hoạ tiết, sẽ được dọn sạch và phải tải lại khi ứng dụng hoạt động trở lại. Để làm điều này, bạn gọi Texture.setAssetManager(manager);và sau đó gọi cập nhật trên trình quản lý tài sản như bạn đã làm khi bạn tải lần đầu tiên.

Thứ hai, các ứng dụng Android không đảm bảo rằng chúng sẽ thực sự ngừng thực thi khi bạn thoát chúng. Android là ứng dụng được chọn khi nó dọn sạch một ứng dụng chạy nền. Có lẽ ngay cả khi bạn đã chọn thoát, ứng dụng của bạn vẫn đang chạy và cần kết cấu được tải lại.


Tôi đã cố gắng đưa các dòng này vào onResume của lớp Main: Texture.setAssetManager (propertyManager); Tài sảnQuản lý.update (); Nhưng đã không làm việc.
Gad Wissberg

0

Chỉ có vấn đề tương tự. Vấn đề là tôi đã có một số vùng kết cấu như các trường tĩnh. Và để tránh tìm kiếm vùng kết cấu lặp đi lặp lại cho từng đối tượng, tôi đã thêm một số biến tĩnh "intitialized", vì vậy tôi chỉ tìm các vùng cho đối tượng được tạo đầu tiên, đặt biến đó cho thử nghiệm và tất cả các biến khác đều bỏ qua tìm kiếm vùng. Điều đó hoạt động tốt khi tôi chạy trò chơi lần đầu tiên. Nhưng khi tôi thoát và chạy lại ứng dụng và nó vẫn ở trong bộ nhớ điện thoại, biến "khởi tạo" tĩnh cũng giữ giá trị của nó, nghĩa là tìm các vùng không được gọi lại. Và các vùng cũ tồn tại nhưng bộ nhớ của chúng bị xóa nên khi vẽ tôi chỉ nhận được hình chữ nhật màu đen cho chúng.

Giải quyết bằng cách gọi findRegion () một lần nữa.

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.