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.
AssetManagerWrapper
lớp bạn là gì? Ai gọiloadData
và khi nào, và ai gọidispose
và khi nào?