refactor stack -> deque

This commit is contained in:
Anthony Calosa
2020-04-21 20:31:41 +08:00
parent 8acb143fea
commit f68ac2e43a
2 changed files with 26 additions and 23 deletions

View File

@@ -38,9 +38,10 @@ import forge.util.Utils;
import java.io.File;
import java.io.FileFilter;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;
import java.util.Stack;
public class Forge implements ApplicationListener {
public static final String CURRENT_VERSION = "1.6.33.001";
@@ -57,7 +58,7 @@ public class Forge implements ApplicationListener {
private static KeyInputAdapter keyInputAdapter;
private static boolean exited;
private static int continuousRenderingCount = 1; //initialize to 1 since continuous rendering is the default
private static final Stack<FScreen> screens = new Stack<>();
private static final Deque<FScreen> Dscreens = new ArrayDeque<>();
private static boolean textureFiltering = false;
private static boolean destroyThis = false;
public static String extrawide = "default";
@@ -259,13 +260,13 @@ public class Forge implements ApplicationListener {
}
public static boolean onHomeScreen() {
return screens.size() == 1;
return Dscreens.size() == 1;
}
public static void back() {
if(destroyThis && isLandscapeMode())
return;
if (screens.size() < 2) {
if (Dscreens.size() < 2) {
exit(false); //prompt to exit if attempting to go back from home screen
return;
}
@@ -273,8 +274,8 @@ public class Forge implements ApplicationListener {
@Override
public void run(Boolean result) {
if (result) {
screens.pop();
setCurrentScreen(screens.lastElement());
Dscreens.removeFirst();
setCurrentScreen(Dscreens.getFirst());
}
}
});
@@ -282,12 +283,12 @@ public class Forge implements ApplicationListener {
//set screen that will be gone to on pressing Back before going to current Back screen
public static void setBackScreen(final FScreen screen0, boolean replace) {
screens.remove(screen0); //remove screen from previous position in navigation history
int index = screens.size() - 1;
Dscreens.remove(screen0); //remove screen from previous position in navigation history
int index = Dscreens.size() - 1;
if (index > 0) {
screens.add(index, screen0);
Dscreens.addLast(screen0);
if (replace) { //remove previous back screen if replacing back screen
screens.remove(index - 1);
Dscreens.removeFirst();
}
}
}
@@ -349,7 +350,7 @@ public class Forge implements ApplicationListener {
if (currentScreen == screen0) { return; }
if (currentScreen == null) {
screens.push(screen0);
Dscreens.addFirst(screen0);
setCurrentScreen(screen0);
return;
}
@@ -358,11 +359,11 @@ public class Forge implements ApplicationListener {
@Override
public void run(Boolean result) {
if (result) {
if (replaceBackScreen && !screens.isEmpty()) {
screens.pop();
if (replaceBackScreen && !Dscreens.isEmpty()) {
Dscreens.removeFirst();
}
if (screens.peek() != screen0) { //prevent screen being its own back screen
screens.push(screen0);
if (Dscreens.peekFirst() != screen0) { //prevent screen being its own back screen
Dscreens.addFirst(screen0);
}
setCurrentScreen(screen0);
}
@@ -505,7 +506,7 @@ public class Forge implements ApplicationListener {
currentScreen.onClose(null);
currentScreen = null;
}
screens.clear();
Dscreens.clear();
graphics.dispose();
SoundSystem.instance.dispose();
try {

View File

@@ -19,7 +19,9 @@ import forge.assets.FSkinFont;
import forge.toolbox.FDisplayObject;
import forge.util.Utils;
import forge.util.TextBounds;
import java.util.Stack;
import java.util.ArrayDeque;
import java.util.Deque;
public class Graphics {
private static final int GL_BLEND = GL20.GL_BLEND;
@@ -27,7 +29,7 @@ public class Graphics {
private final SpriteBatch batch = new SpriteBatch();
private final ShapeRenderer shapeRenderer = new ShapeRenderer();
private final Stack<Matrix4> transforms = new Stack<>();
private final Deque<Matrix4> Dtransforms = new ArrayDeque<>();
private final Vector3 tmp = new Vector3();
private float regionHeight;
private Rectangle bounds;
@@ -70,7 +72,7 @@ public class Graphics {
batch.flush(); //must flush batch to prevent other things not rendering
Rectangle clip = new Rectangle(adjustX(x), adjustY(y, h), w, h);
if (!transforms.isEmpty()) { //transform position if needed
if (!Dtransforms.isEmpty()) { //transform position if needed
tmp.set(clip.x, clip.y, 0);
tmp.mul(batch.getTransformMatrix());
float minX = tmp.x;
@@ -121,7 +123,7 @@ public class Graphics {
final Rectangle parentBounds = bounds;
bounds = new Rectangle(parentBounds.x + displayObj.getLeft(), parentBounds.y + displayObj.getTop(), displayObj.getWidth(), displayObj.getHeight());
if (!transforms.isEmpty()) { //transform screen position if needed by applying transform matrix to rectangle
if (!Dtransforms.isEmpty()) { //transform screen position if needed by applying transform matrix to rectangle
updateScreenPosForRotation(displayObj);
}
else {
@@ -542,7 +544,7 @@ public class Graphics {
}
private void startShape(ShapeType shapeType) {
if (!transforms.isEmpty()) {
if (!Dtransforms.isEmpty()) {
//must copy matrix before starting shape if transformed
shapeRenderer.setTransformMatrix(batch.getTransformMatrix());
}
@@ -624,7 +626,7 @@ public class Graphics {
public void startRotateTransform(float originX, float originY, float rotation) {
batch.end();
transforms.add(0, new Matrix4(batch.getTransformMatrix().idt())); //startshape is using this above as reference
Dtransforms.addFirst(new Matrix4(batch.getTransformMatrix().idt())); //startshape is using this above as reference
batch.getTransformMatrix().idt().translate(adjustX(originX), adjustY(originY, 0), 0).rotate(Vector3.Z, rotation).translate(-adjustX(originX), -adjustY(originY, 0), 0);
batch.begin();
}
@@ -632,7 +634,7 @@ public class Graphics {
public void endTransform() {
batch.end();
shapeRenderer.setTransformMatrix(batch.getTransformMatrix().idt());
transforms.pop();
Dtransforms.removeFirst();
batch.getTransformMatrix().idt(); //reset
shapeRenderer.getTransformMatrix().idt(); //reset
batch.begin();