0

几天来,我一直在试图控制我的精灵触摸方法。我的目标是让另一个精灵弹出偏移到触摸的精灵。

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

  1. 一旦触摸到屏幕上的精灵(CCTouchBegan 中的 NSLog 也不起作用),让 CCTouchBegan 运行方法 towerPositionTapped。
  2. 了解如何获取被触摸精灵的位置,以便可以在 towerPositionTapped 方法中使用它。

到目前为止,我在主层中的触摸特定代码:

-(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];

}

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

我测试过的几个网站:

精灵偏移

触摸 1

触摸 2

4

2 回答 2

0

如果您 CCTouchBegin 无法正常工作(不是在 for 循环内,而是整体上),那么如果您没有 EnableTouch,您可能必须尝试这一行

self.isTouchEnabled = YES;

我正在使用这一行而不是 registerWithTouchDispatcher。

于 2013-08-29T09:52:29.683 回答
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 数组中选择一个 CCSprites 后我想要弹出的 CCMenu 项目,并将其添加到 CCTouchesBegan 方法的“if”语句下。

为了获得菜单的正确位置,我创建了一个 CCSprite 属性 '_selectedTowerPosition' 并使其 = for '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));

我还给菜单项稍微偏移了一点。

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

于 2013-08-31T08:18:46.263 回答