2012-12-09 20 views
1

嗨,大家好,我真的需要一些帮助,我一直在游戏的这一部分停留了一个多星期,似乎无法通过这个问题,所以看看低于我的代码,如何将CCsprite添加到阵列中的图层

#进口 “HelloWorldLayer.h”
#进口 “AppDelegate.h”

@implementation HelloWorldLayer 

+(CCScene *) scene 
{ 
// 'scene' is an autorelease object. 
CCScene *scene = [CCScene node]; 

// 'layer' is an autorelease object. 
HelloWorldLayer *layer = [HelloWorldLayer node]; 

// add layer as a child to scene 
[scene addChild: layer]; 

// return the scene 
return scene; 
} 

-(id) init 
{ 
// always call "super" init 
// Apple recommends to re-assign "self" with the "super's" return value 
if((self=[super init])) { 
    moles = [[NSMutableArray alloc] init]; 
    winSize = [[CCDirector sharedDirector]winSize]; 
    CCSprite *mole1 = [CCSprite spriteWithFile:@"lightsabericonblue.png"]; 


    [self starCreateCurrentLevel:mole1]; 


} 
return self; 
} 


-(void)starCreateCurrentLevel:(CCSprite *)mole1{ 
starCountCurrentLevel = 10; 
for (int i = 0; i < starCountCurrentLevel;) { 

    [moles addObject:mole1];   
    starCountCurrentLevel--; 

} 

[self schedule:@selector(tryPopMoles:) interval:1]; 

} 


- (void)tryPopMoles:(ccTime)dt { 
if(moles.count != 0){ 
    for (CCSprite *mole in moles) { 
     if (arc4random() % moles.count == 0) { 
        if (mole.numberOfRunningActions == 0) { 
         [self popMole:mole]; 
        } 
     } 
    } 


}else if(moles.count == 0){ 
    NSLog(@"No More Moles To Spawn"); 
    [self unschedule:@selector(tryPopMoles:)]; 
} 

} 

- (void) popMole:(CCSprite *)mole { 
mole.position = ccp(150, 150); 
[self addChild:mole]; 
} 



- (void) dealloc 
{ 
[moles release]; 
moles = nil; 
[super dealloc]; 
} 

@end 

当我运行此代码我碰到下面的错误,*断言失败 - [Hel loWorldLayer addChild:z:tag:],/ Users /....../libs/cocos2d/CCNode.m:335。

我当我在init方法中添加子项时很好,但我不想那样做,我想能够调用try pop鼹鼠,然后根据是否存在,再调用pop鼹鼠在阵列中留下的精灵,我有一种感觉,我错过了某些东西或做错了什么。

更新 -

#import "HelloWorldLayer.h" 
#import "AppDelegate.h" 

#pragma mark - HelloWorldLayer 
CGSize winSize; 
int enemyX; 
int enemyY; 
int randomAngleY; 
int randomAngleX; 
int winSizeX; 
int winSizeY; 
int minDuration = 1; 
int maxDuration = 4.0; 
int rangeDuration; 
int actualDuration; 
int starCountCurrentLevel; 
int test = 0; 

@implementation HelloWorldLayer 

+(CCScene *) scene 
{ 
CCScene *scene = [CCScene node]; 
HelloWorldLayer *layer = [HelloWorldLayer node]; 
[scene addChild: layer]; 
return scene; 
} 


-(id) init 
{ 
if((self=[super init])) { 

moles = [[NSMutableArray alloc] init]; 
winSize = [[CCDirector sharedDirector]winSize]; 
[self starCreateCurrentLevel]; 

} 
return self; 
} 

-(void)starCreateCurrentLevel{ 
starCountCurrentLevel = 10; 
for (int i = 0; i < starCountCurrentLevel;) { 
[moles addObject:[CCSprite spriteWithFile:@"lightsabericonblue.png"]]; 
starCountCurrentLevel--; 
} 
[self schedule:@selector(tryPopMoles:) interval:3]; 

} 

- (void)tryPopMoles:(ccTime)dt { 
NSMutableArray *tempArray = [NSMutableArray arrayWithArray:moles]; 
for (int randomIndex = tempArray.count -1; randomIndex < tempArray.count; randomIndex--) { 
     CCSprite * sprite = (CCSprite *)[tempArray objectAtIndex:randomIndex]; 
     //CCSprite *sprite = [tempArray objectAtIndex:randomIndex]; 
     [self popMole:sprite]; 
     NSLog(@"Enemy Added"); 
     [tempArray removeObject:sprite]; 
    } 
if([tempArray count] == 0){ 
    NSLog(@"No More Moles To Spawn"); 
    [self unschedule:@selector(tryPopMoles:)]; 
} 


} 

- (void) popMole:(CCSprite *)sprite { 

winSizeX = winSize.width - sprite.contentSize.width + 25; 
winSizeY = winSize.height - 25 - sprite.contentSize.height + 17; 
randomAngleX = arc4random() % winSizeX; 
randomAngleY = arc4random() % winSizeY; 
enemyX = arc4random() % winSizeX ; 
enemyY = arc4random() % winSizeY; 
rangeDuration = maxDuration - minDuration; 
actualDuration = (arc4random() % rangeDuration) + minDuration; 
sprite.position = ccp(enemyX, enemyY); 
[self addChild:sprite]; 

} 


- (void) dealloc 
{ 
[moles release]; 
moles = nil; 
[super dealloc]; 
} 

@end 

回答

1

你只是创建精灵一次,而是试图将其添加几次。 (请记住,这些是指向对象的指针,所以你总是指的是完全相同的精灵。)如果你想要同一个精灵的10个版本(在不同的位置,比例,速度等等),你需要创建精灵(通过创建者方法)10次。您可以在原来做一个副本,或者只是创建它的飞行:

-(void)starCreateCurrentLevel:(CCSprite *)mole1{ 
starCountCurrentLevel = 10; 
for (int i = 0; i < starCountCurrentLevel;) { 

    //[moles addObject:mole1]; 
    // ^^ You're adding the same sprite (meaning same pointer reference) again and again. Try this instead: 
    [moles addObject:[CCSprite spriteWithFile:@"lightsabericonblue.png"]];  

    starCountCurrentLevel--; 
} 

当然,现在你不需要通过mole1到你的方法。你可能(根据你的需要)考虑传入一个spriteFrameName或其他东西。

+0

如果您有机会看看它,我已经更新了原有的新文章 – user1889036

+0

这是一个非常不同的问题,我建议您为它开一个新的问题。否则,这里的东西太混乱了。 :) –