Предметы игровых персонажей LibGDX

Я работаю над простой 2D-платформерной игрой, в которой игрок ходит и собирает предметы (например, пистолет, меч и т. Д.). Итак, вот мой игрок (или персонаж)

public class CoolGuy extends GameObject {
    private Rectangle bottom, left, right, top, full;
    private Sprite sprite;

    public CoolGuy(){
        full = new Rectangle(0, 0, 50, 98);
        bottom = new Rectangle(0, 0, 50, 15);
        top = new Rectangle(0, 83, 50, 15);
        left = new Rectangle(0, 15, 25, 68);
        right = new Rectangle(25, 15, 25, 68);

        sprite = new Sprite(TextureManager.coolGuy);
        sprite.setSize(50, 98);
    }

    /* lots of code here */
}

также у меня есть класс Item. Когда игрок сталкивается с этим классовым спрайтом (и прямоугольником), игрок должен получить новую силу (например, стрельбу и так далее...)

        public class Gun extends ItemObject{

            private Sprite sprite;
            private Rectangle full;

            public Gun(int x, int y){
                sprite = new Sprite(TextureManager.gunItem);
                sprite.setSize(25, 15);

                full = new Rectangle(0, 0, 25, 15);

                setPosition(x, y);
            }

            @Override
            public int hits(Rectangle r) {
                if(full.overlaps(r)){
                    return 1;
                }
                return -1;
            }
/* lots of code here */
    }

А вот и мой новый класс мощности. В этом случае стреляет новая сила.

public class PlayerBullet extends ItemObject{

    private Sprite sprite;
    private Rectangle full;

    public PlayerBullet(){
        sprite = new Sprite(TextureManager.playerBullet);
        sprite.setSize(15, 15);
        full = new Rectangle(0,0,15,15);
    }

    @Override
    public int hits(Rectangle r) {
        if(full.overlaps(r)){
            return 9;
        }
        return -1;
    }
    /* A lot of code here */
}

Итак, как мне добавить эту силу в мой плеер? Я знаю, что у меня может быть много логических значений и даже объект PlayerBullet в моем CoolGuy (классе игрока), и я могу установить для них все значения null, а позже, если игрок сталкивается с моим классом Gun, я могу создать новый объект и так далее. .. Но я считаю, что есть и другой путь. введите здесь описание изображения


person David    schedule 02.03.2015    source источник
comment
Есть бесконечное количество способов сделать это, и вы уже упомянули один из самых простых способов. Не уверен, что вы на самом деле спрашиваете.   -  person Tenfour04    schedule 02.03.2015
comment
Хорошо, а если у меня 20 предметов? Тогда у меня должны быть все объекты предметов в моем классе игрока. Я не думаю, что это хорошая идея...   -  person David    schedule 02.03.2015
comment
Поместите их в Список. Или используйте логический массив, где каждый индекс соответствует типу элемента.   -  person Tenfour04    schedule 02.03.2015


Ответы (2)


Сделайте ссылку на «ItemObject» в вашем классе проигрывателя и пока не инициализируйте его. Эта ссылка будет отслеживать ваше текущее усиление. Когда игрок проходит по спрайту, установите ссылку на этот объект. Теперь, когда вы хотите выполнять действия, специфичные для предмета, поместите эти действия/методы в класс повышения мощности, которым в вашем случае является PlayerBullet. Теперь вам не нужно проверять, какой предмет есть у вашего игрока, и вы можете эффективно выполнять действия, специфичные для предмета. Класс CoolGuy:

public class CoolGuy extends GameObject {
private Rectangle bottom, left, right, top, full;
private Sprite sprite;'

ItemObject currentItem;

public CoolGuy(){
    full = new Rectangle(0, 0, 50, 98);
    bottom = new Rectangle(0, 0, 50, 15);
    top = new Rectangle(0, 83, 50, 15);
    left = new Rectangle(0, 15, 25, 68);
    right = new Rectangle(25, 15, 25, 68);

    sprite = new Sprite(TextureManager.coolGuy);
    sprite.setSize(50, 98);
    }

public void equipItem(ItemObject item){
currentItem = item;
}

 /* lots of code here */
}

Вы можете вызвать этот метод equipItem() и передать ему объект, который сталкивается с игроком. Для использования усиления вы можете добавить еще один метод в PlayerBullet или Gun:

public void ItemUsed(){
 //item use effect
}

А затем создайте другой метод в Player и вызовите ItemUsed из этого метода:

public void useItem(){
//check if player has any item 
if(currentItem != null){
//if it has then use item
currentItem.useItem();
}
}

Конечно, вам придется добавить ArrayList или Array, если вы хотите экипировать более одного предмета за раз.

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

person Zohaib Amir    schedule 02.03.2015

@user3334375 user3334375 Вам просто нужно тщательно нарисовать эту коробку. Это означает, что если вы даете несколько очков с помощью этого блока питания пистолета, установите флажок Если очки учитываются, снимите флажок. Например

if (!powerboxscored){Draw power box} // 

этот метод принимает логическое значение powerboxscored. Если логическое значение равно false, оно будет рисовать это поле до тех пор, пока логическое значение не станет истинным, и оно станет истинным только тогда, когда вы добавите мощность в свой код...

Я надеюсь, что это помогает..

person Aiman Batul    schedule 11.03.2015