adsense



[cocos2d-x] 짤짤이

자잘한 팁 모음.

최종갱신 : 2016-07-10
검증 : cocos2d-x v.3.11 (3.11.1)


- 3D 스프라이트를 2D 스프라이트 위에 그리기

2D Sprite의 Global Z Order를 마이너스 값으로 준다. (ex : sprite->setGlobalZOrder(-1); )



- URL로부터 스프라이트 생성 : make sprite from http request (url)

※여러차례 호출할 경우, tag 문자열로 구분하여 처리.
※CC_CALLBACK_2를 사용하므로 Node(Scene 또는 Layer)를 상속한 모듈에서 사용
void [function](std::string url, std::string tag)
{

HttpRequest* request = new (std::nothrow)HttpRequest();
request->setUrl(url);
request->setRequestType(HttpRequest::Type::POST);
request->setResponseCallback(CC_CALLBACK_2([call back function], this));
request->setTag(tag);
HttpClient::getInstance()->send(request);
request->release();
}

void [call back function](HttpClient* sender, HttpResponse* response)
{
if (!response)
{
CCLOG("no response");
return;
}

if (!response->isSucceed())
{
CCLOG("Response failed. error buffer : %s", response->getErrorBuffer());
return;
}

std::vector<char>* buffer = response->getResponseData();

const char* file_char = buffer->data();
Image* image = new Image();
image->initWithImageData(reinterpret_cast<const unsigned char*>(&(buffer->front())), buffer->size());
Texture2D* texture = new Texture2D();
texture->initWithImage(image);

Sprite* temp = Sprite::createWithTexture(texture);
//to do : add sprite or set sprite info.

if (strcmp(response->getHttpRequest()->getTag(), [tag]) == 0)
{
//to do
}
}



- HttpRequest가 끝나기 전에 Node를 제거해야 할 경우

send한 이후에 HttpRequest객체(HttpRequest* request로 사용하는 경우 request)를 release 하지 않고,
Node의 소멸자에서
request->setResponseCallback(nullptr);
request->release();
처리한다.

Node가 제거된 후 HttpRequest 콜백이 들어오면 (당연하지만) 앱이 죽는다.


- 이미 생성되어 있는 스프라이트의 이미지 교체
Sprite* sprite = (Sprite*)getChildByName("SPRITE");//ex)
sprite->initWithSpriteFrameName(str);//case texture from frame
//or
sprite->initWithFile([asset file name]);




- 리소스(Asset) 경로 얻어오기
std::string fullpath = FileUtils::getInstance()->fullPathForFilename([asset file name]);


- 리소스 그림파일의 비트맵 정보 획득
※tempData는 헤더 없는 비트맵 정보로, png24 기준으로 RGBA의 바이트가 1도트에 해당
    unsigned char*   tempData;
{
Image* image = nullptr;
std::string fullpath;
fullpath = FileUtils::getInstance()->fullPathForFilename([asset file name]);
image = new (std::nothrow) Image();

if (image != nullptr)
{
bool bRet = image->initWithImageFile(fullpath);
if (bRet)
{
_width = image->getWidth();
_height = image->getHeight();
tempData = image->getData();

}
}

CC_SAFE_RELEASE(image);
}



- deprecate예정인 getFileData를 대치하는 방법
auto futil = FileUtils::getInstance();
std::string filePath = futil->getWritablePath().append([filename]);
auto data = futil->getDataFromFile(filePath);
unsigned char* temp = data.getBytes();

futil->destroyInstance();

※ unsigned char* temp = futil->getDataFromFile(filePath).getBytes(); 같이 받아오면 될 때도 있고 안될 때도 있고..?

- 도형 그리기
    auto geometric = DrawNode::create();

이후 하위 api 참조.


- 마스크 클리핑
    auto stencil = DrawNode::create();
stencil->drawSolidRect(Vec2(sourceX, sourceY), Vec2(destinationX, destinationY), Color4F::MAGENTA);

auto clipper = ClippingNode::create();
clipper->setPosition(0, 0);
clipper->setStencil(stencil);
clipper->setInverted(false);
addChild(clipper);


이후 클리핑되기 원하는 노드를 clipper에 addChild 한다. (예:Layer 노드)

※클리핑 소스는 Sprite 같은 노드로도 가능하지만, 이 경우 Sprite의 투명영역과 상관없이 사각형 형태로만 클리핑된다.
※drawSolidCircle을 사용해 그린 경우, 원형으로 클리핑 가능.





덧글

댓글 입력 영역


Books

Geek라이프

메가 드라이브 퍼펙트 카탈로그
마에다 히로유키 저/조기현 역

미소녀 일러스트 테크닉
B-은하, pen스케, 카와이 저/정유진 역

핵심강좌! Cocos2d-x
이재환 저

피규어의 교과서 레진 키트 & 도색 입문 편
후지타 시게토시 저/김정규 역
예스24 | 애드온2
일본서적 전문사이트 NEPIC