Перетащите для CCSprite в xcode - PullRequest
       9

Перетащите для CCSprite в xcode

0 голосов
/ 23 февраля 2012

В моем приложении я использовал CCSprites. Они определены в правильном формате и функции ccTouchesBegan должным образом. Затем я добавил коды для перетаскивания. они

- (void)selectSpriteForTouch:(CGPoint)touchLocation {
CCSprite * newSprite = nil;
NSMutableArray *movableSprites=[[NSMutableArray alloc] initWithObjects:Tocken1,Tocken2,Tocken3];
    for (CCSprite *sprite in movableSprites) 
    {
        if (CGRectContainsPoint(sprite.boundingBox, touchLocation))
        {            
            newSprite = sprite;
            break;
        }
}    
if (newSprite != selSprite) {
    [selSprite stopAllActions];
    [selSprite 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]];            
    selSprite = newSprite;
}
}
- (CGPoint)boundLayerPos:(CGPoint)newPos {
CGSize winSize = [CCDirector sharedDirector].winSize;
CGPoint retval = newPos;
retval.x = MIN(retval.x, 0);
retval.x = MAX(retval.x, -background.contentSize.width+winSize.width); 
retval.y = self.position.y;
return retval;
}
- (void)panForTranslation:(CGPoint)translation {    
if (Tocken1) {
    CGPoint newPos = ccpAdd(Tocken1.position, translation);
    Tocken1.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];    
}

теперь, когда я нажимаю на спрайт, программа завершается со следующим кодом ошибки.

2012-02-23 10: 12: 47.377 whoonu [3574: 207] * Ошибка подтверждения в - [WhooseitView ccTouchBegan: withEvent:], / Users / sandeepkuttiyatur / Documents / Dropbox / ibiz_completed_apps / WhoonuV9 /CatRace/libs/cocos2d/CCLayer.m:259

2012-02-23 10: 12: 47.378 whoonu [3574: 207] * Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «Layer # ccTouchBegan override me»

*** Call stack at first throw:
(
0   CoreFoundation             0x02c23b99 __exceptionPreprocess + 185
1   libobjc.A.dylib            0x02d7340e objc_exception_throw + 47
2   CoreFoundation             0x02bdc238 +[NSException raise:format:arguments:] + 136
3   Foundation                 0x02674e37 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116
4   whoonu                     0x00033873 -[CCLayer ccTouchBegan:withEvent:] + 179
5   whoonu                     0x0008efa7 -[CCTouchDispatcher touches:withEvent:withTouchType:] + 1255
6   whoonu                     0x0008fb6f -[CCTouchDispatcher touchesBegan:withEvent:] + 111
7   whoonu                     0x00091a21 -[EAGLView touchesBegan:withEvent:] + 113
8   UIKit                      0x007db324 -[UIWindow _sendTouchesForEvent:] + 395
9   UIKit                      0x007bccb4 -[UIApplication sendEvent:] + 447
10  UIKit                      0x007c19bf _UIApplicationHandleEvent + 7672
11  GraphicsServices           0x03236822 PurpleEventCallback + 1550
12  CoreFoundation             0x02c04ff4 
                __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
13  CoreFoundation             0x02b65807 __CFRunLoopDoSource1 + 215
14  CoreFoundation             0x02b62a93 __CFRunLoopRun + 979
15  CoreFoundation             0x02b62350 CFRunLoopRunSpecific + 208
16  CoreFoundation             0x02b62271 CFRunLoopRunInMode + 97
17  GraphicsServices           0x0323500c GSEventRunModal + 217
18  GraphicsServices           0x032350d1 GSEventRun + 115
19  UIKit                      0x007c5af2 UIApplicationMain + 1160
20  whoonu                     0x000bceaf main + 127
21  whoonu                     0x00001ed5 start + 53
22  ???                        0x00000001 0x0 + 1

) прекращение вызова после выброса экземпляра 'NSException'

1 Ответ

0 голосов
/ 23 февраля 2012

Вы не реализовали метод "ccTouchBegan" в вашем слое.Метод родительского класса говорит вам, что он должен быть переопределен.

reason: 'Layer # ccTouchBegan override me'

Реализуйте это так:

- (BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
    // add code to handle touch...

    // return YES to claim all touches when they begin
    // or return only YES for those touches you want to deal with
    return YES;
}

Обновление:

Вы можете увидеть, откуда приходит это сообщение об ошибке, если вы посмотрите файл "CCLayer.m" в вашем "... / libs / cocos2d/ ... "папка (при условии, что у вас есть типичная структура проекта, как в шаблоне) Код, который выдает эту ошибку, находится в строке ~ 257 (cocos2d v1.0.1) и выглядит так:

-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
    NSAssert(NO, @"Layer#ccTouchBegan override me");
    return YES;
}
#endif
...