Files
Mindustry/core/src/mindustry/ui/fragments/MinimapFragment.java
2023-02-20 12:19:56 -05:00

129 lines
4.1 KiB
Java

package mindustry.ui.fragments;
import arc.*;
import arc.graphics.*;
import arc.graphics.g2d.*;
import arc.input.*;
import arc.math.*;
import arc.scene.*;
import arc.scene.event.*;
import arc.scene.ui.layout.*;
import mindustry.gen.*;
import mindustry.input.*;
import mindustry.ui.*;
import static mindustry.Vars.*;
public class MinimapFragment{
private boolean shown;
float panx, pany, zoom = 1f, lastZoom = -1;
private float baseSize = Scl.scl(5f);
public Element elem;
public void build(Group parent){
elem = parent.fill((x, y, w, h) -> {
w = Core.graphics.getWidth();
h = Core.graphics.getHeight();
float size = baseSize * zoom * world.width();
Draw.color(Color.black);
Fill.crect(0, 0, w, h);
if(renderer.minimap.getTexture() != null){
Draw.color();
float ratio = (float)renderer.minimap.getTexture().height / renderer.minimap.getTexture().width;
TextureRegion reg = Draw.wrap(renderer.minimap.getTexture());
Draw.rect(reg, w/2f + panx*zoom, h/2f + pany*zoom, size, size * ratio);
renderer.minimap.drawEntities(w/2f + panx*zoom - size/2f, h/2f + pany*zoom - size/2f * ratio, size, size * ratio, zoom, true);
}
Draw.reset();
});
elem.visible(() -> shown);
elem.update(() -> {
if(!ui.chatfrag.shown()){
elem.requestKeyboard();
elem.requestScroll();
}
elem.setFillParent(true);
elem.setBounds(0, 0, Core.graphics.getWidth(), Core.graphics.getHeight());
if(Core.input.keyTap(Binding.menu)){
shown = false;
}
});
elem.touchable = Touchable.enabled;
elem.addListener(new ElementGestureListener(){
@Override
public void zoom(InputEvent event, float initialDistance, float distance){
if(lastZoom < 0){
lastZoom = zoom;
}
zoom = Mathf.clamp(distance / initialDistance * lastZoom, 0.25f, 10f);
}
@Override
public void pan(InputEvent event, float x, float y, float deltaX, float deltaY){
panx += deltaX / zoom;
pany += deltaY / zoom;
}
@Override
public void touchDown(InputEvent event, float x, float y, int pointer, KeyCode button){
super.touchDown(event, x, y, pointer, button);
}
@Override
public void touchUp(InputEvent event, float x, float y, int pointer, KeyCode button){
lastZoom = zoom;
}
});
elem.addListener(new InputListener(){
@Override
public boolean scrolled(InputEvent event, float x, float y, float amountX, float amountY){
zoom = Mathf.clamp(zoom - amountY / 10f * zoom, 0.25f, 10f);
return true;
}
});
parent.fill(t -> {
t.setFillParent(true);
t.visible(() -> shown);
t.update(() -> t.setBounds(0, 0, Core.graphics.getWidth(), Core.graphics.getHeight()));
t.add("@minimap").style(Styles.outlineLabel).pad(10f);
t.row();
t.add().growY();
t.row();
t.button("@back", Icon.leftOpen, () -> shown = false).size(220f, 60f).pad(10f);
});
}
public boolean shown(){
return shown;
}
public void hide(){
shown = false;
}
public void toggle(){
if(renderer.minimap.getTexture() != null){
float size = baseSize * zoom * world.width();
float ratio = (float)renderer.minimap.getTexture().height / renderer.minimap.getTexture().width;
float px = player.dead() ? Core.camera.position.x : player.x, py = player.dead() ? Core.camera.position.y : player.y;
panx = (size/2f - px / (world.width() * tilesize) * size) / zoom;
pany = (size*ratio/2f - py / (world.height() * tilesize) * size*ratio) / zoom;
}
shown = !shown;
}
}