CALayers Несколько слоев на основе одного слоя - PullRequest
2 голосов
/ 08 августа 2011

В настоящее время я пытаюсь сделать 2D-игру с базовой анимацией на основе CALayers. Я уже разобрался с пользовательским спрайтовым слоем, но теперь все сводится к игровым объектам.

Объекты (которых пользователь должен избегать) упадут с верхней части экрана и исчезнут, если они никогда не вступят в контакт с пользователем. Однако, поскольку все эти препятствия будут одинаковыми, я решил создать отдельные .h и .m, которые определяют объект, и пару строк кода, которые делают каждое препятствие «входящим в игру».

Итог, у меня два вопроса: 1. Как бы я "импортировал" каждое препятствие в основной вид как CALayer? Является ли наличие отдельных файлов для препятствий лучшим способом выполнения действий, даже если препятствия - это всего лишь одно изображение?

Ответы [ 2 ]

2 голосов
/ 08 августа 2011

Если вы уже выяснили пользовательский спрайт, вы, вероятно, столкнулись с addSublayer:, который вызывается на другом слое для добавления его в дерево слоев. По сути, чтобы добавить препятствия, вам нужно создать новый слой для одного с помощью - [CALayer layer], настроить его и [rootLayer addSublayer: препятствие];

Теперь к вашему вопросу об отдельных файлах: создание нового класса с собственным заголовком и реализацией - отличная идея. Но просто сделайте один класс (т. Е. Одну пару .h / .m) для определения того, как работает Препятствие, и создайте множество его экземпляров, выполнив вызов - [[Obstacle alloc] init] (не забудьте освободить их, когда они не больше видно!)

Как "Препятствие" становится импортированным и видимым? Скорее всего, вы поместите переменную в @interface {} объекта Obstacle, который является типом CALayer. GameBoard (или ViewController для очень простых прототипов / приложений) может иметь метод -addObstacle: он принимает препятствие, запрашивает его слой и добавляет его в rootLayer.

Пытаясь быть тщательным, я, возможно, пропустил суть вашего вопроса, который был более похож на: "Должен ли я вообще иметь класс препятствий или просто массив препятствий, заполненный CALayers?" Вы, конечно, могли бы сделать это таким образом, учитывая описание игры. Но как только вы захотите сохранить какую-либо информацию об отдельных экземплярах Препятствий, вам лучше самим объектам отвечать на вопросы об этой информации. Я сделал множество прототипов / тестовых приложений, которые просто имеют массив слоев, потому что, хотя CALayer твердо находится в сфере View MVC, он часто содержит всю информацию о модели, которая мне нужна: x, y, bounds, color, content и т. д. Все, что я превратил в реальное приложение, хотя для удобства сопровождения пришлось переписывать большими частями.

1 голос
/ 13 августа 2011

Я работаю над 2D-защитой башни и у меня есть довольно хорошее решение.Вы хотите создать класс объектов для ваших препятствий и сохранить их в массиве.Когда препятствие достигает нижней части экрана, оно не уничтожается, а просто скрывается.Когда вы хотите создать новое препятствие, вы сначала пытаетесь утилизировать старые, прежде чем создавать новое.Я использую это для обработки тысяч различных объектов CALayer без хлопот.

-(void)newObstacleAtLocation:(CGPoint)newPosition;
{
    //create the array if it doesn't already exist - could add this to your init
    if(!obstacles)
    {
        obstacles = [NSMutableArray array];
    }
    for(obstacle* anObstacle in obstacles)
    {
        //find the first hidden coin and use it
        if(anObstacle.hidden)
        {
            //reset the obstacles position to where you want the "new" obstacle
            obstacle.position = newPosition;
            obstacle.hidden = NO;
            return;
        }
    }
    //didn't find any unused obstacles - make a new one
    [obstacles addObject:[[[obstacle alloc]initWithSuperLayer:self.mapLayer] autorelease]];
}
...