2013-07-29 2 views
2

Im работает над карточной игрой, используя libgdx и scene2d. Класс моей карты расширяет класс актера изображения. Я пытаюсь найти способ установить порядок отображения моих карт на основе их позиции x при перетаскивании.Как настроить индекс actor z на основе x?

enter image description here

Так я пробовал:

@Override 
public void drag(InputEvent event, float x, float y, int pointer) { 
    float sx = event.getStageX(); 
    float sy = event.getStageY(); 
    if(sx - offsetX > 0 && sy - offsetY > 0){ 
     event.getTarget().setPosition(sx - offsetX, sy - offsetY); 
     c.setZIndex((int) sx); 
    }    
} 

Это не будет работать, потому что по-видимому, ZIndex связан с числом участников в стадии/группы. Поэтому в основном индекс должен быть 0-4. Мой следующий подход состоял в том, чтобы разделить ширину экрана на 5 и установить это для zindex. Он отлично работает, если карты разделены равномерно по всей ширине. Но если карты сжимаются посередине, они не выглядят хорошо. От 2 до 3 карт выпадают посередине, а последний перетаскиваемый - тот, который нарисован поверх других. Который я не хочу.

Мой последний подход состоял в том, чтобы заказать все мои карты по их положению и петле через них, указав z-index. И это работает, как я хочу, но я нахожу его медленным (когда все остальные вещи добавляются в микс)

Так или иначе, я могу установить z-индекс относительно x-позиции без петли через актеров?

ответ

3

Имейте массив начальных позиций всех ваших карт. Всякий раз, когда происходит перетаскивание, повторно перетасовывайте свой массив на основе метода перетаскивания, который у вас уже есть. Нарисуйте карты, используя позиции, хранящиеся в вашем массиве, от 0 до длины - 1, где первая позиция карты находится в индексе 0, а последняя имеет длину массива минус 1.

Или - используйте Group. Добавить группу в порядке рисования. Вы можете обменять актеров в группе. Поменяйте карты на основе событий перетаскивания.

+0

Значит, мне все равно придется проходить через этот массив (точек)? мой вопрос состоял в том, как это сделать, не зацикливаясь на нем. О функции свопа группы, плохо попробуйте это. Но опять же, мне нужно было бы найти актера, чтобы поменять его ..:/Могу ли я сделать это, не зацикливая всех актеров? – noisyass2

+0

Вы недооцениваете силу аппаратного обеспечения. Если у вас есть сто актеров, и вы зацикливаете массив (помните, что ваш массив очень светлый. Все, что он содержит, это векторы. Vector2 posArray []), это не приведет к развалу. Независимо от того, что вы еще должны сказать libGDX для рисования. Следовательно, libgdx должен проходить через игроков. –

+0

@ noisyass2 Попробуйте бенчмаркинг. Бьюсь об заклад, первое предложение использования массива будет намного быстрее. –

 Смежные вопросы

  • Нет связанных вопросов^_^