From afec65eb5634e42cdf7c6235deff1ea02e97a8e8 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 17 Nov 2018 11:13:59 -0500 Subject: [PATCH] New mobile text dialog / Cleanup / Minimap fix / Collision optimization --- android/res/layout/gdxdialogs_inputtext.xml | 21 ---- .../io/anuke/mindustry/AndroidLauncher.java | 6 - .../mindustry/AndroidTextFieldDialog.java | 119 ------------------ .../mindustry/TextFieldDialogListener.java | 68 ---------- build.gradle | 2 +- .../mindustry/content/blocks/Blocks.java | 2 + core/src/io/anuke/mindustry/core/Logic.java | 6 - .../src/io/anuke/mindustry/core/Platform.java | 37 +++++- .../mindustry/graphics/MinimapRenderer.java | 2 +- .../pathfinding/FlowPathFinder.java | 77 ------------ .../pathfinding/TilePathfinder.java | 19 --- .../world/blocks/units/UnitFactory.java | 2 +- ios/src/io/anuke/mindustry/IOSLauncher.java | 11 -- .../mindustry/TextFieldDialogListener.java | 105 ---------------- 14 files changed, 41 insertions(+), 436 deletions(-) delete mode 100755 android/res/layout/gdxdialogs_inputtext.xml delete mode 100644 android/src/io/anuke/mindustry/AndroidTextFieldDialog.java delete mode 100644 android/src/io/anuke/mindustry/TextFieldDialogListener.java delete mode 100644 core/src/io/anuke/mindustry/maps/generation/pathfinding/FlowPathFinder.java delete mode 100644 core/src/io/anuke/mindustry/maps/generation/pathfinding/TilePathfinder.java delete mode 100644 ios/src/io/anuke/mindustry/TextFieldDialogListener.java diff --git a/android/res/layout/gdxdialogs_inputtext.xml b/android/res/layout/gdxdialogs_inputtext.xml deleted file mode 100755 index 0341a7d385..0000000000 --- a/android/res/layout/gdxdialogs_inputtext.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/android/src/io/anuke/mindustry/AndroidLauncher.java b/android/src/io/anuke/mindustry/AndroidLauncher.java index ff729c7227..c75b6af249 100644 --- a/android/src/io/anuke/mindustry/AndroidLauncher.java +++ b/android/src/io/anuke/mindustry/AndroidLauncher.java @@ -27,7 +27,6 @@ import io.anuke.mindustry.io.SaveIO; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.ui.dialogs.FileChooser; import io.anuke.ucore.function.Consumer; -import io.anuke.ucore.scene.ui.TextField; import io.anuke.ucore.scene.ui.layout.Unit; import io.anuke.ucore.util.Bundles; import io.anuke.ucore.util.Strings; @@ -52,11 +51,6 @@ public class AndroidLauncher extends PatchedAndroidApplication{ config.useImmersiveMode = true; Platform.instance = new Platform(){ - @Override - public void addDialog(TextField field, int length){ - TextFieldDialogListener.add(field, 0, length); - } - @Override public void openDonations(){ showDonations(); diff --git a/android/src/io/anuke/mindustry/AndroidTextFieldDialog.java b/android/src/io/anuke/mindustry/AndroidTextFieldDialog.java deleted file mode 100644 index 381bd7573f..0000000000 --- a/android/src/io/anuke/mindustry/AndroidTextFieldDialog.java +++ /dev/null @@ -1,119 +0,0 @@ -package io.anuke.mindustry; - - -import android.app.Activity; -import android.app.AlertDialog; -import android.text.InputFilter; -import android.view.LayoutInflater; -import android.view.View; -import android.view.WindowManager.LayoutParams; -import android.widget.EditText; -import com.badlogic.gdx.Gdx; - -public class AndroidTextFieldDialog{ - private Activity activity; - private EditText userInput; - private AlertDialog.Builder builder; - private TextPromptListener listener; - private boolean isBuild; - - public AndroidTextFieldDialog(){ - this.activity = (Activity) Gdx.app; - load(); - } - - public AndroidTextFieldDialog show(){ - - activity.runOnUiThread(() -> { - AlertDialog dialog = builder.create(); - - dialog.getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE); - - dialog.show(); - - }); - - return this; - } - - private AndroidTextFieldDialog load(){ - - activity.runOnUiThread(() -> { - - AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(activity); - LayoutInflater li = LayoutInflater.from(activity); - - View promptsView = li.inflate(getResourceId("gdxdialogs_inputtext", "layout"), null); - - alertDialogBuilder.setView(promptsView); - - userInput = promptsView.findViewById(getResourceId("gdxDialogsEditTextInput", "id")); - - alertDialogBuilder.setCancelable(false); - builder = alertDialogBuilder; - - isBuild = true; - }); - - // Wait till TextPrompt is built. - while(!isBuild){ - try{ - Thread.sleep(10); - }catch(InterruptedException ignored){ - } - } - - return this; - } - - public int getResourceId(String pVariableName, String pVariableType){ - try{ - return activity.getResources().getIdentifier(pVariableName, pVariableType, activity.getPackageName()); - }catch(Exception e){ - Gdx.app.error("Android Dialogs", "Cannot find resouce with name: " + pVariableName - + " Did you copy the layouts to /res/layouts and /res/layouts_v14 ?"); - e.printStackTrace(); - return -1; - } - } - - public AndroidTextFieldDialog setText(CharSequence value){ - userInput.append(value); - return this; - } - - public AndroidTextFieldDialog setCancelButtonLabel(CharSequence label){ - builder.setNegativeButton(label, (dialog, id) -> dialog.cancel()); - return this; - } - - public AndroidTextFieldDialog setConfirmButtonLabel(CharSequence label){ - builder.setPositiveButton(label, (dialog, id) -> { - if(listener != null && !userInput.getText().toString().isEmpty()){ - listener.confirm(userInput.getText().toString()); - } - - }); - return this; - } - - public AndroidTextFieldDialog setTextPromptListener(TextPromptListener listener){ - this.listener = listener; - return this; - } - - public AndroidTextFieldDialog setInputType(int type){ - userInput.setInputType(type); - return this; - } - - public AndroidTextFieldDialog setMaxLength(int length){ - userInput.setFilters(new InputFilter[]{new InputFilter.LengthFilter(length)}); - return this; - } - - public interface TextPromptListener{ - void confirm(String text); - } - -} diff --git a/android/src/io/anuke/mindustry/TextFieldDialogListener.java b/android/src/io/anuke/mindustry/TextFieldDialogListener.java deleted file mode 100644 index c603fbff05..0000000000 --- a/android/src/io/anuke/mindustry/TextFieldDialogListener.java +++ /dev/null @@ -1,68 +0,0 @@ -package io.anuke.mindustry; - - -import android.text.InputType; -import com.badlogic.gdx.Application.ApplicationType; -import com.badlogic.gdx.Gdx; -import io.anuke.ucore.scene.event.ChangeListener; -import io.anuke.ucore.scene.event.ClickListener; -import io.anuke.ucore.scene.event.InputEvent; -import io.anuke.ucore.scene.event.InputListener; -import io.anuke.ucore.scene.ui.TextField; - -public class TextFieldDialogListener extends ClickListener{ - private TextField field; - private int type; - private int max; - - //type - 0 is text, 1 is numbers, 2 is decimals - public TextFieldDialogListener(TextField field, int type, int max){ - this.field = field; - this.type = type; - this.max = max; - } - - public static void add(TextField field, int type, int max){ - field.addListener(new TextFieldDialogListener(field, type, max)); - field.addListener(new InputListener(){ - public boolean touchDown(InputEvent event, float x, float y, int pointer, int button){ - Gdx.input.setOnscreenKeyboardVisible(false); - return false; - } - }); - } - - public static void add(TextField field){ - add(field, 0, 16); - } - - public void clicked(final InputEvent event, float x, float y){ - - if(Gdx.app.getType() == ApplicationType.Desktop) return; - - AndroidTextFieldDialog dialog = new AndroidTextFieldDialog(); - - dialog.setTextPromptListener(text -> - Gdx.app.postRunnable(() -> { - field.clearText(); - field.appendText(text); - field.fire(new ChangeListener.ChangeEvent()); - Gdx.graphics.requestRendering(); - })); - - if(type == 0){ - dialog.setInputType(InputType.TYPE_CLASS_TEXT); - }else if(type == 1){ - dialog.setInputType(InputType.TYPE_CLASS_NUMBER); - }else if(type == 2){ - dialog.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL); - } - - dialog.setConfirmButtonLabel("OK").setText(field.getText()); - dialog.setCancelButtonLabel("Cancel"); - dialog.setMaxLength(max); - dialog.show(); - event.cancel(); - - } -} diff --git a/build.gradle b/build.gradle index c6678f8810..92579ba541 100644 --- a/build.gradle +++ b/build.gradle @@ -25,7 +25,7 @@ allprojects { appName = 'Mindustry' gdxVersion = '1.9.9' roboVMVersion = '2.3.0' - uCoreVersion = 'b276342625ac843932266aff194b9d4f5c26707b' + uCoreVersion = 'c93c55179ec05b44926d59c5878534a3177d804f' getVersionString = { String buildVersion = getBuildVersion() diff --git a/core/src/io/anuke/mindustry/content/blocks/Blocks.java b/core/src/io/anuke/mindustry/content/blocks/Blocks.java index 67e031d4a6..101539b893 100644 --- a/core/src/io/anuke/mindustry/content/blocks/Blocks.java +++ b/core/src/io/anuke/mindustry/content/blocks/Blocks.java @@ -45,6 +45,8 @@ public class Blocks extends BlockList implements ContentList{ } }; + //Registers build blocks from size 1-6 + //no reference is needed here since they can be looked up by name later for(int i = 1; i <= 6; i++){ new BuildBlock("build" + i); } diff --git a/core/src/io/anuke/mindustry/core/Logic.java b/core/src/io/anuke/mindustry/core/Logic.java index 9d25cf430b..1883f52af5 100644 --- a/core/src/io/anuke/mindustry/core/Logic.java +++ b/core/src/io/anuke/mindustry/core/Logic.java @@ -218,12 +218,6 @@ public class Logic extends Module{ if(group.isEmpty()) continue; EntityQuery.collideGroups(bulletGroup, group); - EntityQuery.collideGroups(group, playerGroup); - - for(EntityGroup other : unitGroups){ - if(other.isEmpty()) continue; - EntityQuery.collideGroups(group, other); - } } EntityQuery.collideGroups(bulletGroup, playerGroup); diff --git a/core/src/io/anuke/mindustry/core/Platform.java b/core/src/io/anuke/mindustry/core/Platform.java index ec7e0308ca..63695bac48 100644 --- a/core/src/io/anuke/mindustry/core/Platform.java +++ b/core/src/io/anuke/mindustry/core/Platform.java @@ -1,13 +1,21 @@ package io.anuke.mindustry.core; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Input.Keys; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.utils.Base64Coder; +import io.anuke.ucore.core.Core; import io.anuke.ucore.core.Settings; +import io.anuke.ucore.core.Timers; import io.anuke.ucore.function.Consumer; +import io.anuke.ucore.scene.ui.Dialog; import io.anuke.ucore.scene.ui.TextField; +import io.anuke.ucore.util.Log; import java.util.Random; +import static io.anuke.mindustry.Vars.mobile; + public abstract class Platform { /**Each separate game platform should set this instance to their own implementation.*/ public static Platform instance = new Platform() {}; @@ -17,7 +25,34 @@ public abstract class Platform { addDialog(field, 16); } /**See addDialog().*/ - public void addDialog(TextField field, int maxLength){} + public void addDialog(TextField field, int maxLength){ + if(!mobile) return; //this is mobile only, desktop doesn't need dialogs + + field.tapped(() -> { + Log.info("yappd"); + Dialog dialog = new Dialog("", "dialog"); + dialog.setFillParent(true); + dialog.content().top(); + dialog.content().defaults().height(65f); + TextField to = dialog.content().addField(field.getText(), t-> {}).pad(15).width(250f).get(); + to.setMaxLength(maxLength); + to.keyDown(Keys.ENTER, () -> dialog.content().find("okb").fireClick()); + dialog.content().addButton("$text.ok", () -> { + field.clearText(); + field.appendText(to.getText()); + field.change(); + dialog.hide(); + Gdx.input.setOnscreenKeyboardVisible(false); + }).width(90f).name("okb"); + + dialog.show(); + Timers.runTask(1f, () -> { + to.setCursorPosition(to.getText().length()); + Core.scene.setKeyboardFocus(to); + Gdx.input.setOnscreenKeyboardVisible(true); + }); + }); + } /**Update discord RPC.*/ public void updateRPC(){} /**Called when the game is exited.*/ diff --git a/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java b/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java index 917bf12365..e900b2feef 100644 --- a/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java @@ -80,7 +80,7 @@ public class MinimapRenderer implements Disposable{ for(Unit unit : units){ float rx = (unit.x - rect.x) / rect.width * w, ry = (unit.y - rect.y) / rect.width * h; Draw.color(unit.getTeam().color); - Draw.rect("white", x + rx, y + ry, w / (sz * 2), h / (sz * 2)); + Draw.crect(Draw.getBlankRegion(), x + rx, y + ry, w / (sz * 2), h / (sz * 2)); } Draw.color(); diff --git a/core/src/io/anuke/mindustry/maps/generation/pathfinding/FlowPathFinder.java b/core/src/io/anuke/mindustry/maps/generation/pathfinding/FlowPathFinder.java deleted file mode 100644 index aef01f0688..0000000000 --- a/core/src/io/anuke/mindustry/maps/generation/pathfinding/FlowPathFinder.java +++ /dev/null @@ -1,77 +0,0 @@ -package io.anuke.mindustry.maps.generation.pathfinding; - -import com.badlogic.gdx.math.GridPoint2; -import com.badlogic.gdx.math.MathUtils; -import com.badlogic.gdx.utils.Array; -import com.badlogic.gdx.utils.Queue; -import io.anuke.mindustry.world.Tile; -import io.anuke.ucore.function.Predicate; -import io.anuke.ucore.util.Geometry; - -public class FlowPathFinder extends TilePathfinder{ - protected float[][] weights; - - public FlowPathFinder(Tile[][] tiles){ - super(tiles); - this.weights = new float[tiles.length][tiles[0].length]; - } - - @Override - public void search(Tile start, Tile end, Array out){ - - } - - public void search(Tile start, Predicate result, Array out){ - Queue queue = new Queue<>(); - - for(int i = 0; i < weights.length; i++){ - for(int j = 0; j < weights[0].length; j++){ - if(result.test(tiles[i][j])){ - weights[i][j] = 100000; - queue.addLast(tiles[i][j]); - }else{ - weights[i][j] = 0f; - } - } - } - - while(queue.size > 0){ - Tile tile = queue.first(); - for(GridPoint2 point : Geometry.d4){ - int nx = tile.x + point.x, ny = tile.y + point.y; - if(inBounds(nx, ny) && weights[nx][ny] < weights[tile.x][tile.y] - 1f && tiles[nx][ny].passable()){ - weights[nx][ny] = weights[tile.x][tile.y] - 1; - queue.addLast(tiles[nx][ny]); - if(result.test(tiles[nx][ny])){ - break; - } - } - } - } - - out.add(start); - while(true){ - Tile tile = out.peek(); - - Tile max = null; - float maxf = weights[tile.x][tile.y]; - for(GridPoint2 point : Geometry.d4){ - int nx = tile.x + point.x, ny = tile.y + point.y; - if(inBounds(nx, ny) && (weights[nx][ny] > maxf)){ - max = tiles[nx][ny]; - maxf = weights[nx][ny]; - - if(MathUtils.isEqual(maxf, 100000)){ - out.add(max); - return; - } - } - } - if(max == null){ - break; - } - out.add(max); - } - } - -} diff --git a/core/src/io/anuke/mindustry/maps/generation/pathfinding/TilePathfinder.java b/core/src/io/anuke/mindustry/maps/generation/pathfinding/TilePathfinder.java deleted file mode 100644 index a332f5a353..0000000000 --- a/core/src/io/anuke/mindustry/maps/generation/pathfinding/TilePathfinder.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.anuke.mindustry.maps.generation.pathfinding; - -import com.badlogic.gdx.utils.Array; -import io.anuke.mindustry.world.Tile; -import io.anuke.ucore.util.Structs; - -public abstract class TilePathfinder{ - protected Tile[][] tiles; - - public TilePathfinder(Tile[][] tiles){ - this.tiles = tiles; - } - - protected boolean inBounds(int x, int y){ - return Structs.inBounds(x, y, tiles); - } - - public abstract void search(Tile start, Tile end, Array out); -} diff --git a/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java b/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java index 8566a8017e..d7856bf1b3 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java @@ -71,7 +71,7 @@ public class UnitFactory extends Block{ if(!Net.client()){ BaseUnit unit = factory.type.create(tile.getTeam()); unit.setSpawner(tile); - unit.set(tile.drawx(), tile.drawy()); + unit.set(tile.drawx() + Mathf.range(4), tile.drawy() + Mathf.range(4)); unit.add(); unit.getVelocity().y = factory.launchVelocity; } diff --git a/ios/src/io/anuke/mindustry/IOSLauncher.java b/ios/src/io/anuke/mindustry/IOSLauncher.java index e6bd6469ed..5b7c7fbf3e 100644 --- a/ios/src/io/anuke/mindustry/IOSLauncher.java +++ b/ios/src/io/anuke/mindustry/IOSLauncher.java @@ -10,7 +10,6 @@ import io.anuke.mindustry.core.Platform; import io.anuke.mindustry.game.Saves.SaveSlot; import io.anuke.mindustry.io.SaveIO; import io.anuke.mindustry.net.Net; -import io.anuke.ucore.scene.ui.TextField; import io.anuke.ucore.scene.ui.layout.Unit; import io.anuke.ucore.util.Bundles; import io.anuke.ucore.util.Strings; @@ -40,16 +39,6 @@ public class IOSLauncher extends IOSApplication.Delegate { Platform.instance = new Platform() { - @Override - public void addDialog(TextField field) { - TextFieldDialogListener.add(field, 16); - } - - @Override - public void addDialog(TextField field, int maxLength) { - TextFieldDialogListener.add(field, maxLength); - } - @Override public void shareFile(FileHandle file){ FileHandle to = Gdx.files.absolute(getDocumentsDirectory()).child(file.name()); diff --git a/ios/src/io/anuke/mindustry/TextFieldDialogListener.java b/ios/src/io/anuke/mindustry/TextFieldDialogListener.java deleted file mode 100644 index f8557f72a8..0000000000 --- a/ios/src/io/anuke/mindustry/TextFieldDialogListener.java +++ /dev/null @@ -1,105 +0,0 @@ -package io.anuke.mindustry; - -import com.badlogic.gdx.Gdx; -import io.anuke.ucore.scene.event.ClickListener; -import io.anuke.ucore.scene.event.InputEvent; -import io.anuke.ucore.scene.event.InputListener; -import io.anuke.ucore.scene.ui.TextField; -import org.robovm.apple.foundation.NSRange; -import org.robovm.apple.uikit.*; -import org.robovm.rt.bro.annotation.ByVal; - -public class TextFieldDialogListener { - - public static void add(TextField field, int maxLength){ - field.addListener(new ClickListener(){ - public void clicked(final InputEvent event, float x, float y){ - show(field, maxLength); - event.cancel(); - } - }); - field.addListener(new InputListener(){ - public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) { - Gdx.input.setOnscreenKeyboardVisible(false); - return false; - } - }); - } - - @SuppressWarnings("deprecation") - private static void show(TextField field, int maxLength){ - - UIAlertViewDelegateAdapter delegate = new UIAlertViewDelegateAdapter() { - - @Override - public void didDismiss(UIAlertView alertView, long buttonIndex) { - if (buttonIndex == 1) { - UITextField textField = alertView.getTextField(0); - final String result = textField.getText(); - - Gdx.app.postRunnable(() -> { - field.setText(result); - field.change(); - }); - } - } - - @Override - public void clicked(UIAlertView alertView, long buttonIndex) { - - } - - @Override - public void cancel(UIAlertView alertView) { - - } - - @Override - public void willPresent(UIAlertView alertView) { - - } - - @Override - public void didPresent(UIAlertView alertView) { - - } - - @Override - public void willDismiss(UIAlertView alertView, long buttonIndex) { - - } - - @Override - public boolean shouldEnableFirstOtherButton(UIAlertView alertView) { - return false; - } - }; - - String[] otherButtons = new String[1]; - otherButtons[0] = "OK"; - - UIAlertView alertView = new UIAlertView("", "", delegate, "Cancel", otherButtons); - - alertView.setAlertViewStyle(UIAlertViewStyle.PlainTextInput); - - UITextField uiTextField = alertView.getTextField(0); - uiTextField.setText(field.getText()); - - uiTextField.setDelegate(new UITextFieldDelegateAdapter() { - @Override - public boolean shouldChangeCharacters(UITextField textField, @ByVal NSRange nsRange, String additionalText) { - - if (textField.getText().length() + additionalText.length() > maxLength) { - String oldText = textField.getText(); - String newText = oldText + additionalText; - textField.setText(newText.substring(0, maxLength)); - return false; - } - return true; - } - }); - - alertView.show(); - - } -}