Как убрать отступы от краев экрана кустарного UI в зависимости от разрешения?

198
14 декабря 2018, 23:00

Я пишу игру на Java, (с использованием движка Slick2D и библиотеки MarteEngine, если это важно), и реализуя свой UI столкнулся с появлением отступов слева и сверху, если персонаж подходит слишком близко к этим краям экрана. Справа и снизу никаких проблем. Методом научного тыка выяснилось, что размеры отступов зависят от разрешения окна, и нашлись их приблизительные значения, но это не выход..
Что удалось выяснить:

  • для 800х600 это 100 по вертикали, и 0 по горизонтали
  • для 640х480 это 18 по горизонтали и 60 по вертикали

Полный код проекта, если нужно.
(архив будет сравнительно толстый из-за ресурсов)
Исходный код класса:

package system;
import org.newdawn.slick.Color;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.SlickException;     
import core.MyWorld;
import entities.TwilightSparkle;
public class WorldUI {
//мир, которому принадлежит интерфейс
MyWorld parent;

//нижняя панель
protected Image bottomBar;
protected Image battleBottomBar;
//верхняя панель
protected Image topBar;
//полосы жизни, и очков магии
protected Image HP;
protected Image IP;
//относительные координаты интерфейса
float interfaceX = 0;
float interfaceY = 0;
private boolean debug;
public WorldUI(MyWorld parent, GameContainer container) {
    this.parent = parent;
    interfaceX = (container.getWidth() - parent.twilie.hitboxWidth)/2;
    interfaceY = (container.getHeight() - parent.twilie.hitboxHeight)/2;
}
public void init() throws SlickException {
    topBar = new Image("textures/topBar.png");
    bottomBar = new Image("textures/Interface2.png");
    battleBottomBar = new Image("textures/Interface3.png");
    HP = new Image("textures/IP.png");
    IP = new Image("textures/HP.png");
}
public void draw(Graphics g) {
    //жизнь и мана
    HP.draw(interfaceX+100, interfaceY+parent.container.getHeight()-90);//520  
    IP.draw(interfaceX+100, interfaceY+parent.container.getHeight()-50);//560  
    //верхняя и нижняя рамка интерфейса
    topBar.draw(interfaceX, interfaceY);   
    bottomBar.draw(interfaceX, interfaceY+parent.container.getHeight()-128);
    //Отладка
    if(debug) {
        g.setColor(Color.red);
        g.drawString(this.toString(), interfaceX+parent.container.getWidth()/2, interfaceY+20);
    }
}
public void update() {
    System.out.println("--- updates! ---");
    //полезные переменные для сокращения кода
    TwilightSparkle pony = MyWorld.twilie;
    int worldWidth = parent.width;
    int worldHeight = parent.height;
    int screenWidth = parent.container.getWidth();
    int screenHeight = parent.container.getHeight();       
    int halfOfScreenWidth = (screenWidth - pony.hitboxWidth)/2;
    int halfOfScreenHeight = (screenHeight - pony.hitboxHeight)/2;
    //если мы не достигли границ экрана, то координаты интерфейса следуют за персонажем     
    float halfOfPonyPositionX = pony.x - halfOfScreenWidth;
    float halfOfPonyPositionY = pony.y - halfOfScreenHeight;
    if(halfOfPonyPositionX  +100/* + 18*/ > halfOfScreenWidth && halfOfPonyPositionX + screenWidth < worldWidth) {
        interfaceX = halfOfPonyPositionX;
        System.out.println("upd X");
        System.out.println("interfaceX = halfOfPonyPositionX = "+(interfaceX));
    }
    if(halfOfPonyPositionY > halfOfScreenHeight /*+ 60*/ && halfOfPonyPositionY + screenHeight < worldHeight) {
         interfaceY = halfOfPonyPositionY;
            System.out.println("upd Y");
            System.out.println("interfaceY = halfOfPonyPositionY = "+(interfaceY));
    }
}
public void debug(boolean debug) {
    this.debug = debug;
}
@Override
public String toString() {
    StringBuilder log = new StringBuilder("--- Interface Log ---");
    log.append("\n"+"interfaceX = " + interfaceX);
    log.append("\n"+"interfaceY = " + interfaceY);
    log.append("\n"+"halfOfScreenWidth = " + parent.container.getWidth()/2);
    log.append("\n"+"halfOfScreenHeight = " + parent.container.getHeight()/2);
    log.append("\n"+"Twi X = " + parent.twilie.x);
    log.append("\n"+"Twi Y = " + parent.twilie.y);
    log.append( "\n"+"worldWidth = " + parent.width);
    log.append( "\n"+"screenHeight = " + parent.height);
    return log.toString();
}
}

Вопрос, как убрать эти отступы?

READ ALSO
Проблема с наследованием и методами

Проблема с наследованием и методами

Есть класс Animal и сабкласс Cat, хочу, чтоб Cat принимал имя и ограничение на максимальное расстояние для бега

222
как включить обычный класс в DI

как включить обычный класс в DI

собственно сабж, как из обычного класса использовать @Inject? как я понимаю для этого класс должен находится контексте или иными словами контекст...

209
Вывод элемента из массива объектов

Вывод элемента из массива объектов

Как выполнить вывод всех элементов из ячейки массива объектов? Допустим, если мне нужно имя, то пишу arr[0]name

215
Можно ли совместить работу на Cи c Java?

Можно ли совместить работу на Cи c Java?

Есть проект на чистом СиОн выходит в сеть, что-то делает и тому подобное

217