Мне нужно думать, как программист: дети и родители в Cocos2d, структура программы, перечисления и т. Д. - PullRequest
2 голосов
/ 22 января 2012

Я полностью программист Objective-C, и мне нужен совет, как лучше структурировать проект, над которым я работаю.

Я имею дело с CCSprite, .tags и некоторыми общими проблемами структуры программы, из-за которых у меня возникают проблемы с поиском наилучшего способа структурирования программы.

На данный момент программа работает именно так, как я хочу, но похоже, что я теряю строки кода и чрезмерно избыточен. Я хочу избавить себя от проблем в будущем и сделать все сразу.

В сущности, я создаю полностью анимируемого фальсифицированного персонажа из CCSprites. Мне нужно, чтобы каждая часть его тела оживлялась независимо от других частей тела. Чтобы добиться этого, я создал метод, который я вызываю в методе -init моего CCScene, который проходит через него и создает CCSprites и связывает их с соответствующей частью. Вот код для метода:

-(void) characterInit{
CGSize size = [[CCDirector sharedDirector] winSize];

//Torso

CCSprite * torso = [CCSprite spriteWithFile:@"Torso.png"];
torso.anchorPoint = ccp(.5, .5);
torso.position = ccp(size.width/2, size.height/2);
torso.scale = 1;
torso.tag = torsoTag;
[self addChild:torso];

//Head

CCSprite * head = [CCSprite spriteWithFile:@"Head.png"];
head.anchorPoint = ccp(.5, 0);
head.position = ccp(50,60);
head.tag = headTag,
[torso addChild:head z:1];

//Eyes

CCSprite * eyes = [CCSprite spriteWithFile:@"Eyes.png"];
eyes.anchorPoint = ccp(.5, .5);
eyes.position = ccp(35, 45);
eyes.color = ccc3(255, 255, 255);
eyes.tag = eyesTag;
[head addChild:eyes];
...
...
...

... это продолжается для каждой части тела.

Ключевым моментом здесь является то, что я использую просто старые int с числовым значением для .tag для каждого CCSprite. Я объявляю int над этим методом вне любых других методов, чтобы они были доступны и внутри метода init.

Вопрос 1: Что может быть лучше для этого? Может быть, как enum? Как бы выглядел этот код, и есть ли лучший способ генерировать этот код, а не просто записывать каждое значение, как я делал, когда у меня их было int s?

Теперь мой следующий вопрос приходит после того, как я прошел и создал все CCSprites. Когда я хочу использовать их вне метода, в котором я их создал, я использую такой код из моего init метода:

        CCSprite * torso = (CCSprite *) [self getChildByTag:torsoTag];
        CCSprite * head = (CCSprite *) [torso getChildByTag:headTag];
        CCSprite * eyes = (CCSprite *) [head getChildByTag:eyesTag];


 [eyes runAction:...];

Изначально я пытался просто позвонить ...

CCSprite * eyes = (CCSprite *) [self getChildByTag:eyesTag]; 

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

Это Отстой.

Дело в том; Я чувствую, что просто неправильно об этом думаю. Я хочу организовать свой код, но суть организации в том, что вам не нужно быть избыточным.

Вопрос 2: Что мог бы сделать лучший программист, чем я, чтобы справиться со всей этой чокнутой ситуацией?

Спасибо за ваше время, ребята, и извините за СТЕНУ ТЕКСТА .

Ответы [ 2 ]

3 голосов
/ 22 января 2012

Вы можете забыть весь бизнес tag и сохранить спрайты как переменные экземпляра вашего класса.

@interface MyClass : MyParentClass {
  @private
  CCSprite *torso;
  CCSprite *head;
  CCSprite *eyes;
}

...

@end

Ваш метод будет немного проще:

-(void) characterInit{
  CGSize size = [[CCDirector sharedDirector] winSize];

  //Torso

  torso = [CCSprite spriteWithFile:@"Torso.png"];
  torso.anchorPoint = ccp(.5, .5);
  torso.position = ccp(size.width/2, size.height/2);
  torso.scale = 1;
  [self addChild:torso];

  ...

И вы можете использовать свои части тела напрямую:

[eyes runAction:...];
1 голос
/ 22 января 2012

Возможно, я бы попытался сделать меньшими функциями;добавить методы для добавления туловища, головы и глаз и т. д. Некоторые шаги практически идентичны, за исключением данных, которые могут обрабатываться с помощью параметров:

torso.anchorPoint = ccp(.5, .5);
head.anchorPoint = ccp(.5, 0);
eyes.anchorPoint = ccp(.5, .5);

Если вы можете создать метод, содержащийшаги, общие для всех трех частей тела, и три новых метода, которые обрабатывают то, что уникально для каждой части тела, вы могли бы написать код, похожий на этот псевдокод:

body = new Body();
b.addEyes: "Eyes.png",
    anchor: ccp(.5, .5),
    position: ccp(35, 45),
    color: ccc3(255, 255, 255);
b.addHead: "Head.png",
    anchor: ccp(0, 0),
    position: ccp(100,10);
...

Оба addEyes и addHead будутвызовите addBodyPart для обработки anchor и position, что позволит вам написать этот код только один раз.

Это может показаться перемещением кода;но, сохраняя каждый метод небольшим, выполняя ровно одну вещь, обычно обеспечивает более простую отладку, более простое обслуживание и большую гибкость.

...