Added partial support for changing acts

Added partial support for changing acts (levels will come after waypoint are added)
Added a click lister to waypoint buttons and set their user object to referenced level
Changed from static loading screen to a dynamic one that is pushed over game screen and popped off to hide loads
Changed disposing strategy of GameLoadingScreen to always keep loading descriptor in memory
Client#clearAndSet(Screen) now disposes existing screens and clears before setting new one
This commit is contained in:
Collin Smith
2019-12-02 23:11:18 -08:00
parent a58275f7d0
commit 85546d197e
6 changed files with 100 additions and 32 deletions

View File

@ -195,9 +195,9 @@ public class Client extends Game {
} }
public void clearAndSet(Screen screen) { public void clearAndSet(Screen screen) {
setScreen(screen);
for (Screen s : screens) s.dispose(); for (Screen s : screens) s.dispose();
screens.clear(); screens.clear();
setScreen(screen);
} }
@Override @Override

View File

@ -188,7 +188,7 @@ public class CreateCharacterScreen extends ScreenAdapter {
Riiablo.client.popScreen(); Riiablo.client.popScreen();
} else if (actor == btnOK) { } else if (actor == btnOK) {
if (selected == null) return; if (selected == null) return;
Riiablo.client.clearAndSet(new GameLoadingScreen(new GameScreen(Riiablo.charData.createD2S(tfCharName.getText(), selected.charClass)))); Riiablo.client.clearAndSet(new GameScreen(Riiablo.charData.createD2S(tfCharName.getText(), selected.charClass)));
} }
} }
}; };

View File

@ -1,6 +1,6 @@
package com.riiablo.screen; package com.riiablo.screen;
import com.badlogic.gdx.Screen; import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.ScreenAdapter; import com.badlogic.gdx.ScreenAdapter;
import com.badlogic.gdx.assets.AssetDescriptor; import com.badlogic.gdx.assets.AssetDescriptor;
import com.badlogic.gdx.scenes.scene2d.Stage; import com.badlogic.gdx.scenes.scene2d.Stage;
@ -12,21 +12,20 @@ import com.riiablo.map.Map;
import com.riiablo.widget.AnimationWrapper; import com.riiablo.widget.AnimationWrapper;
public class GameLoadingScreen extends ScreenAdapter { public class GameLoadingScreen extends ScreenAdapter {
private static final String TAG = "GameLoadingScreen";
private final AssetDescriptor<DC6> loadingscreenDescriptor = new AssetDescriptor<>("data\\local\\ui\\loadingscreen.dc6", DC6.class); private final AssetDescriptor<DC6> loadingscreenDescriptor = new AssetDescriptor<>("data\\local\\ui\\loadingscreen.dc6", DC6.class);
private Screen screen; private Array<AssetDescriptor> dependencies;
private Array<AssetDescriptor> assets;
private Stage stage; private Stage stage;
private AnimationWrapper loadingscreenWrapper; private AnimationWrapper loadingscreenWrapper;
private Map map; private Map map;
private int act;
public GameLoadingScreen(Array<AssetDescriptor> assets, GameScreen screen) { public GameLoadingScreen(Map map, Array<AssetDescriptor> dependencies) {
this.screen = screen; this.map = map;
this.map = screen.map;
stage = new Stage(Riiablo.defaultViewport, Riiablo.batch); stage = new Stage(Riiablo.defaultViewport, Riiablo.batch);
Riiablo.assets.load(loadingscreenDescriptor); Riiablo.assets.load(loadingscreenDescriptor);
@ -47,42 +46,44 @@ public class GameLoadingScreen extends ScreenAdapter {
(stage.getHeight() / 2) - (loadingscreen.getMinHeight() / 2)); (stage.getHeight() / 2) - (loadingscreen.getMinHeight() / 2));
stage.addActor(loadingscreenWrapper); stage.addActor(loadingscreenWrapper);
this.assets = assets; this.dependencies = new Array<>(dependencies);
if (assets != null) {
for (AssetDescriptor asset : assets) {
Riiablo.assets.load(asset);
}
}
map.setAct(0);
map.load();
} }
public GameLoadingScreen(GameScreen screen) { public void loadAct(int act) {
this(screen.getDependencies(), screen); this.act = act;
} }
@Override @Override
public void show() { public void show() {
Gdx.app.log(TAG, "Loading act " + (act + 1));
Riiablo.viewport = Riiablo.defaultViewport; Riiablo.viewport = Riiablo.defaultViewport;
if (assets == null) {
Riiablo.client.clearAndSet(screen); Riiablo.assets.load(loadingscreenDescriptor);
if (dependencies != null) {
for (AssetDescriptor asset : dependencies) {
Riiablo.assets.load(asset);
}
dependencies = null;
} }
map.setAct(act);
map.load();
} }
@Override @Override
public void hide() { public void hide() {
if (assets != null) { Riiablo.assets.unload(loadingscreenDescriptor.fileName);
Riiablo.assets.unload(loadingscreenDescriptor.fileName);
}
} }
@Override
public void dispose() {}
@Override @Override
public void render(float delta) { public void render(float delta) {
if (Riiablo.assets.update()) { if (Riiablo.assets.update()) {
map.finishLoading(); map.finishLoading();
map.generate(); map.generate();
Riiablo.client.clearAndSet(screen); Riiablo.client.popScreen();
return; return;
} }

View File

@ -33,6 +33,8 @@ import com.riiablo.Keys;
import com.riiablo.Riiablo; import com.riiablo.Riiablo;
import com.riiablo.camera.IsometricCamera; import com.riiablo.camera.IsometricCamera;
import com.riiablo.codec.D2S; import com.riiablo.codec.D2S;
import com.riiablo.codec.DC6;
import com.riiablo.codec.excel.Levels;
import com.riiablo.codec.excel.Sounds; import com.riiablo.codec.excel.Sounds;
import com.riiablo.cvar.Cvar; import com.riiablo.cvar.Cvar;
import com.riiablo.cvar.CvarStateAdapter; import com.riiablo.cvar.CvarStateAdapter;
@ -101,7 +103,7 @@ import com.riiablo.widget.NpcDialogBox;
import com.riiablo.widget.NpcMenu; import com.riiablo.widget.NpcMenu;
import com.riiablo.widget.TextArea; import com.riiablo.widget.TextArea;
public class GameScreen extends ScreenAdapter implements LoadingScreen.Loadable { public class GameScreen extends ScreenAdapter implements GameLoadingScreen.Loadable {
private static final String TAG = "GameScreen"; private static final String TAG = "GameScreen";
private static final boolean DEBUG = true; private static final boolean DEBUG = true;
private static final boolean DEBUG_TOUCHPAD = !true; private static final boolean DEBUG_TOUCHPAD = !true;
@ -121,6 +123,7 @@ public class GameScreen extends ScreenAdapter implements LoadingScreen.Loadable
private final Vector2 tmpVec2 = new Vector2(); private final Vector2 tmpVec2 = new Vector2();
private final Vector2 tmpVec2b = new Vector2(); private final Vector2 tmpVec2b = new Vector2();
final AssetDescriptor<DC6> loadingscreenDescriptor = new AssetDescriptor<>("data\\local\\ui\\loadingscreen.dc6", DC6.class);
final AssetDescriptor<Sound> windowopenDescriptor = new AssetDescriptor<>("data\\global\\sfx\\cursor\\windowopen.wav", Sound.class); final AssetDescriptor<Sound> windowopenDescriptor = new AssetDescriptor<>("data\\global\\sfx\\cursor\\windowopen.wav", Sound.class);
final AssetDescriptor<Texture> touchpadBackgroundDescriptor = new AssetDescriptor<>("textures/touchBackground.png", Texture.class); final AssetDescriptor<Texture> touchpadBackgroundDescriptor = new AssetDescriptor<>("textures/touchBackground.png", Texture.class);
@ -128,6 +131,7 @@ public class GameScreen extends ScreenAdapter implements LoadingScreen.Loadable
Touchpad touchpad; Touchpad touchpad;
final Array<AssetDescriptor> preloadedAssets = new Array<AssetDescriptor>() {{ final Array<AssetDescriptor> preloadedAssets = new Array<AssetDescriptor>() {{
add(loadingscreenDescriptor);
add(windowopenDescriptor); add(windowopenDescriptor);
if (Gdx.app.getType() == Application.ApplicationType.Android || DEBUG_TOUCHPAD) { if (Gdx.app.getType() == Application.ApplicationType.Android || DEBUG_TOUCHPAD) {
add(touchpadBackgroundDescriptor); add(touchpadBackgroundDescriptor);
@ -151,6 +155,7 @@ public class GameScreen extends ScreenAdapter implements LoadingScreen.Loadable
Stage stage; Stage stage;
Stage scaledStage; Stage scaledStage;
Viewport viewport; Viewport viewport;
GameLoadingScreen loadingScreen;
boolean isDebug; boolean isDebug;
MappedKeyStateAdapter debugKeyListener = new MappedKeyStateAdapter() { MappedKeyStateAdapter debugKeyListener = new MappedKeyStateAdapter() {
@Override @Override
@ -501,6 +506,8 @@ public class GameScreen extends ScreenAdapter implements LoadingScreen.Loadable
engine.addSystem(new SequenceSystem()); engine.addSystem(new SequenceSystem());
engine.addSystem(new Box2DDebugRenderSystem(renderer)); engine.addSystem(new Box2DDebugRenderSystem(renderer));
engine.addSystem(new PathfindDebugSystem(iso, renderer, Riiablo.batch, Riiablo.shapes)); engine.addSystem(new PathfindDebugSystem(iso, renderer, Riiablo.batch, Riiablo.shapes));
loadingScreen = new GameLoadingScreen(map, getDependencies());
} }
@Override @Override
@ -687,6 +694,11 @@ public class GameScreen extends ScreenAdapter implements LoadingScreen.Loadable
@Override @Override
public void show() { public void show() {
if (map.getAct() == -1) {
setAct(0);
return;
}
Riiablo.game = this; Riiablo.game = this;
isDebug = DEBUG && Gdx.app.getType() == Application.ApplicationType.Desktop; isDebug = DEBUG && Gdx.app.getType() == Application.ApplicationType.Desktop;
Keys.DebugMode.addStateListener(debugKeyListener); Keys.DebugMode.addStateListener(debugKeyListener);
@ -923,4 +935,44 @@ public class GameScreen extends ScreenAdapter implements LoadingScreen.Loadable
} }
} }
} }
public void setAct(int act) {
loadingScreen.loadAct(act);
Riiablo.client.pushScreen(loadingScreen);
}
public void setLevel(Levels.Entry target) {
assert target.Waypoint != 0xFF;
//if (target.Act != map.getAct()) {
// setAct(target.Act);
// return;
//}
// Riiablo.engine.removeAllEntities(Family.exclude(PlayerComponent.class).get());
// Box2DPhysicsSystem system = engine.getSystem(Box2DPhysicsSystem.class);
// World body2dWorld = system.world;
// Array<Body> bodies = new Array<>(32768);
// body2dWorld.getBodies(bodies);
// for (Body body : bodies) body2dWorld.destroyBody(body);
// player.getComponent(Box2DComponent.class).body = null;
// system.entityAdded(player);
//
// loadingScreen.loadAct(target.Act);
// Riiablo.client.pushScreen(loadingScreen);
/*
map.clear();
map.setAct(target.Act);
map.load();
map.finishLoading();
map.generate();
*/
// Vector2 origin = map.find(Map.ID.TOWN_ENTRY_1);
// if (origin == null) origin = map.find(Map.ID.TOWN_ENTRY_2);
// if (origin == null) origin = map.find(Map.ID.TP_LOCATION);
// player.getComponent(PositionComponent.class).position.set(origin);
// player.getComponent(Box2DComponent.class).body.setTransform(origin, 0);
// player.getComponent(MapComponent.class).zone = map.getZone(origin);
}
} }

View File

@ -57,8 +57,7 @@ public class SelectCharacterScreen extends ScreenAdapter {
Riiablo.client.popScreen(); Riiablo.client.popScreen();
} else if (actor == btnOK) { } else if (actor == btnOK) {
assert selected != null; assert selected != null;
GameScreen game = new GameScreen(Riiablo.charData.setD2S(selected.getD2S())); Riiablo.client.clearAndSet(new GameScreen(Riiablo.charData.setD2S(selected.getD2S())));
Riiablo.client.clearAndSet(new GameLoadingScreen(game));
} else if (actor == btnCreateNewCharacter) { } else if (actor == btnCreateNewCharacter) {
Riiablo.client.pushScreen(new CreateCharacterScreen()); Riiablo.client.pushScreen(new CreateCharacterScreen());
} }

View File

@ -4,6 +4,7 @@ import com.badlogic.gdx.assets.AssetDescriptor;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.Touchable; import com.badlogic.gdx.scenes.scene2d.Touchable;
import com.badlogic.gdx.scenes.scene2d.ui.ButtonGroup; import com.badlogic.gdx.scenes.scene2d.ui.ButtonGroup;
@ -41,6 +42,8 @@ public class WaygatePanel extends WidgetGroup implements Disposable {
final AssetDescriptor<DC6> buysellbtnDescriptor = new AssetDescriptor<>("data\\global\\ui\\PANEL\\buysellbtn.DC6", DC6.class, DC6Loader.DC6Parameters.COMBINE); final AssetDescriptor<DC6> buysellbtnDescriptor = new AssetDescriptor<>("data\\global\\ui\\PANEL\\buysellbtn.DC6", DC6.class, DC6Loader.DC6Parameters.COMBINE);
Button btnExit; Button btnExit;
ClickListener clickListener;
public WaygatePanel() { public WaygatePanel() {
Riiablo.assets.load(waygatebackgroundDescriptor); Riiablo.assets.load(waygatebackgroundDescriptor);
Riiablo.assets.finishLoadingAsset(waygatebackgroundDescriptor); Riiablo.assets.finishLoadingAsset(waygatebackgroundDescriptor);
@ -78,6 +81,15 @@ public class WaygatePanel extends WidgetGroup implements Disposable {
down = new TextureRegionDrawable(waygateicons.getTexture(4)); down = new TextureRegionDrawable(waygateicons.getTexture(4));
}}; }};
clickListener = new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
IconTextButton button = (IconTextButton) event.getListenerActor();
Levels.Entry target = (Levels.Entry) button.getUserObject();
Riiablo.game.setLevel(target);
}
};
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
Array<Levels.Entry>[] waypoints = (Array<Levels.Entry>[]) new Array[5]; Array<Levels.Entry>[] waypoints = (Array<Levels.Entry>[]) new Array[5];
for (int i = 0; i < waypoints.length; i++) waypoints[i] = new Array<>(9); for (int i = 0; i < waypoints.length; i++) waypoints[i] = new Array<>(9);
@ -100,7 +112,9 @@ public class WaygatePanel extends WidgetGroup implements Disposable {
for (int i = 0; i < tabs.length; i++) { for (int i = 0; i < tabs.length; i++) {
Tab tab = tabs[i] = new Tab(); Tab tab = tabs[i] = new Tab();
for (Levels.Entry entry : waypoints[i]) { for (Levels.Entry entry : waypoints[i]) {
tab.addWaypoint(entry.LevelName); Actor controller = tab.addWaypoint(entry.LevelName);
controller.setUserObject(entry);
controller.addListener(clickListener);
} }
tab.pack(); tab.pack();
@ -164,8 +178,10 @@ public class WaygatePanel extends WidgetGroup implements Disposable {
columnDefaults(0).height(32).spaceBottom(4).growX(); columnDefaults(0).height(32).spaceBottom(4).growX();
} }
void addWaypoint(String descId) { Actor addWaypoint(String descId) {
add(new IconTextButton(waygateButtonStyle, Riiablo.string.lookup(descId), Riiablo.fonts.font16)).row(); IconTextButton button = new IconTextButton(waygateButtonStyle, Riiablo.string.lookup(descId), Riiablo.fonts.font16);
add(button).row();
return button;
} }
} }
} }