Cocos2d-x에서 게임화면 잡기(ScreenShot)

2013. 3. 19. 16:24프로그래밍/Cocos2dX

728x90
반응형

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를 비롯해서 다양한 사이트에서 많은 해결책을 제시하고있습니다.

참고하시기 바랍니다. 그리고 오늘도 단순한 코딩문제로 아까운 시간을 보내고 계시는 개발자분들을 위해서 조금이나마 도움이 되었으면 하는 마음입니다. 감사합니다.





728x90
반응형