0

これは、以下のenemyShootメソッドで発砲する前に、弾丸を割り当て/初期化するenemyShipクラスのinitメソッドです。

-(id) init
    {
        // always call "super" init
        // Apple recommends to re-assign "self" with the "super's" return value
        if( (self=[super init]) ) {
            CGSize windowSize =[[CCDirector sharedDirector] winSize];
            [self initWithFile:@"Spaceship_tut.png"];
            [self setPosition:ccp(windowSize.width/2, windowSize.height - windowSize.height/9)];

        [self moveAround];
        self.bullet =  [[Bullets alloc] init];
        self.bullet1 =  [[Bullets alloc] init];
        self.bullet2 =  [[Bullets alloc] init];
        self.bullet3 =  [[Bullets alloc] init];
        self.bullet4 =  [[Bullets alloc] init];
        self.bullet5 =  [[Bullets alloc] init];

        myBullets = [[NSArray alloc] initWithObjects:bullet1,bullet2,bullet3,bullet4,bullet5, nil];
        index = 0;
    }
    return self;
}




-(void)enemyShoot:(CCLayer*)theScene withThePoint:(CGPoint)whereTo

{
    NSArray *myBullets = [[NSArray alloc]  initWithObjects:bullet,bullet1,bullet2,bullet3,bullet4,bullet5, nil];
    bullet = [[Bullets alloc ] init];
    self.bullet = [myBullets objectAtIndex:index];
    self.bullet.position = self.position;
    [theScene addChild:bullet];
    id action = [CCMoveTo actionWithDuration:2.0 position:ccp(whereTo.x,whereTo.y)];
    [self.bullet runAction:action];
    index++;
    if (index == 4) {
        index = 0;
    }


}

これは敵艦クラスにあります。船は弾丸を発射することができ、これがそれを可能にする方法です。以下は、bullet.m ファイルの箇条書きの init メソッドです。

-(id) init
{
    // always call "super" init
    // Apple recommends to re-assign "self" with the "super's" return value
    if( (self=[super init]) ) {
        self = [CCSprite spriteWithFile:@"enemyBullet2.png"];

        }

    return self;
}

問題は、なぜこのエラーが発生したと思いますか

"Assertion failure in -[Level2 addChild:z:tag:], /Users/dulybon1/Documents/DEVELOPER/lesson1/lesson1/libs/cocos2d/CCNode.m:355"

これは、敵が数発発射した後、オブジェクトがメモリに存在しないことを意味すると思います。この関数がゲーム レイヤーでどのように呼び出されるかを次に示します。この関数は、次を使用して init メソッドで継続的に呼び出されます。

[セルフスケジュール:@selector(continuousShooting:)];

-(void)continuousShooting:(ccTime)dt
{
    [enemyShip enemyShoot:self withThePoint:ccp(myShip.position.x,myShip.position.y -200)];

}
4

2 に答える 2

0

皆さん、ありがとうございます。コードを少し整理しました。また、弾丸の初期化と nsarray を init メソッドから削除しました。みんなありがとう

-(void)enemyShoot:(CCLayer*)theScene withThePoint:(CGPoint)whereTo

{
    self.bullet =  [Bullets spriteWithFile:@"enemyBullet2.png"];
    self.bullet1 =  [Bullets spriteWithFile:@"enemyBullet2.png"];
    self.bullet2 =  [Bullets spriteWithFile:@"enemyBullet2.png"];
    self.bullet3 =  [Bullets spriteWithFile:@"enemyBullet2.png"];
    self.bullet4 =  [Bullets spriteWithFile:@"enemyBullet2.png"];
    self.bullet5 =  [Bullets spriteWithFile:@"enemyBullet2.png"];

    myBullets = [[NSArray alloc] initWithObjects:bullet,bullet1,bullet2,bullet3,bullet4,bullet5, nil];
    self.bullet = [myBullets objectAtIndex:index];
    self.bullet.position = self.position;
    [theScene addChild:bullet];
    id action = [CCMoveTo actionWithDuration:2.0 position:ccp(whereTo.x,whereTo.y)];
    [self.bullet runAction:action];
    index++;
    if (index == 4) {
        index = 0;
    }
    NSLog(@"%@",bullet);

}

于 2013-08-14T17:00:01.510 に答える
0

init メソッドで弾丸をシーンに追加し、使用しないときは画面外に配置したり、非表示にしたりできます。アクションの最後に箇条書きを非表示にし、アクションの開始時に表示することができます。

コードをクリーンアップしたい場合があります。箇条書きを解放せずに保持し続けます。なぜ init で配列を作成してから、enemyShoot で新しい配列を作成するのですか?

変数で何もしないのに、なぜenemyShootに次の行があるのですか?

bullet = [[Bullets alloc ] init];

ここでは、弾丸 (レーザー) の射撃を含むチュートリアルに従うことができます: http://www.raywenderlich.com/3611/how-to-make-a-space-shooter-iphone-game

于 2013-08-14T07:55:01.260 に答える