Это хороший ОО дизайн? - PullRequest
4 голосов
/ 23 мая 2011

Я создаю API для себя, чтобы выполнять 2D скелетную анимацию.

У меня есть класс Bone и класс Skeleton.

Skeleton создает корневую кость, а затем последующие костидобавлено с помощью метода add Skeleton, предоставив родительскую кость.

Что я сейчас хочу сделать, это добавить анимацию и кадры.

То, о чем я думал, - это класс, который может загружать и интерполироватьанимации.Так что это будет объект, который будет загружать анимацию.Затем в каждом кадре будет использоваться скелет и соответственно изменяться скелет.

Это хороший дизайн?Должна ли анимация брать скелет или скелет должен брать анимацию и накладывать ее на себя?

Ответы [ 3 ]

7 голосов
/ 23 мая 2011

Лучше всего создать анимацию, которая использует скелет вместо противоположного. Это потому, что, логически говоря, объект Skeleton не требует анимации для жизни, но анимация настоятельно требует скелета. Таким образом, вы можете соединить эти элементы в самой анимации. Не помещайте слишком много логики в объекты, и попробуйте разместить их там, где это необходимо.

1 голос
/ 23 мая 2011

Предположительно, каждая кость имеет двумерную позицию / угол, а анимация представляет собой набор кадров, где каждый кадр представляет собой набор идентификаторов кости и положение / углы?

Тогда вы можете рассмотреть что-то вроде

public class Skeleton
{
    public List<Bone> Bones {get;set;}
    public void Animate(Animation animation)
    {
        foreach(Bone bone in Bones)
        {
           bone.Displace(animation.Displacements.FirstOrDefault(o=>o.BoneId == bone.BoneID));
        }
    }
}
0 голосов
/ 23 мая 2011

Я бы создал класс Animation, содержащий элемент данных std::vector<Skeleton>, который вы можете использовать для манипулирования отдельными Skeleton объектами в каждом кадре или интерполяции между несколькими Skeleton объектами в векторе из ключевых кадров.Затем, когда вы «воспроизводите» анимацию, вам просто нужно выполнить итерацию по вектору, вызывая каждый Skeleton объект, и передать его какой-то другой функции или классу, которые будут отображать результаты на экране (или делать что-либо еще Skeleton может быть полезно для, например, деформации сетки и т. Д.)

Наличие объекта анимации значительно упростит управление кадрами анимации, позволяя удалять / заменять кадры и т. Д. В противном случаеесли вы попытаетесь объединить всю эту функциональность в объект Skeleton, то обнаружите, что при попытке манипулировать отдельными аспектами Skeleton отдельно от последовательности анимации вы обнаружите много багажа (т. е. предположим, что вам нужно изменить иерархиюСкелет для сегмента кадров и т. д.? ... это было бы очень легко, если бы в каждом кадре был Скелет, но не если у вас есть монолитный объект Скелтона).

...