2012-06-30 3 views
0

CCSprite의 텍스처를 변경하는 것에 대해 약간 혼란 스럽습니다.CCSprite 텍스처 크기

나는이 :

aTexture[NUM_WALLS+11] = [[CCTexture2D alloc]initWithImage:[UIImage imageNamed:@"shop1.png"]]; 
[aSprite setTexture:aTexture[NUM_WALLS+11]]; 

aTexture[NUM_WALLS+9] = [[CCTexture2D alloc]initWithImage:[UIImage imageNamed:@"bush2.png"]]; 
[aSprite setTexture:aTexture[NUM_WALLS+9]]; 

두 이미지

는 두 개의 서로 다른 크기를 가지고있다. 그러나 스프라이트는 텍스처를 변경할 때 크기가 변하지 않습니다. 대신 이미지는 스프라이트의 크기에 맞게 조절됩니다. 스프라이트가 크기를 바꿔야한다고 생각했습니다.

누군가 명확히 할 수 있습니까?

답변

2

이미지 파일의 크기는 다를 수 있지만 텍스쳐의 크기가 일반적으로 다음 2의 가장 가까운 기수까지 확장되므로 텍스쳐가 동일한 크기를 사용할 수 있습니다 (NPOT 텍스처 지원은 기본적으로 cocos2d에서 비활성화 됨).

의미 : 한 이미지가 150x150이고 다른 이미지가 250x250 인 경우 텍스처의 크기는 모두 256x256입니다. 이미지 파일에서 스프라이트를로드하면 cocos2d는 그려지는 텍스처의 실제 부분을 이미지 크기 (contentSize)로 조정합니다. 텍스처를 변경하면 cocos2d는 텍스처에 저장된 이미지의 크기에 관계없이 단순히 텍스처의 크기를 사용합니다. 텍스처를 만든 후에는 그 정보가 손실되기 때문입니다.

이 경우 스프라이트에서 setTextureRect :를 수동으로 호출하여 텍스처의 실제 이미지 영역 만 그려야합니다.

더 좋은 해결책은 두 텍스처 모두 create a texture atlas이고 더 나은 해결책은 스프라이트가 표시하는 스프라이트 프레임을 변경하는 것입니다. 그것은 훨씬 쉽고 메모리도 절약됩니다.

+0

고마워요. Ray Wenderlich가 작성한 cocos2d 텍스처 패커 튜토리얼과 인터넷의 다른 소스를 확인했습니다.몬스터와 PC가 등각 투영으로 배치 된 수백 개의 스프라이트 그리드를 사용하고 있으며, 이들은 매우 z- 순서 종속적 인 상황입니다. 이 프로그램을 내 프로그램에 통합하는 과정에서 z- 주문 관련 문제가있을 수 있습니다. 난 이미 힘들이지 않고 잘 짜여져 있고 (아직 버그가있는) 상호 작용하는 시스템을 가지고 있기 때문에, 제게는 비용/이익 비율이 그만큼 좋을 것이므로 첫 제안을 할 것입니다. – user1437403

0

내가 아는 한 CCSprite는 contentSize 속성과 위치를 사용하여 OpenGL을 사용하여 그려지는 정점 배열을 계산합니다. 그렇게하면 스프라이트는 contentSize 속성을 변경할 때까지 크기가 변하지 않습니다.

2

여전히 setTexture를 사용하려는 사람들에게.

나는이 여기서 일하는 것을 발견 :

CCTexture2D* tex2d = [[CCTexture2D alloc] initWithImage:[UIImage imageNamed:_texture]]; CGSize texSize = [tex2d contentSize]; [sprite setTexture:tex2d]; [sprite setTextureRect:CGRectMake(0, 0, texSize.width, texSize.height)];

대한 SetTexture의 순서와 setTextureRect 중요하다. 그렇지 않으면 작동하지 않습니다.

0

CCTexture2D tex2d * = [CCTexture2D ALLOC] initWithImage [ 있는 UIImage imageNamed : _texture]; CGSize texSize = [tex2d contentSize]; [스프라이트 setTexture : tex2d]; [스프라이트 setTextureRect : CGRectMake (0, 0, texSize.width, texSize.height)];

경고

이 코드는 텍스처를 저장하지만, 할당 해제 함수가 호출되지 않습니다 때문에 메모리 누수가 발생할 수 있습니다.

CCTexture2D 클래스를 서브 클래 싱하여 확인할 수 있습니다. 적어도 alloc-init은 항상 CCSprite 객체에 대해 잘못된 방식으로 작동합니다.

관련 문제