После добавления Google Guava r09 в наш проект Android время сборки значительно увеличилось, особенно на этапе генерации DEX. Я понимаю, что поколение DEX принимает все наши классы + все банки, от которых мы зависим, и переводит их в формат DEX. Гуава довольно большая банка вокруг 1.1MB
P.S. Обычно я строю из Intellij, но я также пробовал строить с Maven - те же результаты.
Спасибо
Алекс
-121--1006406-Пытаясь разработать компонент обнаружения коллизий для игры, я придумал следующее решение. Я определяю интерфейс ICollidable, который выглядит примерно так:
interface ICollideable
{
Sprite Sprite { get; }
int Damage { get; }
void HandleCollision(ICollideable collidedWith);
}
В основном, любые игровые объекты, которые хотят участвовать в обнаружении коллизий, должны реализовать этот интерфейс, затем зарегистрироваться на детекторе, который поддерживает список ICollideables. При обнаружении столкновения он вызывает метод HandleCollision для объекта и передает ссылку на объект, с которым он столкнулся.
Мне нравится это, потому что это позволяет мне держать все мои алгоритмы столкновений в одном месте, и позволяет игровым объектам самим решать, как справиться с столкновением. Но из-за последнего я нахожу, что мне приходится проверять базовый тип объекта. Например, я не хочу, чтобы игроки сталкивались друг с другом, поэтому в классе Player может быть что-то вроде:
void HandleCollision(ICollideable collidedWith)
{
if (!(collidedWith is Player)) { // do stuff }
}
и так далее, и мне интересно, говорит ли это мне, что у меня плохой дизайн и каковы могут быть альтернативы.
Второй вопрос, далее по линии первого. В целях оценки, если Враг уничтожен Снарядом, кто-то должен знать «Владеющего игрока» члена класса Снаряд. Тем не менее, ни один из моих других столкнувшихся объектов не имеет или не нуждается в этом свойстве, поэтому я нахожусь в желании сделать (в Enemy HandleCollision):
void HandleCollision(ICollideable collidedWith)
{
if (collidedWith is Projectile) {
Health -= collidedWith.Damage;
if (Health <= 0) {
Player whoDestroyedMe = (collidedWith as Projectile).FiredBy
// ...
}
}
}
У меня нет понятия, как справиться с этим с помощью лучшего дизайна. Любые идеи будут оценены.
ИЗМЕНИТЬ: Я хотел сосредоточиться на втором вопросе, потому что мой кишечник подсказывает мне, как справиться с этим решит первый вопрос. Что касается первого вопроса, я подумал о том, как абстрагироваться от этого поведения. Я мог бы определить перечисление:
enum Team
{
Player,
Enemy,
Neither
}
и иметь ICollideables реализовать это свойство. Тогда детектор столкновений просто не регистрирует столкновения между конфликтующими объектами на одной и той же «Команде». Таким образом, Player и Player Projectiles будут в одной команде, Enemy и Enemy Projectiles - в другой,и окружающая среда (которая может повредить и то, и другое) не может быть ни на одном. Это не обязательно должен быть перечисление, может быть int или последовательность или что-либо еще, с идеей, что объекты с одинаковым значением для этого свойства не сталкиваются друг с другом.
Мне нравится идея моделирования поведения с помощью простого атрибута. Например, если я хочу включить «разрешить дружественный огонь», все, что мне нужно сделать, это создать Снаряды со значением Команды, отличным от значения Команды Игрока. Однако у меня все еще могут быть случаи, когда этого недостаточно. Например, Игрок может иметь щиты, которые временно непроницаемы для снарядов, но не будут защищать от прямого столкновения с противником и так далее.