2013-08-29 104 views
0

我被困在試圖讓我的精靈觸摸方法受控制的日子裏。我的目標是讓另一個精靈彈出偏移到一個被觸摸的精靈。Cocos2D - 觸摸CCSprite後彈出

我目前有一個這個過程的一個半熟的代碼,其中我已經嘗試了許多不同的代碼,請參閱下面的鏈接,其中沒有任何工作。我的問題:

  1. 獲取CCTouch開始運行方法towerPositionTapped一旦觸摸屏幕上的精靈(NSLog在CCTouchBegan也不工作)。
  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]; 

}

任何建設性的批評是表示讚賞。感謝您的時間。

一些網站我一直在測試的:

Sprite Offset

Touch 1

Touch 2

+0

你ccTouchBegan工作嗎?如果你把CClog放在for循環中,cclog會顯示什麼? – Zohaib

回答

0

我花了幾天的時間來解決這個問題,無論如何,我已經設法提出了一個解決方案。

我已經基本上使用了與Ray Wenderlich的Tower Defense Tutorial(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]; 

     } 
    } 
} 
} 

我創建了包含CCMenu項目,我想彈出後,我選擇在我的_towersFromClass陣列CCSprites之一,並添加另一種方法,根據CCTouchesBegan方法的「如果」語句。

爲了獲得正確的菜單位置,我創建了一個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)); 

我也給菜單項略微偏移。

這讓我想起了一段時間,但是我從這次經歷中學到了很多東西。

0

如果CCTouchBegin在不工作(不是內部的循環,但總體)則可以你必須嘗試這條線,如果你擁有EnableTouch

self.isTouchEnabled = YES; 

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

+0

CCLog無法構建。我收到「隱式聲明函數'CCLog'在C99中無效」。我也嘗試使用'self.isTouchEnabled = YES;'當我觸摸屏幕時它仍然不記錄任何東西。 –