2014-02-23 27 views
1

我正在爲iPhone的精靈套件遊戲工作,有一個球員和12個「敵人」。這些敵人中的每一個都是以相同的方式創建的。我在initWithSize方法中用for循環做了這個。Sprite工具包,使多個精靈服從相同的方法

for (int i = 1; i <= 12; i++) 
    { 
     [self spawnChargesWithNumber:i]; 
    } 

使敵人(spawnChargesWithNumber)的實際方法如下。

- (void)spawnChargesWithNumber:(NSInteger)number 
{ 

self.chargedBall = [[ChargedBall alloc] initWithImageNamed:[NSString stringWithFormat:@"ChargedBall%li", (long)number]]; 
int minX = self.chargedBall.size.width/2; 
int maxX = self.frame.size.width - self.chargedBall.size.width/2; 
int rangeX = maxX - minX; 
int actualX = (arc4random() % rangeX) + minX; 

self.chargedBall.position = CGPointMake(actualX, 568); 
self.chargedBall.name = [NSString stringWithFormat:@"chargeNumber%li", (long)number]; 
self.chargedBall.zPosition = 15; 
self.chargedBall.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:13.0f]; 
self.chargedBall.physicsBody.dynamic = YES; 
self.chargedBall.physicsBody.affectedByGravity = NO; 
self.chargedBall.physicsBody.mass = 0.1; 
[self.map addChild:self.chargedBall]; 
} 

這實際上創造了12個不同的敵人,但只有最後一個實際上是一個chargeBall對象。我有一個名爲ChargedBall的對象,其中有一個.h和.m文件。在.m文件中我有一個方法來更新對象的位置。

在update:currentTime方法中,我調用這個方法來更新球的位置,並且我也在這個方法中檢查與tileMap的碰撞。

-(void)update:(CFTimeInterval)currentTime 
{ 

NSTimeInterval delta = currentTime - self.previousUpdateTime; 

if (delta > 0.02) 
{ 
    delta = 0.02; 
} 

self.previousUpdateTime = currentTime; 
[self.player update:delta]; 
[self.chargedBall update:delta]; 
[self checkForAndResolveCollisionsForPlayer:self.player forLayer:self.walls]; 
[self checkForAndResolveCollisionsForCharge:self.chargedBall forLayer:self.walls]; 
[self processUserMotionForUpdate:currentTime]; 
[self setViewPointCenter:self.player.position]; 
} 

如果我只有一個敵人/ chargeBall,這個效果非常好。如果我有多個chargeBalls,那麼只有最後一個的行爲應該如此。其他人只是呆在屏幕上。我認爲這與我如何製作chargeBall有關。我每次重新創建chargedBall對象,以便只有最後一個實際上是一個chargeBall,而不是其他人,因爲我覆蓋了它們。所以我最終的問題是,我如何讓所有敵人/ chargeBall對象的行爲方式相同,並按照相同的方法更新自己?非常感謝您的幫助

回答

3

將所有ChargedBall對象存儲在一個數組中。聲明屬性:

@property (nonatomic, strong) NSMutableArray *enemies. 

每次創建敵人時,將其添加到enemies陣列。

- (void)spawnChargesWithNumber:(NSInteger)number 
{ 
    ChargedBall *enemy = [[ChargedBall alloc] ...]; 

    // Your code ... 

    if (!_enemies) 
    { 
     _enemies = [[NSMutableArray alloc] init]; 
    } 

    [_enemies addObject:enemy]; 
} 

然後對於每個ChargedBall在陣列更新了它update方法:

for(ChargedBall *enemy in self.enemies) 
{ 
    [self checkForAndResolveCollisionsForCharge:enemy forLayer:self.walls]; 
} 

旁註:

這並不適用於這個問題,但它是很好的瞭解。 如果你想調用每個敵人的方法,你可以使用NSArraymakeObjectsPerformSelector:方法在一行中完成。例如:

[_enemies makeObjectsPerformSelector:@selector(selfDestruct)]; 
+0

非常感謝。這就像一個魅力!而且,我非常喜歡使用makeObjectsPerformSelector的selfDestruct方法:NSArray的方法!再次感謝您的時間和幫助。 – Douglas

+0

沒問題的隊友:) – RaffAl

1

您有一個爲chargeBall定義的屬性,但是您需要一個可變數組。定義一個屬性來容納所有的球。事情是這樣的:

@property (nonatomic, strong) NSMutableArray *chargedBalls. 

然後for循環改變你的這個(請確保您在什麼地方初始化數組):

- (void)spawnChargesWithNumber:(NSInteger)number 
{ 

    ChargedBall *chargedBall = [[ChargedBall alloc] initWithImageNamed:[NSString stringWithFormat:@"ChargedBall%li", (long)number]]; 
    int minX = chargedBall.size.width/2; 
    int maxX = self.frame.size.width - chargedBall.size.width/2; 
    int rangeX = maxX - minX; 
    int actualX = (arc4random() % rangeX) + minX; 

    chargedBall.position = CGPointMake(actualX, 568); 
    chargedBall.name = [NSString stringWithFormat:@"chargeNumber%li", (long)number]; 
    chargedBall.zPosition = 15; 
    chargedBall.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:13.0f]; 
    chargedBall.physicsBody.dynamic = YES; 
    chargedBall.physicsBody.affectedByGravity = NO; 
    chargedBall.physicsBody.mass = 0.1; 
    [self.map addChild:chargedBall]; 

    [self.chargedBalls addObject:chargedBall]; 
} 

然後你可以遍歷數組,並確定是否存在衝突與任何球。然而,如果你使用SpriteKit的物理引擎,你可以讓引擎自己通知你碰撞。

+0

感謝您的幫助。我用了兩個答案的組合,所以我只能接受一個答案,但我投票支持你的時間! – Douglas

相關問題