【发布时间】:2010-04-06 17:06:36
【问题描述】:
我正在使用 cocos2d 构建一个 iPhone 游戏。大部分都完成了,但在此过程中,我遇到了一些我想更好地处理的事情。我是 Objective C 的新手,老实说,我在日常工作中编写的 Perl 脚本比什么都多,所以我的 C 技能有点生疏。
其中之一是我在游戏中针对某些特定情况修改了 cocos2d 文件。但是,当我更新到新版本时,我必须手动将更改向前拉。
那么,问题是,处理这个问题的最佳方法是什么?
我想到的一些选项:
- 重载/重新定义 cocos2d 类。我的印象是我不能重载现有的类函数,所以我认为这不会起作用。
- 创建我在库更新后重新应用的补丁。我认为这不会起作用,因为新文件不一定与旧文件相同,如果是,我可以将整个文件向前复制。
- 上交我对 Cocos2d 的更改。不是一个选项,因为我的更改非常针对我的应用程序。
我是否遗漏了一些明显的东西?
更新:
我将解释我在做什么,以便更清楚。
Cocos2d有一个CCNode对象,可以包含children等。我加了一个shadow,和child很相似,只是处理方式有点不同。阴影与父级有偏移,并与父级一起平移,当父级旋转时围绕其自己的中心旋转等。但是,阴影不包含在真正的子级中,因此,给定正确的 z-index,阴影可以在所有其他对象下渲染,但仍与父对象一起移动。
为此,我在 CCNode 中添加了 addShadow 函数,并修改了 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 作为属性,因为添加后我不需要访问它。
【问题讨论】:
-
如果您能解释所做更改的确切性质,人们可能会提出更有帮助的建议。如果您随意重命名类并添加和删除属性,这与您需要重新定义
name以返回“Fred”而不是“Freddie”不同。 -
我不知道随机和随意...但我会用更多信息更新问题。
标签: objective-c frameworks cocos2d-iphone