【问题标题】:Overloading framework methods in objective-c, or retaining local changes with framework updates在objective-c中重载框架方法,或通过框架更新保留本地更改
【发布时间】:2010-04-06 17:06:36
【问题描述】:

我正在使用 cocos2d 构建一个 iPhone 游戏。大部分都完成了,但在此过程中,我遇到了一些我想更好地处理的事情。我是 Objective C 的新手,老实说,我在日常工作中编写的 Perl 脚本比什么都多,所以我的 C 技能有点生疏。

其中之一是我在游戏中针对某些特定情况修改了 cocos2d 文件。但是,当我更新到新版本时,我必须手动将更改向前拉。

那么,问题是,处理这个问题的最佳方法是什么?

我想到的一些选项:

  1. 重载/重新定义 cocos2d 类。我的印象是我不能重载现有的类函数,所以我认为这不会起作用。
  2. 创建我在库更新后重新应用的补丁。我认为这不会起作用,因为新文件不一定与旧文件相同,如果是,我可以将整个文件向前复制。
  3. 上交我对 Cocos2d 的更改。不是一个选项,因为我的更改非常针对我的应用程序。

我是否遗漏了一些明显的东西?

更新:

我将解释我在做什么,以便更清楚。

Cocos2d有一个CCNode对象,可以包含children等。我加了一个shadow,和child很相似,只是处理方式有点不同。阴影与父级有偏移,并与父级一起平移,当父级旋转时围绕其自己的中心旋转等。但是,阴影不包含在真正的子级中,因此,给定正确的 z-index,阴影可以在所有其他对象下渲染,但仍与父对象一起移动。

为此,我在 CCNode 中添加了 addShadow 函数,并修改了 setPositionsetRotate 函数来移动 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 作为属性,因为添加后我不需要访问它。

【问题讨论】:

  • 如果您能解释所做更改的确切性质,人们可能会提出更有帮助的建议。如果您随意重命名类并添加和删除属性,这与您需要重新定义 name 以返回“Fred”而不是“Freddie”不同。
  • 我不知道随机和随意...但我会用更多信息更新问题。

标签: objective-c frameworks cocos2d-iphone


【解决方案1】:

我可以想到几种方法来做到这一点:

  • 子类化并覆盖某些方法。如果可能的话,这是最好的。

略显骇人的方法:

【讨论】:

  • 你说“覆盖某些方法”。你怎么做?如果重新定义方法,会不会出现编译错误?
  • 啊,我想我才意识到我的错误。我一直在阅读 Objective-C 不允许重载。我将其误解为重新定义了一种方法。
  • @Jeff B:事实上,您可以重新定义一个方法,甚至无需子类化。类别中的方法优先于类中定义的方法。 (虽然如果您在 两个 类别中定义了相同的方法,则不知道会调用哪一个。)
  • 哦,对不起,还有一个问题。我添加到节点的 shadowSprite 变量怎么样?我不相信你可以用类别做到这一点。
  • 你应该为这种情况使用一个子类,类别不能(据我所知)有实例变量。
猜你喜欢
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
  • 2013-08-28
  • 1970-01-01
  • 2015-08-16
  • 1970-01-01
相关资源
最近更新 更多