2013-02-06 3 views
0

я с 32 спрайтов в моей сцене я устроил мой спрайт, как этотКак переместить спрайт с условиями и ограничивает

    o o o 

       o o o 

     o o o o o o o 

     o o o . o o o 

     o o o o o o o 

       o o o 

       o o o 

O ---> MovingBall . ---> пустое отверстие

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

o o . -----> . . o 

возможные пути:

|   |   |   |   |   |   | 
o |   | . |   | o  |   . | .  |  . 
o | o o . | o | . o o |  o |  o | o  |  o 
. |   | o |   |  . | o  |  o | o 
    |   |   |   |   |   |   | 

Всего 8 возможность перемещения спрайта.

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

Моя кодирование здесь

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


if(movingBall) 
{ 
    for(int i = 0; i<32; i++) 
    { 
     CCSprite *currentSprite = (CCSprite *)[self getChildByTag:i]; 

     if(CGRectContainsPoint([currentSprite boundingBox],location)) 
     { 
      // get moving sprite touched 

      if(movingBall.position.x == hole.position.x+(2*75) || movingBall.position.x == hole.position.x-(2*75) || movingBall.position.y == hole.position.y+(2*75) || movingBall.position.y == hole.position.y -(2*75)) 
      { 
       movingBall = (CCSprite *)currentSprite; 
       break; 
      } 
     } 
    } 
    } 
} 
-(void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
UITouch *touch=[touches anyObject]; 
CGPoint location=[touch locationInView:[touch view]]; 
location=[[CCDirector sharedDirector]convertToGL:location]; 
location=[self convertToNodeSpace:location]; 

if(!movingBall) 
{ 
    return; 
} 


movingBall.position = location; 

for(int i = 0; i<32; i++) 
{ 
    CCSprite *currentSprite = (CCSprite *)[self getChildByTag:i]; 

    if(CGRectIntersectsRect([movingBall boundingBox],[currentSprite boundingBox])) 
    { 
     // current sprite touched 
     if(currentSprite.tag == hole.tag) 
     { 
      movingBall.position = hole.position; 

      [self removeChild:currentSprite]; 
      break; 
     } 

    } 
}} 

-(void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
if(!movingBall) 
{ 
    return; 
} 

movingBall = nil; 
} 

ответ

0

(я не знаю этого языка программирования, так что это чисто алгоритмическая перспектива)

Во-первых, вычислить начальную и конечную точки, которые пользователь пытается переместите шар с и до. Если перемещение не из заполненного пространства, отклоните его. Если переход не к пустому пространству, отклоните его.

Во-вторых, вычислите движение шара - xDelta = xEnd - xStart, yDelta = yEnd - yStart. Для движения, чтобы быть действительным, один из них должен быть правдой:

  • либо абс (Xdelta) или абс (yDelta) == 2, а другой == 0.
  • абс (Xdelta) = = 2 и abs (yDelta) == 2.

Если нет, то отвергайте.

Наконец, вычислите среднюю точку ячейки. xMid = xStart + xDelta/2, yMid = yStart + yDelta/2. Если это заполнено шаром, выполните движение путем опустошения xStart, yStart, опорожнения xMid, yMid и заполнения xEnd, yEnd. Если он не заполнен шаром, отверните его.

+0

Можете ли вы мне помочь с кодом, потому что я новичок в cocos2d. – iphoneguyzzz

+0

код пожалуйста ..... – iphoneguyzzz

+0

Я не знаю ни одного cocos2d. – Patashu

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