2011-10-19 2 views
1

내 스프라이트 프레임을 CCSpriteFrameCache에 추가합니다. 그런 다음 원하는 이미지 파일로 CCSpriteBatchNode을 만듭니다.CCSpriteBatchNode를 올바르게 사용하는 방법은 무엇입니까?

이 내가 확실히 이해하지 못하는 것입니다 :

을 나는 CCSprite을 때, 나는 CCSpriteBatchNode을 활용하려는 경우, 나는 [CCSprite spriteWithBatchNode: rect:]CCSprite를 초기화해야? 그러나 그렇다면 프레임을 얻기 위해 CCSpriteFrameCache을 어떻게 활용하는지 보지 못합니다. 이제 수동으로 직사각형을 만들 것입니다.

그래서 나는 [CCSprite spriteWithSpriteFrameName:]을 사용한 다음이 스프라이트를 배치 노드에 추가한다고 생각합니다. 그러나 나는 아직도 확신 할 수 없다.

답변

4

당신은 사용해야합니다

CCSprite *sp = [CCSprite spriteWithSpriteFrameName:@"monster.png"]; 

당신을 위해 프레임의 담당하게 될 것 SpriteFrameCache에 지정된 .plist. 그런 다음 스프라이트를 만들고 배치에 추가합니다.

"myArt.png"라는 파일로 batchnode를 만드는 경우 "myArt.png"에 포함 된 스프라이트 만 추가 할 수 있습니다.

희망이 있습니다.

+0

감사합니다. 그것은 물건을 깨끗이합니다. – Voldemort

4

내가 cocos2d에 대해 배운 것에 따르면. SpriteFrameCache 및 SpriteBatchNode는 동일한 결과를 가지지 만 다르게 사용되며 게임이 매우 큰 경우 약간의 성능 차이를 느낄 수 있습니다.

CCSpriteFrameCache는 plist 파일에 따라 이름이 지정된대로 호출 할 때마다 프레임을로드합니다. 주어졌다. plist와 관련된 아틀라스도 프로젝트에 추가되어야합니다. 그렇지 않으면 프레임이 호출되지만 아무것도 그려지지 않을 것입니다. Plist는 이미지 아틀라스 안에 이미지가있는 주소와 같습니다. CCSpriteFrameCache의 좋은 점은 코드가 더 깔끔하고 CCSpriteBatchNode 메서드보다 작다는 것입니다. 그 프레임의 모든 호출에 대해 특정 아틀라스로 이동하여 그려야한다는 비용이 듭니다.

CCSpriteBatchNode는 아틀라스를로드하고 하나의 그리기 호출로로드합니다. 이는 게임에서 필요에 따라 무승부를 수행해야하는 시간을 줄이기 때문에 효율적입니다. 유일한 어려움은 아틀라스의 각 스프라이트의 사각형에 대해 수학을 수행해야한다는 것입니다. 이는 아틀라스가 캐릭터의 2 가지 동작이고, 아틀라스 이미지 파일의 크기가 1024x1024이고, 각 스프라이트의 크기가 128x128이기 때문에 가능합니다. 그래서 예를 들어 전체 점프 동작을 위해 각 직사각형을 얻으려면 수학을 할 것입니다. (이것은 수학을 피하기 위해 .plist가 유용하게 사용되는 곳입니다)

코드는 복잡해 지지만 그럴 것입니다. 하나의 통화로 실적이 가장 좋은 통화로 전환됩니다. CCSpriteBatchNode를 사용하는 또 다른 방법은 다른 정적 스프라이트를 사용하는 것입니다. 여러 개의 정적 이미지 나 스프라이트에 대해 하나의 그리기 호출 만하면됩니다.

예제 코드가 필요하다면, 나는 그것을 제공하는 것보다 더 행복 할 것이다.


업데이트 : SpriteBatchNode에 대한 링크 추가 및 내 자신의 예.

SpriteBatchNode :

Example using SpriteBatchNode with Ray Wenderlich 내가이 사람을 믿고, 나는 자신의 튜토리얼로부터적인 Cocos2D을 많이 배웠습니다. 다른 튜토리얼을 읽으라고 제안합니다.

간단히 말해서, CCSpriteBatchNode는 아래에서 CCSpriteFrameCache를 사용한 것과 완전히 다른 프로세스이며, Sprite Child Node를 CCSpriteBatchNode에 추가하고 레이어가 아니라 CCSpriteBatchNode를 레이어에 추가한다는 점만 다릅니다. 이것은 새로운 개념의 Cocos2d가 얽히게하는 어려운 개념입니다.


SpriteFrameCache :

SpriteFrameCache 내가 그래서 여기에 좋은 예를 찾을 수는 하나의 간단한 하나입니다. 그러나이 모든 스프라이트가 batchnode 추가되는

//By doing this your sprites are now in the cache ready to be used 
//by their names declared in the .plist file. 
-(void) loadingSprites:(NSString*) plistName { 
    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:plistName]; 

} 

-(id)initGameLayer { 
    //CCSprite accepts CCSpriteFrame and your img is now ready to be displayed. 
    //However is still not drawn yet. 
    CCSprite * mySprite = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:framename]; 


    //set a position if desired 
    //20 pixels to the right and 0 pixels to the top. 
    mySprite.position = CGPointMake(20,0); 

    //Now the Image has been drawn, making 1 draw call. 
    [self addChild:mySprite]; 

} 

CCSpriteBatchNode 단지 1 drawcall하게 지적 주목할 동일한 SpriteAtlas의 일부로한다.

그리고 SpriteFrameCache를 사용하는 경우에만 그 쉽고 간단하지만, 레이어에 추가 모든 자녀가 1 무승부 호출이 수행되는 것을 의미한다. (이것은 단점입니다, 성능) 그래서 당신이 10 개 스프라이트를 추가하면

SpriteFrameCache가있는 레이어에는 10 개의 드로 콜이 있습니다.

그러나 SpriteBatchNode를 구현하고 해당 Sprite를 CCSpriteBatchNode에 추가하고 그 레이어에 CCSpriteBatchNode를 추가하면 동일한 10 개의 스프라이트가 추가되지만 하나의 그리기 호출 만 수행됩니다. 따라서 성능 차이 (가장 좋은 경우)는 더 큰 게임에서 중요합니다.

희망, 환호!

+0

CCSpriteBatchNode 및 CCSpriteFrameCache에 대한 링크를 제공해주십시오. – User42590

+0

방금 ​​책상에 앉아서 곧 예제에 대한 링크를 제공하겠습니다. –

+0

@ User42590 링크와 예제를 통해 확인해 보시면 질문을 해결할 수 있었기를 바랍니다. –

관련 문제