Не могу перетащить спрайт после добавления к нему фигуры - PullRequest
1 голос
/ 17 декабря 2011

Я создаю кучу спрайтов из текстур меток динамически, и это работает нормально.У меня есть несколько методов, которые я могу использовать, чтобы нажать на спрайт и заставить его «шевелиться», тогда я могу перетаскивать их по экрану.Моя проблема в том, что мне нужно было добавить форму бурундука к спрайтам, чтобы они не перекрывали друг друга и отталкивали друг друга.Как только я добавляю форму к спрайтам, мои методы выбора / перетаскивания спрайтов больше не работают.Я немного растерялся.

Этот метод используется для создания спрайтов / фигур.

-(void) addNewSpriteX: (float)x y:(float)y wordIndex:(int)i
{
    CCLabelTTF *label;

    if ( i == 0 )
    {
        label = [CCLabelTTF labelWithString:[[words objectAtIndex:i] uppercaseString] fontName:[self getRandomFont] fontSize:kFontSize];
    }
    else
    {
        label = [CCLabelTTF labelWithString:[[words objectAtIndex:i] uppercaseString] fontName:[self getRandomFont] fontSize:[self getFontSize:[[counts objectAtIndex:0] intValue] andCurrentCount:[[counts objectAtIndex:i] intValue]]];
    }

    wordSprite = [CCSprite spriteWithTexture:[label texture]];
    // ask director the the window size
    wordSprite.color = [self getRandomColor];

    wordSprite.position =  ccp( x, y );

    // FROM HERE TO THE NEXT COMMENT IS WHERE I AM ADDING THE SHAPE AND BODY (DOING IT WRONG?)
    CGPoint p1 = CGPointMake(-wordSprite.contentSize.width/2, -wordSprite.contentSize.height/2);
    CGPoint p2 = CGPointMake(-wordSprite.contentSize.width/2, +wordSprite.contentSize.height/2);
    CGPoint p3 = CGPointMake(+wordSprite.contentSize.width/2, +wordSprite.contentSize.height/2);
    CGPoint p4 = CGPointMake(+wordSprite.contentSize.width/2, -wordSprite.contentSize.height/2);

    int num = 4;
    CGPoint verts[] = {p1, p2, p3, p4};

    cpBody *body = cpBodyNew(50.0, INFINITY);


    body->p = wordSprite.position;
    cpSpaceAddBody(space, body);

    cpShape* shape = cpPolyShapeNew(body, num, verts, cpvzero);
    shape->e = 0.5f; shape->u = 0.5f;
    shape->data = wordSprite;

    cpSpaceAddShape(space, shape);
    // END SHAPE CREATION

    [movableSprites addObject:wordSprite];

    [self addChild:wordSprite];

}

Это методы, которые я использую для выбора и перемещения спрайтов (которых больше нетфункция после добавления фигуры / тела).

- (void)selectSpriteForTouch:(CGPoint)touchLocation {
    CCSprite * newSprite = nil;
    for (CCSprite *sprite in movableSprites) {
        if (CGRectContainsPoint(sprite.boundingBox, touchLocation)) {            
            newSprite = sprite;
            break;
        }
    }    
    if (newSprite != wordSprite) {
        [wordSprite stopAllActions];
        [wordSprite runAction:[CCRotateTo actionWithDuration:0.1 angle:0]];
        CCRotateTo * rotLeft = [CCRotateBy actionWithDuration:0.1 angle:-4.0];
        CCRotateTo * rotCenter = [CCRotateBy actionWithDuration:0.1 angle:0.0];
        CCRotateTo * rotRight = [CCRotateBy actionWithDuration:0.1 angle:4.0];
        CCSequence * rotSeq = [CCSequence actions:rotLeft, rotCenter, rotRight, rotCenter, nil];
        [newSprite runAction:[CCRepeatForever actionWithAction:rotSeq]];            
        wordSprite = newSprite;
    }
}

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {    
    CGPoint touchLocation = [self convertTouchToNodeSpace:touch];
    [self selectSpriteForTouch:touchLocation];      
    return TRUE;    
}

- (CGPoint)boundLayerPos:(CGPoint)newPos {
    CGPoint retval = newPos;
    retval.x = MIN(retval.x, 0);
    retval.x = MAX(retval.x, -background.contentSize.width+size.width); 
    retval.y = self.position.y;
    return retval;
}

- (void)panForTranslation:(CGPoint)translation {    
    if (wordSprite) {
        CGPoint newPos = ccpAdd(wordSprite.position, translation);
        wordSprite.position = newPos;
    } else {
        CGPoint newPos = ccpAdd(self.position, translation);
        self.position = [self boundLayerPos:newPos];      
    }  
}

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

    CGPoint oldTouchLocation = [touch previousLocationInView:touch.view];
    oldTouchLocation = [[CCDirector sharedDirector] convertToGL:oldTouchLocation];
    oldTouchLocation = [self convertToNodeSpace:oldTouchLocation];

    CGPoint translation = ccpSub(touchLocation, oldTouchLocation);    
    [self panForTranslation:translation];    
}

1 Ответ

0 голосов
/ 19 декабря 2011

Если вы работаете с chipmunk + TouchMove, вы должны использовать, cpMouse. Проверьте www.cocos2d-iphone.org/forum/topic/4936

Было два примера на Github, 1) Kerchink (используется с новой версией), который удален :(, 2) Grabbed или Grabbed to (используется со старой версией). http://code.google.com/p/grabbed/

cpMouse - это просто невидимое тело, которое связано с на touchBegan, с объектом на toucharea, с помощью PinJoints, SlideJoints и т. Д. Когда вы нажимаете touchMoved, объект, связанный с cpMouse, также перемещается.

Если вы хотите обойтись без cpMouse и со своим кодом, --- вы можете использовать функцию step () для итерации вашего бурундука, который продолжает хитро изменять поворот и положение всего спрайта. Так что, если вы пытаетесь изменить положение спрайтов, пошаговая функция переопределит вращение и положение, и эффект не будет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...