2013-06-04 1 views
1

타일링 된 맵 편집기 tmx 파일에서 움직이는 타일을 만들려고합니다. 나는 자신의 레이어에 움직이는 타일이 있으며, 단순히 움직 이기만하면 특정 y에 도달하고 뒤로 이동하는 등의 작업을 수행합니다.이동 플랫폼? Cocos2d and Tiled

나는 조금만 둘러 보았습니다. 이것을 달성하기위한 명확한 방법으로,하지만 내 노력은 성공하지 못했습니다.

일부 방법으로 시도했습니다. here.

저는 아직 일반적으로 cocos2d 개발에 익숙하지 않으므로 이에 대한 통찰력을 얻었습니다. 시간 내 주셔서 대단히 감사합니다. 질문이 있으시면, 물어보십시오! :) 도움이된다면 이동하려는 타일이 큰 T 자 모양입니다.

최종 업데이트 :

(미래에 누구나 쉽게 내 솔루션을 (전체 답은 아래에있다) 나는 위의 링크에 내 계층으로 반복 방법을 가지고 여기서 찾을 수 있습니다 찾을 수 있도록 제거 더 관련이없는 코드).

좋아, 그래서 마침내 내가 원하는 방식에 가깝게 다가왔다. 나는 이것이 정확히 그것을하는 가장 이상적인 방법이라고 생각하지 않는다. 그러나 이것이 내가 가진 것이다.

참고 :이 기능을 사용하려면 디버그 모드에서 앱을 실행해야합니다. 그렇지 않으면 플레이어가지면에서 떨어지게됩니다 (적어도 나를 대신해 ..).

모든 프레임마다 특정 기능을 호출하는 업데이트 기능이 있습니다. (충돌 확인, 플랫폼 이동 등).

그 업데이트 기능 내 이동 플랫폼 함수를 호출

.. 이런

는 :

[self movePlatforms:0.1]; 

이 .. 그러니까 기본적으로

-(void)movePlatforms: (ccTime) dt{ 
    if(goingDown){ 
     moveCount++; 
    }else{ 
     moveCount--; 
    } 
    CGSize s = [movingTiles layerSize]; 
    for(int x=0; x<s.width;x++) { 
     for(int y=0; y< s.height; y++) { 
      CCSprite *tile = [movingTiles tileAt:ccp(x,y)]; 
      if(goingDown){ 
       CGPoint newPosition = ccp(tile.position.x, tile.position.y - 1); 
       tile.position = newPosition; 
       if(moveCount >= 100){ 
        goingDown = false; 
       } 
      }else{ 
       CGPoint newPosition = ccp(tile.position.x, tile.position.y + 1); 
       tile.position = newPosition; 
       if(moveCount <= 0){ 
        goingDown = true; 
       } 
      } 
     } 
    } 
} 

, 나는 INT의 moveCount을 내 movePlatforms 기능 생성 내 movePlatform 함수가 호출 된 횟수를 추적하는 BOOL goingDown. 따라서 100 회의 통화가 끝나면 방향이 전환됩니다.

(이 경우 정상적으로 작동합니다.이 경우 충돌 감지기와 같은 것이 필요할 수 있습니다.)

if (CGRectIntersectsRect([someSprite boundingBox], [someSprite boundingBox])) { 
    //Do something 
} 

는 희망이 내가이 나를 위해 꽤 두통 있었는지, 미래에 사람을 작동하고,이 도움이된다면 그것은 아마 제대로되지 않았거나 그것을 할 수있는 더 나은 방법이 있지만, 너 너 정말 멋지다!

답변

1

나는이 만 이동 타일과 관련된 작업 내 이동 타일을 가지고 방법을 단계별로 (가지) 단계, 그리고 아무것도.

참고 : 모든 것이 원활하게 실행되고 문자가지면에 떨어지지 않도록하려면 디버그가 아닌 릴리스로 실행해야합니다.

@interface HelloWorldLayer(){ 
    CCTMXTiledMap *map; 
    BOOL goingDown; 
    int moveCount; 
} 

CCTMXTiledMap 내지도의 인스턴스입니다 : 인터페이스에서

나는 이러한 변수를 만들었습니다. BOOL과 int는 움직이는 타일을 추적하는 데 사용하는 두 개의 변수입니다. 마법이 일어나는 곳

-(void)movePlatforms: (ccTime) dt{ 
    if(goingDown){ 
     moveCount++; 
    }else{ 
     moveCount--; 
    } 
    CGSize s = [movingTiles layerSize]; 
    for(int x=0; x<s.width;x++) { 
     for(int y=0; y< s.height; y++) { 
      CCSprite *tile = [movingTiles tileAt:ccp(x,y)]; 
      if(goingDown){ 
       CGPoint newPosition = ccp(tile.position.x, tile.position.y - 1); 
       tile.position = newPosition; 
       if(moveCount >= 100){ 
        goingDown = false; 
       } 
      }else{ 
       CGPoint newPosition = ccp(tile.position.x, tile.position.y + 1); 
       tile.position = newPosition; 
       if(moveCount <= 0){ 
        goingDown = true; 
       } 
      } 
     } 
    } 
} 

그래서 이것이, 내가 here에서 가져온 방법을 사용하고 신사 Mauricio Tollin는 내게 말했다 :

-(id) init { 
    if((self=[super init])) { 
     // add our map 
     map = [[CCTMXTiledMap alloc] initWithTMXFile:@"level1-1.tmx"]; 
     map.position = ccp(0,0); 
     [self addChild:map]; 

     //add our moving platforms layer 
     movingTiles = [map layerNamed:@"moving_platforms"]; 

     //set the variables I use to keep track of the moving platforms 
     goingDown = true; 
     moveCount = 0; 

     //schedule my update method 
     [self schedule:@selector(update:)]; 
    } 
    return self; 
} 

init 메소드 후, 나는 다음 내 이동 플랫폼 방법을 만들 타일 ​​위치를 파괴하고 다시 만들지 않고 업데이트 할 수 있습니다.

그래서 움직이는 플랫폼 계층의 모든 타일을 반복하고 moveCount가 100이 될 때까지 모든 호출을 내리라고 말한 다음 goingDown이 이제 거짓이며 방향이 전환됩니다. 거기에서 그것은 단지 앞뒤로 가고, 100까지 세고 다시 내려갑니다.

더 오래 이동하려면 100에서 200까지 또는 원하는 것을 늘리십시오. (또는 체크를 사용하여 충돌을 감지 할 수 있으며 지정된 스프라이트와 충돌 할 때 변경할 수 있습니다. 원하는 것이 더 많으면이 옵션을 사용하십시오). 이 모든 후

if (CGRectIntersectsRect([someSprite boundingBox], [someSprite boundingBox])) { 
    //Do something 
} 

, 내 업데이트 방법 작성 : 초기화 방법이 일정에서

-(void)update:(ccTime)dt{ 
    [self movePlatforms:0.1]; 
} 

매 프레임마다 호출되는 업데이트 방법을 다음 업데이트 방법은 movePlatforms 방법을 실행 (또는 위험 탐지와 같이 빈번히 점검해야하는 다른 기능).

movePlatforms에 전달 된 시간을 변경하여 플랫폼을 느리게 이동하거나 init 메소드에서 업데이트 간격을 느리게 예약 할 수도 있습니다.

나는 미래에 누군가를 도울 수 있기를 바란다. 배우는 동안 내 질문 게시가 실제로 조직화되지 않았고 크게 편집되었으므로이 작업을 어떻게 진행했는지에 대한 심층적 인 과정으로이 대답을 만들고 싶었다.

2

타일을 생성하고 제거하면 성능에 영향을줍니다. 대신의 , 자신의 위치 변경 타일을 이동하려고 :

여기
CCSprite *tile = [movingTiles tileAt:ccp(92,platformY)]; 
[movingTiles removeTileAt:ccp(92,platformY)]; 
CGPoint newTilePosition = tile.position; 
if (goingDown){ 
    newTilePosition.y ++; 
    if(newTilePosition.y >= 20){ 
     goingDown = false; 
    } 
}else{ 
    newTilePosition.y --; 
    if(newTilePosition.y <= 10){ 
     goingDown = true; 
    } 
} 
tile.position = newTilePosition; 
+0

답장을 보내 주셔서 감사합니다. 이것은 완전히 나를 위해 작동하지 않았지만 tile.position을 업데이트하는 것에 대한 조언은 앞으로 나아갈 단계입니다. 이 작업을 완전히 마치면 업데이트를하겠습니다. – JoeyMaru