0

次のように、背景スプライトに複数のスプライトを配置しています。

//my background
CCSprite *bg = [CCSprite spriteWithFile:@"imageName.png"];

[self addchild:bg];

そして、アイテムをbgに追加します

//this is how i add my items
CCSprite *items = [CCSprite spriteWithFile:@"itemName.png"];

[bg addchild:items];

ああ、私の車のスプライトを忘れないでください

//my car
CCSprite *car = [CCSprite spriteWithFile:@"car.png"];
[self addchild:car];

ループを使用して複数のスプライトを背景に追加します。

問題は、bg に配置した複数のスプライトと車が衝突したかどうかをどのように検出するかということです。

CGRectIntersectsRect を使用してみましたが、機能しません。

ピタゴラスの定理法を試してみましたが、やはりうまくいきません。

項目スプライトを NSMutableArray に追加する方法がありましたが、それも機能しません。

誰かが私が試すことができる方法を提案できますか?

追加コード:

-(void) initializeCarAndItems
{
    car = [CCSprite spriteWithFile:@"android.png"];
    car.position = ccp(screenSize.width/2, screenSize.height * 0.30);
    [self addChild:car z:1];
    carRect = [car boundingBox];
}

-(void) initializeMap
{
    bg1 = [CCSprite spriteWithFile:@"racingBG.png"];
    bg1.anchorPoint = ccp(0, 0);
    bg1.position = ccp(0, 0);

    [self addChild:bg1 z:-1];

    bg2 = [CCSprite spriteWithFile:@"racingBG2.png"];
    bg2.anchorPoint = ccp(0,0);
    bg2.position = ccp(0, bg1.boundingBox.size.height - 1);

    [self addChild:bg2 z:-1];

    convertedWidth = (int)bg1.boundingBox.size.width;
    convertedHeight = (int)bg1.boundingBox.size.height;

    for (y = 0; y < 15; y++)
    {   
        positionX = arc4random()%convertedWidth;
        positionY = arc4random()%convertedHeight;

        items = [CCSprite spriteWithFile:@"item.png"];
        items.position = ccp(positionX, positionY + 300);
        [bg1 addChild:items z:100];
        [itemsArray addObject:items];
    }

    for (y = 0; y < 15; y++)
    {   
        positionX = arc4random()%convertedWidth;
        positionY = arc4random()%convertedHeight;

        items = [CCSprite spriteWithFile:@"item.png"];
        items.position = ccp(positionX, positionY);
        [bg2 addChild:items z:100];
        [itemsArray addObject:items];
    }
}

-(void) accelerate
{
    bg1.position = ccp(0, bg1.position.y - accelerateNumber);
    bg2.position = ccp(0, bg2.position.y - accelerateNumber);

    if (bg1.position.y < -bg1.boundingBox.size.height)
    {
        questionCount++;
        bg1.position = ccp(0, bg2.position.y + bg2.boundingBox.size.height - 1);
        [self question];

        [bg1 removeAllChildrenWithCleanup:YES];
        for (y = 0; y < 15; y++)
        {   
            positionY = arc4random()%convertedHeight;
            positionX = arc4random()%convertedWidth;

            items.position = ccp(positionX, positionY);
            items = [CCSprite spriteWithFile:@"item.png"];
            [bg1 addChild:items z:100];
            [itemsArray addObject:items];
        }
    }
    else if (bg2.position.y < -bg2.boundingBox.size.height)
    {
        questionCount++;
        bg2.position = ccp(0, bg1.position.y + bg1.boundingBox.size.height - 1);
        [self question];

        [bg2 removeAllChildrenWithCleanup:YES];
        for (y = 0; y < 15; y++)
        {   
            positionY = arc4random()%convertedHeight;
            positionX = arc4random()%convertedWidth;

            items.position = ccp(positionX, positionY);
            items = [CCSprite spriteWithFile:@"item.png"];
            [bg2 addChild:items z:100];
            [itemsArray addObject:items];
        }
    }
}

-(void) update:(ccTime)deltaTime
{
    [self ifEdgeOfScreen];
    [self accelerate];

    for (CCSprite *itemFromArray in itemsArray)
    {
        CGRect itemRect = [itemFromArray boundingBox];
        if (CGRectIntersectsRect(carRect, itemRect))
        {
            NSLog(@"Collision!");
        }
    }

    if (leftButton.active == TRUE)
    {
        [self moveLeftRight:1];
    }
    else if (rightButton.active == TRUE)
    {
        [self moveLeftRight:2];
    }
}

アップデート:

修正されました:)

-(void) update:(ccTime)deltaTime
{
    car = [car boundingbox];

    [self ifEdgeOfScreen];
    [self accelerate];



    for (CCSprite *itemFromArray in itemsArray)
    {
        if (CGRectIntersectsRect(carRect, [itemFromArray boundingbox]))
        {
            NSLog(@"Collision!");
        }
    }

    if (leftButton.active == TRUE)
    {
        [self moveLeftRight:1];
    }
    else if (rightButton.active == TRUE)
    {
        [self moveLeftRight:2];
    }
}
4

1 に答える 1

0

コードに非常に多くの問題が見つかりました....

  1. を呼び出すときはremoveAllChildren、配列からオブジェクトも削除するようにしてください。親からスプライトを削除しても、配列からは削除されません。

  2. update メソッドで車の矩形を更新します。だからあなたの更新方法で

    -(void) update:(ccTime)deltaTime {

        [self ifEdgeOfScreen];
    
        [self accelerate];
    
        carRect = [car boundingBox];
    ...........
    }
    

お役に立てれば.. :)

于 2012-05-07T08:47:59.327 に答える