-2

レイヤーに15個のスプライトがあります。これらのスプライトを可変配列に追加しccTouchesMovedました。タッチが終了したccTouchesEndedスプライトが開始点または原点に戻るときに、単一のスプライトを使用して移動します。

私のコーディング:

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

    collection=[[NSMutableArray alloc]init];

    CCLayer *base=[CCSprite spriteWithFile:@"Base.png"];
    base.position=ccp(512,384);
    [self addChild:base];




    x=0;
    for(int i=1;i<=7;i++)
    {
        CCSprite *hole=[CCSprite spriteWithFile:@"ball.png"];
        hole.position=ccp(140+x,318);
        hole.tag=i;
    [self addChild:hole];
        hole.visible=YES;
        [collection addObject:hole];
        x=x+75;
    }

    self.isTouchEnabled=YES;

}
return self;
 }
-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch=[touches anyObject];
CGPoint location=[touch locationInView:[touch view]];
location=[[CCDirector sharedDirector]convertToGL:location];
location=[self convertToNodeSpace:location];
p=location;


}
-(void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"count:%i",[collection count]);
UITouch *touch=[touches anyObject];
CGPoint location=[touch locationInView:[touch view]];
location=[[CCDirector sharedDirector]convertToGL:location];

location=[self convertToNodeSpace:location];


 for(CCSprite *s in collection)
 {
   if(CGRectContainsPoint([s boundingBox], location))
    s.position=ccp(location.x,location.y);

 }
}
 -(void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
for(CCSprite *s in collection)
{

        s.position=p;

 }
}

1つのスプライトを移動すると、他のスプライトも非表示にならないようにレイヤーに表示されます。コードを手伝ってください。

4

1 に答える 1

0
for(CCSprite *s in collection)
 {
   if(CGRectContainsPoint([s boundingBox], location))
    s.position=ccp(location.x,location.y);

 }

すべてのスプライトが同じ場所にあるため、上記のコードはすべてのスプライトをその場所に移動しています。

for(CCSprite *s in collection)
{
    if(CGRectContainsPoint([s boundingBox], location))
    {
        s.position=ccp(location.x,location.y);
        break;
    }
}

上記のコードは、最初のスプライトが検出されるとループから抜け出すため、配列内の最初のスプライトのみを移動する必要があります。

これがまさにあなたが望むものであるかどうかはわかりませんが、これが役立つことを願っています。

- - 編集

個人的に私がすることは、スプライトのインスタンス変数を持つことです。

CCSprite * touchedSprite;

そして、次のことを行います...

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

    for((CCSprite * sprite in collection)
    {
        if(CGRectContainsPoint([sprite boundingBox], location))
        {
            touchedSprite = sprite;
            p = sprite.position;
            break;
        }
    }
}
-(void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"count:%i",[collection count]);
    UITouch *touch=[touches anyObject];
    CGPoint location=[touch locationInView:[touch view]];
    location=[[CCDirector sharedDirector]convertToGL:location];

    location=[self convertToNodeSpace:location];

    touchedSprite.position = location;
}

-(void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    touchedSprite.position = p;
}

私はコードをテストしなかったので、コピーして貼り付けるだけで機能するかどうかはわかりませんが、これで正しいアイデアが得られると思います。これを行う方法は明らかに他にもありますが、触れられているスプライトにたくさんのことを行う場合は、最も簡単だと思います。

于 2013-01-30T03:48:52.817 に答える