2013-02-21 2 views
0

У меня 6 спрайтов, которые я хочу двигаться:Перемещение спрайтов в cocos2d

- (ID) инициализации {

if((self=[super init])) 
{ 
    CGSize winSize = [[CCDirector sharedDirector] winSize]; 

    CCSprite * backGround = [CCSprite spriteWithFile:@"background_ipad.png"]; 
    backGround.position = ccp(winSize.width/2, winSize.height/2); 
    [self addChild:backGround z:0]; 

    cloth1 = [CCSprite spriteWithFile:@"clothe_1.png"]; 
    cloth1.position = ccp(-200, -15); 
    [self addChild:cloth1 z:1]; 
    cloth2 = [CCSprite spriteWithFile:@"clothe_2.png"]; 
    cloth2.position = ccp(130, 225); 
    [self addChild:cloth2 z:2]; 

    cloth3 = [CCSprite spriteWithFile:@"clothe_3.png"]; 
    cloth3.position = ccp(365, 225); 
    [self addChild:cloth3 z:3]; 

    cloth4 = [CCSprite spriteWithFile:@"clothe_4.png"]; 
    cloth4.position = ccp(-110, -15); 
    [self addChild:cloth4 z:4]; 

    cloth5 = [CCSprite spriteWithFile:@"clothe_5.png"]; 
    cloth5.position = ccp(130, -20); 
    [self addChild:cloth5 z:5]; 

    cloth6 = [CCSprite spriteWithFile:@"clothe_6.png"]; 
    cloth6.position = ccp(365, -15); 
    [self addChild:cloth6 z:6]; 

} 
return self; 
[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES]; 

}

и этот метод для перемещения:

-(void) ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event 
{ 
    CGPoint location = [touch locationInView: [touch view]]; 
    location = [[CCDirector sharedDirector] convertToGL: location]; 
    //Sprite follows the finger movement. 
    [cloth1 setPosition:location]; 
} 

И дело в том, что я хочу добавить больше спрайтов, чтобы переместить спрайт. Я triend добавляю больше спрайтов в // следуя движению пальца, но затем все спрайты следуют за движением пальца. Я хочу переместить один спрайт. Например: при касании ткани1 перемещайте ткань 1; при касании ткани2 переместите ткань 2; но не оба одновременно.

Может ли кто-нибудь сказать мне, как это сделать?

+0

Вы удалили свой вопрос и опубликовал почти идентичный. Почему ты просто не редактировал его? – Kreiri

+0

Извините, потому что я думал, что было бы лучше сделать это снова. – Vergmort

ответ

1
@interface YourClass : NSObject 
{ 
    NSMutableArray *mSpriteArray; 
    CCSprite *mSpriteOnHand; 
} 

// В реализации:

-(id) init 
{ 
    .. //your old code 
    .. 

    [mSpriteArray addObject: cloth1]; 
    [mSpriteArray addObject: cloth2]; 
    [mSpriteArray addObject: cloth3]; 
    [mSpriteArray addObject: cloth4]; 
    [mSpriteArray addObject: cloth5]; 
    [mSpriteArray addObject: cloth6]; 

} 

-(void)onEnter 
{ 
    [super onEnter]; 
    self.touchEnabled = YES; // self.isTouchEnabled = YES; 

} 


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

    mSpriteOnHand = nil; 

    for(CCSprite *cloth in mSpriteArray) 
    { 
     if(CGRectContainsPoint([cloth boundingBox], location)) 
     { 
      mSpriteOnHand = cloth; 
      break; 
     } 
    } 
} 


- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 

    CGPoint location = [touch locationInView: [touch view]]; 
    location = [[CCDirector sharedDirector] convertToGL:location]; 

    if(mSpriteOnHand) 
     mSpriteOnHand.position = location; 

} 

- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    mSpriteOnHand = nil; 
} 

-(void)onExit 
{ 
    [mSpriteArray release]; 
    mSpriteArray = nil; 
    [super onExit]; 
} 
+0

В ccTouchesEnded появляется сообщение об ошибке: Assingning 'CGPoint' (aka 'struct CGPoint') из несовместимого типа 'void *' – Vergmort

+0

mSpriteOnHand = nil, извините за ошибку. – Guru

+0

Пожалуйста, никаких проблем! Я запустил его и появилась ошибка: Ошибка утверждения в - [HelloWorldLayer ccTouchBegan: withEvent:], /Users/macbookpro/Desktop/xxxxxx/xxxxxx/libs/cocos2d/CCLayer.m:280 2013-02-21 15:39 : 25.520 xxxxxxx [4069: 707] *** Завершение приложения из-за неперехваченного исключения «NSInternalInconsistencyException», причина: «Layer # ccTouchBegan override me» любая идея? – Vergmort

0

return заявление всегда завершает функцию и возвращает управление вызывающей функции. Вы писали:

return self; 
[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES]; 

[[CCTouchDispatcher sharedDispatcher]... линия никогда не будет выполнена.

Является ли ваш класс подклассом CCLayer? Если вы присвоите свойству isTouchEnabled свойства YES, он добавит этот слой в качестве стандартного (нецелевого) сенсорного делегата.

Если вы должны использовать целевое касание в своем слое, вы должны вернуть YES в -(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event, если вы требуете этого касания, и NO, если вы не находитесь. Обновления заявленного прикосновения отправляются только делегату, который утверждал это.

Чтобы определить, какой спрайт был затронут: создать экземпляр переменной для хранения «выбранного» спрайта, в методе touchBegan проверить, какая ограничивающая рамка спрайта содержит местоположение касания и хранить этот спрайт в переменной экземпляра (также похоже, что вы хотите потребовать коснитесь, только если он касается спрайта).

[cloth1 setPosition:location]; 

- ваш спрайт будет «прыгать», чтобы коснуться положения. Обычно это выглядит не очень хорошо. Я бы получил touch locationInView: и previousLocationInView:, конвертировал их в GL, получил разницу и изменил положение спрайта на эту разницу.

+0

Не могли бы вы поместить методы и указать больше, что заменить? Я новичок в iOS и в Cocos2D ... – Vergmort

+0

Oh. Так что это вопрос «дай мне рыбу», отправленный только для того, чтобы заставить других людей написать свой код для вас. – Kreiri

Смежные вопросы