Для начала я бы не сделал Collidable абстрактным классом.Хотя для этого есть, вероятно, веские аргументы;мне просто кажется, что это ситуация, когда многие объекты могут сталкиваться друг с другом.
Итак, я бы порекомендовал вот что:
// Assuming you're working in 2 dimensions
public class Coordinates {
public Coordinates(float x, float y) {
// etc etc etc
}
}
public interface ICollidable {
// Using unusually long name to illustrate point,
// but feel free to rename.
public int getMaxDistanceFromCenterOfMass(Coordinates unitVector);
public Coordinates getCenterOfMass();
}
И затем, для Square, Triangle и Circle, я бы реализовал интерфейс.
public class Square implements ICollidable {
@Override
public int getMaxDistanceFromCenterOfMass(Coordinates unitVector) {
// Must declare and initialize
return this.lengthOfSide;
}
@Override
public Coordinates getCenterOfMass() {
return this.centerOfMass;
}
}
public class Circle implements ICollidable {
@Override
public int getMaxDistanceFromCenterOfMass(Coordinates unitVector) {
// Must declare and initialize
return this.radius;
}
@Override
public Coordinates getCenterOfMass() {
return this.centerOfMass;
}
}
public class Triangle implements ICollidable {
@Override
public int getMaxDistanceFromCenterOfMass(Coordinates unitVector) {
// Must declare and initialize
return this.lengthOfSide;
}
@Override
public Coordinates getCenterOfMass() {
return this.centerOfMass;
}
}
Затем в вашей PhysicsMgr ...
public class PhysicsMgr {
public boolean Collides(ICollidable p1, ICollidable p2) {
Coordinates cm1 = p1.getCenterOfMass();
Coordinates cm2 = p2.getCenterOfMass();
int length = Math.sqrt(Math.pow(cm1.x - cm2.x, 2) + Math.pow(cm1.y - cm2.y, 2))
// It is a misnomer to use coordinates as a unit vector, but if I defined a
// UnitVector class, it would be exactly the same with the exception of
// the class name for this situation.
Coordinates unitVector = new Coordinates((cm1.x - cm2.x)/length, (cm1.y - cm2.y)/length);
int collisionDistance1 = p1.getMaxDistanceFromCenterOfMass(unitVector);
int collisionDistance2 = p2.getMaxDistanceFromCenterOfMass(unitVector);
return (length - collisionDistance1 - collisionDistance2) <= 0;
}
}
Единственное важное замечание здесьчто использование maxDistance от центра масс в буквальном смысле даст вам только приближение для квадрата и треугольника.Точнее, вам придется объявить некоторую ориентацию, тета и вычислить расстояние от центра масс объекта до края вдоль единичного вектора (что будет сложно, но точно).
Другойчто приятно, так это то, что он позволяет вам легко добавлять другие объекты, которые могут встречаться, когда ваш движок становится более сложным.Это также делает так, что ни один из объектов не должен знать друг о друге.
Я был физическим ТА в течение 3 лет, и именно так я получил свое первое знакомство с программированием.Если вы заинтересованы в дополнительной работе, вот ссылка на книгу, которую мы использовали: http://matterandinteractions.org/ Это здорово для программистов, потому что она учит физике, используя примеры кодирования на python (в частности, vpython http://vpython.org/)Так что это было бы очень хорошим справочником для программирования по физике.