首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我需要像程序员一样思考: Cocos2d中的孩子和父母,程序结构,枚举等等。

我需要像程序员一样思考: Cocos2d中的孩子和父母,程序结构,枚举等等。
EN

Stack Overflow用户
提问于 2012-01-22 02:09:54
回答 2查看 164关注 0票数 2

我是一个完全自学成才的目标C程序员,我需要关于如何最好地构造一个我正在做的项目的建议。

我正在处理CCSprite's,.tags,以及一些通用的程序结构问题,我很难找到最好的方法来构建这个程序。

到目前为止,这个程序正在按我想要的方式运行,但我似乎在浪费代码行,而且过于冗馀。我想在将来省去一些麻烦,把一切都做好。

我基本上是创造了一个完全动画的CCSprites角色。我需要他身体的每个部分独立于其他身体部位。为了实现这一点,我在我的CCSceneCCScene方法中创建了一个方法,该方法贯穿并创建CCSprites,并将它们放到适当的部分。下面是该方法的代码:

代码语言:javascript
复制
-(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];
...
...
...

...this继续对身体的每个部分。

这里的关键是,我使用的只是普通的旧int,每个CCSprite.tag都有一个数字值。我将int声明在此方法之上,在任何其他方法之外,以便它们也可以在init方法中访问。

问题1:,有什么更好的方法来做到这一点?也许作为一个enum?这段代码会是什么样子,是否有更好的方法来生成代码,而不是像我把它们作为ints时那样只写出每个值?

现在,我的下一个问题是在我完成并创建了所有CCSprites之后提出的。当我想在我创建它们的方法之外使用它们时,我使用来自我的init方法的如下代码:

代码语言:javascript
复制
        CCSprite * torso = (CCSprite *) [self getChildByTag:torsoTag];
        CCSprite * head = (CCSprite *) [torso getChildByTag:headTag];
        CCSprite * eyes = (CCSprite *) [head getChildByTag:eyesTag];


 [eyes runAction:...];

我本来试着打电话..。

代码语言:javascript
复制
CCSprite * eyes = (CCSprite *) [self getChildByTag:eyesTag]; 

...but无效。我假设我可以调用这个个体的身体部分,而不需要调用这个身体部分的每一个家长,这样我就可以激活它。because...well...

那个Sucks.

关键是,我觉得我只是想错了。我想组织我的代码,但是组织的全部目的是使您不必是多余的。

问题2:,一个比我更优秀的程序员会做些什么来处理这个可怕的情况?

感谢各位时间的到来,并为的TEXT墙感到抱歉。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-22 02:21:35

您可以忘记整个tag业务,并将store存储为类的实例变量。

代码语言:javascript
复制
@interface MyClass : MyParentClass {
  @private
  CCSprite *torso;
  CCSprite *head;
  CCSprite *eyes;
}

...

@end

您的方法会更简单一些:

代码语言:javascript
复制
-(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];

  ...

你可以直接使用你的身体部位:

代码语言:javascript
复制
[eyes runAction:...];
票数 3
EN

Stack Overflow用户

发布于 2012-01-22 02:58:13

我可能会尝试更小的函数;添加添加躯干、头部和眼睛等的方法。其中一些步骤几乎是相同的,除了可以通过参数处理的数据:

代码语言:javascript
复制
torso.anchorPoint = ccp(.5, .5);
head.anchorPoint = ccp(.5, 0);
eyes.anchorPoint = ccp(.5, .5);

如果您可以创建一个方法,其中包含所有三个主体部分所共有的步骤,以及三个处理每个主体部分所特有的内容的新方法,那么您可以编写更类似于以下伪代码的代码:

代码语言:javascript
复制
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);
...

addEyesaddHead都会调用addBodyPart来处理anchorposition,只允许编写一次代码。

这看起来就像是在移动代码;但是,保持每个方法都很小,只做一件事情,通常可以更容易地调试、更容易维护和更灵活。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8958406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档