2013. 3. 19. 16:24ㆍ프로그래밍/Cocos2dX
Cocos2d-x에서 게임화면 잡아야 할때가 있습니다.
SNS에 ScreenShot을 올리거나 할때 유용하게 사용됩니다.
일반적인 단말기에서 지원하는 스샷을 잡는 방식은 때로는 게임에 따라서 사용할 수 없을때가 있습니다.
따라서 다음과 같이 추가해주시면 손쉽게 Cocos2d-x를 이용항 게임에서 화면을 잡아서 저장할 수 있습니다.
1. 먼저 프로젝트의 main함수인 NinjaAndZombies.java에 다음과 같이 추가해줍니다.
public static int w = 100;
public static int h = 100;
public static boolean capture = false;
public static Bitmap captureBmp = null;
2. 안드로이드 프로젝트의 scr아래 org.cocos2dx.lib.Cocos2dxRenderer.java 파일에 다음 함수(onDrawFrame())을 수정해줍니다.
public void onDrawFrame(GL10 gl) {
long now = System.nanoTime();
long interval = now - last;
// should render a frame when onDrawFrame() is called
// or there is a "ghost"
nativeRender();
// fps controlling
if (interval < animationInterval){
try {
// because we render it before, so we should sleep twice time interval
Thread.sleep((animationInterval - interval) * 2 / NANOSECONDSPERMINISECOND);
} catch (Exception e){}
}
last = now;
if (NinjaAndZombies.capture)
{
int width = NinjaAndZombies.w;
int height = NinjaAndZombies.h;
int screenshotSize = width * height;
ByteBuffer bb = ByteBuffer.allocateDirect(screenshotSize * 4);
bb.order(ByteOrder.nativeOrder());
gl.glReadPixels(0, 0, width, height, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, bb);
int pixelsBuffer[] = new int[screenshotSize];
bb.asIntBuffer().get(pixelsBuffer);
bb = null;
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
bitmap.setPixels(pixelsBuffer, screenshotSize - width, -width, 0, 0, width, height);
pixelsBuffer = null;
short sBuffer[] = new short[screenshotSize];
ShortBuffer sb = ShortBuffer.wrap(sBuffer);
bitmap.copyPixelsToBuffer(sb);
// 안드로이드 bitmap과 호환되는 bmp파일 생성.
for (int i = 0; i < screenshotSize; ++i)
{
short v = sBuffer[i];
sBuffer[i] = (short) (((v & 0x1f) << 11) | (v & 0x7e0) | ((v & 0xf800) >> 11));
}
sb.rewind();
bitmap.copyPixelsFromBuffer(sb);
NinjaAndZombies.captureBmp = bitmap.copy(Bitmap.Config.ARGB_8888,false);
NinjaAndZombies.capture=false;
}
}
3. 다음을 통해서 화면을 잡고 Bitmap을 되돌려 받습니다. captureBmp에 잡힌 화면이 넘어오게됩니다.
w = mGLView.getWidth();
h = mGLView.getHeight();
capture = true;
4. 원하는 위치에 파일을 저장하시면 됩니다.
Cocos2d-x를 이용해서 게임을 개발중이시면 위 방법으로 화면을 잡으시면 됩니다. 하지만 안드로이드의 다른 Layer들이 존재한다면 위 방법으로 그 Layer들은 잡히지 않습니다. 이점 참고하시기 바랍니다.
(위 화면은 다른 방법으로 잡았습니다.)
http://stackoverflow.com를 비롯해서 다양한 사이트에서 많은 해결책을 제시하고있습니다.
참고하시기 바랍니다. 그리고 오늘도 단순한 코딩문제로 아까운 시간을 보내고 계시는 개발자분들을 위해서 조금이나마 도움이 되었으면 하는 마음입니다. 감사합니다.
'프로그래밍 > Cocos2dX' 카테고리의 다른 글
Cocos2d-X의 SDKBox의 Vungle 광고 적용시 Crash발생 (0) | 2015.11.02 |
---|---|
Cocos2d-X의 Debug LOG출력 차단하기. (0) | 2014.08.22 |
일본어 출력시 글자가 짤리는 문제... (0) | 2012.12.03 |
Cocos2d-X에서 Admob광고 원하는 위치에 추가하기. (0) | 2012.10.20 |
Cocos2d-X를 이용해서 국내 오픈마켓 동시 개발.. (2) | 2012.09.11 |