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
这就是面向对象编程拯救的地方.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)
编辑(代码添加到问题后):
首先让我指出一些错误(抱歉缺少更柔和的词):
你很少需要你的精灵来调用[self scheduleUpdate]或[self schedule:SEL].通常人们在CCLayer或CCScene级别实现update(或tick)方法,其目的是检查所有角色(精灵,菜单,嵌套层等)以进行冲突/交互并更新其属性.如果你只是想动画精灵的移动到特定位置,只需调用runAction从CCLayer方法(在init,update,ccTouchBegan或其他地方).您可以点击此处阅读有关Actions的cocos2d-iphone教程.因此,将update方法和scheduleUpdate调用移动到HelloWorldLayer中,然后您不再需要覆盖initWithTexture.
我看到你在update方法中实例化一个CCSprite .我的上述观点指出updateCCSprite 中方法的不适当性,当你实现一个方法时,你需要了解一些更重要的东西:那就是你需要决定你的方法的使用/调用方式和频率.由于该update方法将每帧调用一次(即每秒60次),因此在该方法中无条件地实例化对象是完全错误的.你正在让iPhone分配(和解除分配)对象没有明显的原因,浪费了设备的处理器时间/功率.您可能想询问在哪里实例化CCSprite.答案在于init方法,因为该方法仅针对每个对象实例调用一次.同样,您需要知道的是一个方法是一次还是多次调用,并决定一段代码是在那里还是在其他地方.
在您的HelloWorldLayer代码中,您是否意识到您正在调用super init*方法两次.您不需要调用,[super init]因为[super initWithColor:ccc4( ... )]它将在init内部调用特定方法.尽管这样做并不完全错误,但你打算打破init每个实例将要调用一次的"假设" ,这样你最终可能会无意间破坏某些对象的完整性(相信我会很难调试后来)
最后,要注意告诉我这条线的真正目的是什么[self setPosition:ccp(self.position.x,self.position.y)];.你基本上把self对象的位置设置到它的当前位置,所以就像说"嘿你,把你的位置移动到你当前的位置",他会像"嗯?" :P