0

私は次のプログラムを作成しました。これは次のことを行う必要があります。ユーザーが移動するスプライトに触れると、シーンから削除する必要があります。

しかし、コードを実行すると、次のことが起こります。最上位のスプライトに触れると、隣接するスプライトが消えます。どうすれば修正できますか?

これがコードです。

UPD:このコードを小さい* .pngファイルでテストしましたが、すべて正常に動作します。しかし、より大きな* .pngファイル(200x200ピクセルのようなsmth、iPhoneシミュレーター)では、バグがあります。オブジェクトは、touchEventで最も近い隣のオブジェクトを削除します。

意味

    #import <Foundation/Foundation.h>
#import "cocos2d.h"


@interface GameplayLayer : CCLayer {

    NSMutableArray *arrayOfSprites;

}
@end
    #import "GameplayLayer.h"
@implementation GameplayLayer
    -(id)init
{
    self = [super init];
    self.isTouchEnabled=YES;
    arrayOfSprites=[[NSMutableArray alloc] init];

    if (self != nil) 
    {
        int j=100;

        for (int i=0; i<=2; i++) {
            [arrayOfSprites addObject:[CCSprite spriteWithFile:@"sv_anim_1-hd.png"]];
            [[arrayOfSprites objectAtIndex:i] setPosition:CGPointMake(j,j)];
            [self addChild:[arrayOfSprites objectAtIndex:i] z:0 tag:i];
            j+=100;
        }
        [self startRunning];
    }
    return self;                                 
}
    -(void)startRunning
{
    CGSize screenSize=[[CCDirector sharedDirector] winSize];
    for ( CCSprite * currentSprite in arrayOfSprites) 
    {
        [currentSprite runAction:[CCMoveTo actionWithDuration:10 position:CGPointMake(screenSize.height,screenSize.width/2)]];
    }
}
        -(void) registerWithTouchDispatcher
    {
        [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0
                                                  swallowsTouches:YES];
    }

        -(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
        return YES;
    }

        -(void) ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event {
        CGPoint locationOfTouch=[self convertTouchToNodeSpace: touch];

        for (CCSprite *currentSprite in arrayOfSprites)
        {
            if (CGRectContainsPoint(currentSprite.boundingBox, locationOfTouch))
            {
                NSLog(@"Sprite was touched");
                [self removeChild:currentSprite cleanup:YES];
            }
        }

    }
    @end
4

1 に答える 1

0

この機能を試してください:

-(CGRect)getSpriteRect:(CCNode *)inSprite
{
    CGRect sprRect = CGRectMake(
                                inSprite.position.x - inSprite.contentSize.width*inSprite.anchorPoint.x,
                                inSprite.position.y - inSprite.contentSize.height*inSprite.anchorPoint.y,
                                inSprite.contentSize.width, 
                                inSprite.contentSize.height
                                ); 

    return sprRect;
}


- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *myTouch = [touches anyObject];
    CGPoint location = [myTouch locationInView:[myTouch view]];
    location = [[CCDirector sharedDirector] convertToGL:location];


    for (CCSprite *currentSprite in arrayOfSprites)
    {
      CGRect rect = [self getSpriteRect:currentSprite];

      if (CGRectContainsPoint(rect, location))
      {
          NSLog(@"Sprite was touched");
          [self removeChild:currentSprite cleanup:YES];
       }
     }
}
于 2012-07-27T06:23:45.960 に答える