Перегрузка методов платформы в target-c или сохранение локальных изменений с помощью обновлений инфраструктуры - PullRequest
1 голос
/ 06 апреля 2010

Я использую cocos2d для создания игры для iPhone.В основном это сделано, но по пути я столкнулся с некоторыми вещами, с которыми я хотел бы справиться лучше.Я довольно новичок в Objective C, и, честно говоря, я делаю больше сценариев Perl в своей повседневной работе, чем что-либо еще, поэтому мои навыки в C немного устарели.

Одним из них является тот факт, что у меня естьмодифицированные файлы cocos2d для некоторых особых случаев в моей игре.Однако, когда я обновляюсь до новой версии, мне приходится вручную выдвигать свои изменения.

Итак, вопрос в том, как лучше всего с этим справиться?

Некоторые варианты, о которых я подумал:

  1. Перегрузка / переопределение классов cocos2d.У меня сложилось впечатление, что я не могу перегрузить существующие функции класса, поэтому я не думаю, что это сработает.
  2. Создание патчей, которые я повторно применяю после обновлений библиотеки.Я не думаю, что это будет работать, так как новые файлы не обязательно будут такими же, как старые, и если бы они были, я мог бы просто скопировать весь файл вперед.
  3. Включите мои изменения в Cocos2d,Не вариант, так как мои изменения очень специфичны для моего приложения.

Я что-то упускаю из виду?

ОБНОВЛЕНИЕ:

Я будуобъясните, что я делаю, чтобы быть более ясным.

Cocos2d имеет объект CCNode, который может содержать дочерние элементы и т. д. Я добавил тень, которая очень похожа на дочернюю, но обрабатывается немного по-другому.Тень имеет смещение от родителя и перемещается вместе со своим родителем, вращается вокруг своего собственного центра при вращении родителя и т. Д. Однако тень не является истинным дочерним элементом, поэтому при правильном z-индексе тени могутвизуализировать под ВСЕМИ другими объектами, но все еще перемещать вместе с родителем.

Для этого я добавил addShadow функции в CCNode и изменил функции setPosition и setRotate, чтобы переместить shadowSprite:

CCNode.m:

-(id) init 
{ 
        if ((self=[super init]) ) { 
            ...
            shadowSprite_ = nil;
            ...
        }
}

...

-(BOOL) addShadow: (CCNode*) child offset: (CGPoint) offset
{ 
        shadowSprite_ = child;
        shadowSprite_.position = CGPointMake(position_.x+offset.x, position_.y+offset.y);
        return YES;
} 

...

-(void) setRotation: (float)newRotation
{ 
        rotation_ = newRotation; 
        isTransformDirty_ = isInverseDirty_ = YES;

        if(shadowSprite_) { 
                [shadowSprite_ setRotation: newRotation];
        } 
}

Конечно, есть и другие, включая прототипы в файле .h, но это основы.Я не думаю, что мне нужно shadowSprite, чтобы быть свойством, потому что мне не нужно обращаться к нему после того, как оно было добавлено.

1 Ответ

1 голос
/ 06 апреля 2010

Я могу придумать несколько способов сделать это:

  • подкласс и переопределить определенные методы. Это предпочтительнее, если это возможно.

слегка хакерские методы:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...