Cocos2D - 触及CCSprite然后弹出

时间:2013-08-29 08:37:42

标签: objective-c cocos2d-iphone

我已经被困了好几天试图控制我的精灵触摸方法。我的目标是让另一个精灵弹出偏移到触摸的精灵。

我目前有一个用于此过程的半个代码,我在其中尝试了许多种代码,请参阅下面的链接,其中没有一个有效。我的问题:

  1. 一旦触摸屏幕上的精灵(CCTouchBegan中的NSLog也无效),让CCTouchBegan运行方法towerPositionTapped。
  2. 了解如何获取触摸的精灵的位置,以便可以在towerPositionTapped方法中使用它。
  3. 到目前为止我在主要图层中的特定触摸代码:

    -(void) registerWithTouchDispatcher{
    [[[CCDirector sharedDirector] touchDispatcher] addTargetedDelegate:self priority:0 
        swallowsTouches:YES];
    }
    
    
    -(BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event{
    
    CGPoint location = [touch locationInView: [touch view]];
    location = [[CCDirector sharedDirector] convertToGL: location];
    
    
    //_towersFromClass is an NSMutableArray with CCSprite objects
    for(CCSprite *tb in _towersFromClass){
        if(CGRectContainsPoint(tb.boundingBox,location)){
    
            NSLog(@"sprite touched at %@", NSStringFromCGPoint(location));
    
            [self towerPositionTapped]
    
            return YES;
        }
    }
    return NO;
    }
    

    当我点击任何精灵时,NSLog检查不会显示。

    对于towerPositionTapped方法,我不确定如何捕获触摸的位置(或记录触摸的精灵)以便定位新的精灵。

    towerPositionTapped.m

    -(void)towerPositionTapped{
    
    CCMenuItem *towerOption1 = [CCMenuItemImage itemWithNormalImage:@"tower.png" selectedImage:@"tower.png"];
    towerOption1.position = /* place touched sprite location here, with an offset*/;
    
    CCMenu *_towerOptionsMenu = [CCMenu menuWithItems: nil];
    _towerOptionsMenu.position = CGPointZero;
    [self addChild:_towerOptionsMenu z:5];
    

    }

    任何建设性的批评都值得赞赏。谢谢你的时间。

    我一直在测试的一些网站:

    Sprite Offset

    Touch 1

    Touch 2

2 个答案:

答案 0 :(得分:0)

如果CCTouchBegin无法正常工作(不在for循环中但总体而言)那么如果您使用EnableTouch,可能需要尝试此行

self.isTouchEnabled = YES;

我使用的是这行而不是registerWithTouchDispatcher。

答案 1 :(得分:0)

我花了几天时间来解决这个问题,尽管我已经设法提出了解决方案。

我基本上使用了与Ray Wenderlich的塔防教程(RWTDTutorial)相同的代码。使用CCTouchesBegan方法。

-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

for(UITouch *touch in touches){
    CGPoint location = [touch locationInView:[touch view]];

    location = [[CCDirector sharedDirector] convertToGL:location];

    for(CCSprite *tb in _towersFromClass){

        if(CGRectContainsPoint([tb boundingBox],location)){

            selectedTowerPosition = tb;
            [self towerPositionTapped];

        }
    }
}
}

我创建了另一个方法,其中包含我在_towersFromClass数组中选择了一个CCSprit之后弹出的CCMenu项目,并在CCTouchesBegan方法的'if'语句下添加了该项。

为了获得菜单的正确位置,我创建了一个CCSprite属性'_selectedTowerPosition'并使其成为'tb'CCSprite。

回到CCMenu方法,我使用ccpAdd代码,如下所示,定位菜单。

CCMenuItem *towerOption1 = [CCMenuItemImage itemWithNormalImage:@"tower.png" selectedImage:@"tower.png" target:self selector:@selector( towerSelectOption)];
towerOption1.position = ccpAdd(_selectedTowerPosition.position,ccp(40,0));

我还给菜单项略微偏移。

这花了我一段时间,但我从这次经历中学到了很多东西。