使用Cocos2d中其他文件的东西?

Dun*_*can 1 objective-c cocos2d-iphone

我正在做一个游戏(显然),我注意到我的HelloWorldLayer.m文件变得非常拥挤.我知道有一种方法可以从其他.m文件中运行方法,我只是不知道如何.例如,我想要一个Character.h和Character.m文件.我可以在HelloWorldLayer初始化层中实现它,它只使用Character文件中的所有内容而不必在HelloWorldLayer中声明所有内容吗?我希望我的问题有道理,任何帮助都表示赞赏.谢谢!

这是Character.m:

@implementation Character

@synthesize health,velocity;

-(void)dealloc {
    [super dealloc];
}

-(id)initWithTexture:(CCTexture2D *)texture rect:(CGRect)rect
{
    if((self = [super initWithTexture:texture rect:rect]))
    {
        [self scheduleUpdate];
    }
    return self;
}

-(void)update:(ccTime)dt {
    [self setPosition:ccp(self.position.x,self.position.y)];

    self = [CCSprite spriteWithFile:@"nukeboyGreen.gif"];
}

@end
Run Code Online (Sandbox Code Playgroud)

这里是HelloWorldLayer.m(我把它缩小并取出了不必要的部分):

self = [super init];
    if( (self=[super initWithColor:ccc4(255,255,255,255)] )) {

        CGSize winSize = [[CCDirector sharedDirector] winSize];

        character = [Character spriteWithFile:@"nukeboyGreeen.gif"];
        character.position = ccp(winSize.width/2,winSize.height/2);
        character.scale = 0.15;
        [self addChild:character];
Run Code Online (Sandbox Code Playgroud)

请注意,我在HelloWorldLayer.h中声明了一个Character

Luk*_*man 7

这就是面向对象编程拯救的地方.OOP鼓励您封装与该对象本身中的对象相关的变量和函数.在您的情况下,您应该在Character类中放置特定于Character的方法,并且只获取HelloWorld来触发这些方法.

例子:

@interface Character : CCSprite {
   ...
}

- (void)didCollideWith:(Object *)object;

- (void)moveTo:(CGPoint)nextPoint;

- (void)shootArrow:(ckDirection)direction;

- (BOOL)isAlive;

- (int)numberOfLivesRemaining;

...

@end
Run Code Online (Sandbox Code Playgroud)

然后在HelloWorldLayer中:

[character moveTo:ccp(100, 200)];
[character shootArrow:kDirectionUp];

if (![character isAlive]) {
   [self showGameOver];
}
Run Code Online (Sandbox Code Playgroud)

不仅您的HelloWorldLayer不那么混乱,您只需查看合理命名的方法,就可以轻松了解代码的功能.

编辑:

要像在关于如何在Character类中指定精灵图像的注释中回答您的问题:

@implementation Character

- (id)init {
   self = [super initWithFile:@"sprite_character.png"];
   if (self) {
       // further customization
   }
   return self;
}

@end
Run Code Online (Sandbox Code Playgroud)

编辑(代码添加到问题后):

首先让我指出一些错误(抱歉缺少更柔和的词):

  1. 你很少需要你的精灵来调用[self scheduleUpdate][self schedule:SEL].通常人们在CCLayer或CCScene级别实现update(或tick)方法,其目的是检查所有角色(精灵,菜单,嵌套层等)以进行冲突/交互并更新其属性.如果你只是想动画精灵的移动到特定位置,只需调用runAction从CCLayer方法(在init,update,ccTouchBegan或其他地方).您可以点击此处阅读有关Actions的cocos2d-iphone教程.因此,将update方法和scheduleUpdate调用移动到HelloWorldLayer中,然后您不再需要覆盖initWithTexture.

  2. 我看到你在update方法中实例化一个CCSprite .我的上述观点指出updateCCSprite 中方法的不适当性,当你实现一个方法时,你需要了解一些更重要的东西:那就是你需要决定你的方法的使用/调用方式和频率.由于该update方法将每帧调用一次(即每秒60次),因此在该方法中无条件地实例化对象是完全错误的.你正在让iPhone分配(和解除分配)对象没有明显的原因,浪费了设备的处理器时间/功率.您可能想询问在哪里实例化CCSprite.答案在于init方法,因为该方法仅针对每个对象实例调用一次.同样,您需要知道的是一个方法是一次还是多次调用,并决定一段代码是在那里还是在其他地方.

  3. 在您的HelloWorldLayer代码中,您是否意识到您正在调用super init*方法两次.您不需要调用,[super init]因为[super initWithColor:ccc4( ... )]它将在init内部调用特定方法.尽管这样做并不完全错误,但你打算打破init每个实例将要调用一次的"假设" ,这样你最终可能会无意间破坏某些对象的完整性(相信我会很难调试后来)

  4. 最后,要注意告诉我这条线的真正目的是什么[self setPosition:ccp(self.position.x,self.position.y)];.你基本上把self对象的位置设置到它的当前位置,所以就像说"嘿你,把你的位置移动到你当前的位置",他会像"嗯?" :P