Nano Hash - криптовалюты, майнинг, программирование

Перекрывающиеся объекты в Java

Как следует из названия, у меня проблема с перекрытием объектов. Я хочу, чтобы они могли перекрываться, потому что мне нужно, чтобы объект X был поверх объекта Y, чтобы получить точку, и если я удаляю объект X из верхней части Y, я удаляю указанную точку. Моя проблема заключается в том, что если объект Y создается до объекта X, как только я помещаю объект X поверх Y, я больше не могу его перемещать, и он всегда выводит на консоль объект Y. Мне было интересно, будет ли проще способ исправить это.

Я пытаюсь двигаться вперед, но Коробка не двигается с места:

[https://i.stack.imgur.com/pXAOe.png

Это код, который я использую для генерации данных уровня.

 private List<ImageTile> createLevel(){
    ArrayList<Movable> aux1 = new ArrayList<>();
    ArrayList<Immovable> aux2 = new ArrayList<>();

    try {
        Scanner sc = new Scanner(new File ("levels/level" + levelID + ".txt"));
        String line = "";

        while(sc.hasNextLine()) {
            for (int y = 0; y < HEIGHT; y++) {
                line = sc.nextLine();
                for(int x = 0; x < WIDTH ; x++) {
                    levelObjects.add(new floor(new Point2D(x,y), "Floor", 0));//adding the floor before anything else
                    char letter = line.charAt(x); // checking the character in the X coordinate
                    if (letter == 'E') { // in case, there's a E, that's the starting position of the player
                        player = new Forklift(new Point2D(x,y), "Forklift_U", 2);
                        levelObjects.add(player);
                        objects.add(player);
                    } else if(letter != ' ') {
                        AbstractObject obj = ObjectCreation.readChar(letter, x, y); // going to look for the object in Factory to be put in the X and Y position
                        if(obj instanceof Immovable) {
                            aux2.add((Immovable) obj);
                        }else if(obj instanceof Movable) {
                            aux1.add((Movable) obj);
                        }
                        //                          comp.comprator(obj, obj);
                        objects.add(obj);
                        levelObjects.add(obj);//implementing said object into the Level
                    }
                }
            }
        }
        sc.close(); //Closing Scanner
    } catch (FileNotFoundException e) {
        System.out.println("No levels found!");
    }
    still = aux2;
    moving = aux1;
    return levelObjects;
}

Затем я проверяю с помощью общей функции перемещения, может ли поле (или любая часть объекта экземпляра Movable) перейти в следующую позицию.

public void move(Direction direction) {
    Vector2D pos = direction.asVector(); // Transforming the direction in a vector right off the bat.
    Point2D currentPosition = getPosition(); // getting the current position of either player or object.
    Point2D nextPosition = currentPosition.plus(pos); // the next position as to which the player or the object intend to go to.

    if(isTransposable(nextPosition)) { // calls the function to see if the object is able to move to the next position, this prevents the boxes from pushing up into the walls and from into each other {
        setPosition(nextPosition); //if it can, then the object will go to the next position
    }
}

И это для проверки того, может ли объект перейти на следующую позицию;

public boolean isTransposable(Point2D pos) { // is the object able to move to the next position
    for(AbstractObject obj1 : Game.getInstance().getObjects()) { // for-each to get all the objects, with the exception of the floor, from the game.
        if((obj1.isBlockable() && obj1.getPosition().equals(pos))){ // if the object is able to block and if it's position is the same as the nextPosition.
            return false;
        }
    }
    return true; // otherwise it's able to be walked on.
}
05.05.2020

  • Что ты имеешь в виду? Я не знаю требований для публикации здесь или того, что должно быть включено большую часть времени... если бы вы могли сообщить мне, я был бы признателен! 06.05.2020
  • Я не знал, что вводить код обязательно, но опять же, мне следовало подумать о его реализации, как только я делал пост... 10.05.2020
  • Ну, теперь это решено, поэтому я удалил свои комментарии :) 10.05.2020

Ответы:


1

Это был простой случай наличия двух списков, один из которых имеет приоритет над другим. На картинке вы можете видеть, что коробка находится поверх цели, но как только это произойдет, движок прочитает плитку, которая пришла первой, в данном случае это цель. Поскольку тот неподвижен, это означало, что его нельзя было толкнуть/переместить каким-либо образом. Независимо от того, есть ли у вас что-то сверх этого, что может.

Способ, который я использовал для исправления, заключался в том, чтобы просто проверить, относится ли объект к классу movable.

public boolean isMovable(Point2D pos) {
    for(AbstractObject obj1 : Game.getInstance().getObjects()) { 
        if((obj1.isMovable() && instanceof Movable)){ 
            return true;
        }
    }
    return false;
}
24.10.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..