레이블이 cocos2d-x인 게시물을 표시합니다. 모든 게시물 표시
레이블이 cocos2d-x인 게시물을 표시합니다. 모든 게시물 표시

2014년 7월 31일 목요일

ios에서 cocos2d-x(3.x)의 game view를 특정 뷰의 child view에 붙이기

cocos2d-x의 게임뷰를 특정 뷰의 child뷰로 가져오기 위한 방법입니다.
(cocos2d-x 3.2 버전 기준)


1. cocos2d-x기반의 빈 프로젝트(hello world)를 만듭니다.

2. AppController.mm의 didFinishLaunchingWithOptions 함수 안에
GLView를 생성하고 싱글톤 객체인 cocos2d::Director를 구동하는 코드가 있는데
여기서 이것들을 하면 안되니 모두 지워버립니다. ㅎㅎ

나머지 applicationDidEnterBackground, applicationWillEnterForeground 등의 함수안의 코드는 그냥 그대로 둡니다.


3. 새로운 컨트롤러(이하 CustomViewController)를 만들고 게임뷰를 담을 UIVIew(이하 viewGLViewContainter)객체를 하나 만들어 놓습니다.


4. CustomViewController 소스에서 아래 두 함수를 통해 게임뷰를 생성하여 viewGLViewContainter붙이고 정리하는 코드를 추가합니다.
- (void)viewWillAppear:(BOOL)animated
- (void)viewWillDisappear:(BOOL)animated

소스파일(CustomViewController.mm 소스 파일)에 아래 2개의 헤더를 import합니다.
- cocos2dx의 cpp코드를 사용해야 하니 mm 파일로 만들어야 합니다.

#import "cocos2d.h"
#import "CCEAGLView.h"


viewWillAppear함수에 아래 코드를 추가합니다.
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    
    // Init the CCEAGLView
    CCEAGLView *eaglView = [CCEAGLView viewWithFrame: self.viewGLViewContainter.bounds
                             pixelFormat: kEAGLColorFormatRGBA8
                             depthFormat: GL_DEPTH24_STENCIL8_OES
                      preserveBackbuffer: NO
                              sharegroup: nil
                           multiSampling: NO
                         numberOfSamples: 0];
    
   
    [self.viewGLViewContainter addSubview:eaglView];

    cocos2d::GLView *glview = cocos2d::GLView::createWithEAGLView(eaglView);
    cocos2d::Director::getInstance()->setOpenGLView(glview);
    
    cocos2d::Application::getInstance()->run();
}

viewWillDisappear함수에 아래 코드를 추가합니다.
- (void)viewWillDisappear:(BOOL)animated
{
    cocos2d::Director::getInstance()->end();

    cocos2d::Director::getInstance()->mainLoop();

    [super viewWillDisappear:animated];
}


정상적이라면 아래와 유사한 화면을 볼 수 있겠습니다.


2014년 3월 9일 일요일

cocos2dx를 이용한 live wallpaper만들기

cocos2dx 안드로이드 프로젝트의 기본 main activity를 라이브웰 페이퍼 구성을 위해 아래와 같이 WallpaperService로 변경하는 것으로 구현이 가능합니다.
(cocos2d-x 2.x버전에서 테스트)

import org.cocos2dx.lib.Cocos2dxGLSurfaceView;
import org.cocos2dx.lib.Cocos2dxHelper;
import org.cocos2dx.lib.Cocos2dxHelper.Cocos2dxHelperListener;
import org.cocos2dx.lib.Cocos2dxRenderer;

import android.content.Context;
import android.content.SharedPreferences;
import android.opengl.GLSurfaceView.Renderer;
import android.service.wallpaper.WallpaperService;
import android.view.MotionEvent;
import android.view.SurfaceHolder;

public class WallpaperCocos2dxService extends WallpaperService
{

static
{
System.loadLibrary("cocos2dcpp");
}

@Override
public Engine onCreateEngine()
{
        return new Cocos2dxWallpaperEngine();
}

public class Cocos2dxWallpaperEngine extends Engine implements Cocos2dxHelperListener,
SharedPreferences.OnSharedPreferenceChangeListener
{

protected class WallpaperCocos2dxGLSurfaceView extends Cocos2dxGLSurfaceView 
{
            WallpaperCocos2dxGLSurfaceView(Context context) 
            {
                super(context);
            }

            @Override
            public SurfaceHolder getHolder() 
            {
                return getSurfaceHolder();
            }

            public void onDestroy() 
            {
                super.onDetachedFromWindow();
            }
}

protected class WallpaperCocos2dxRenderer extends Cocos2dxRenderer
{
// prevent the cocos2dxRenderer from calling nativeInit
@Override
public void onSurfaceCreated(final GL10 pGL10, final EGLConfig pEGLConfig)
{
}

@Override
public void onSurfaceChanged(final GL10 pGL10, final int pWidth, final int pHeight)
{
setScreenWidthAndHeight(pWidth, pHeight);
super.onSurfaceCreated(null, null);
}

}

private WallpaperCocos2dxGLSurfaceView m_WallpaperCocos2dxGLSurfaceView;
@Override
public void onCreate(SurfaceHolder surfaceHolder)
{
super.onCreate(surfaceHolder);
//setTouchEventsEnabled(true);
            m_WallpaperCocos2dxGLSurfaceView = new WallpaperCocos2dxGLSurfaceView(WallpaperCocos2dxService.this);
            m_WallpaperCocos2dxGLSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
            
            //mGLSurfaceView.setCocos2dxRenderer(new Cocos2dxRenderer());
            
            setRenderer(getNewRenderer());
            Cocos2dxHelper.init(WallpaperCocos2dxService.this, this);
}

@Override
public void onVisibilityChanged(boolean visible)
{
            super.onVisibilityChanged(visible);
            if (visible) 
            {
                Cocos2dxHelper.onResume();
                m_WallpaperCocos2dxGLSurfaceView.onResume();
            } 
            else 
            {
                Cocos2dxHelper.onPause();
                m_WallpaperCocos2dxGLSurfaceView.onPause();            
            }
}

@Override
public void onDestroy()
{
            super.onDestroy();

            Cocos2dxHelper.end();

            m_WallpaperCocos2dxGLSurfaceView.onDestroy();
}

protected void setRenderer(Renderer renderer) 
{
            m_WallpaperCocos2dxGLSurfaceView.setCocos2dxRenderer((Cocos2dxRenderer) renderer);
}
   
Renderer getNewRenderer()
{
            Cocos2dxRenderer renderer = new WallpaperCocos2dxRenderer();
            return renderer;
}

@Override
public void showDialog(String pTitle, String pMessage)
{
// TODO Auto-generated method stub
}

@Override
public void showEditTextDialog(String pTitle, String pMessage, int pInputMode, int pInputFlag, int pReturnType, int pMaxLength)
{
}

@Override
public void runOnGLThread(Runnable pRunnable)
{
m_WallpaperCocos2dxGLSurfaceView.queueEvent(pRunnable);
}

@Override
public void onTouchEvent(MotionEvent event)
{
            m_WallpaperCocos2dxGLSurfaceView.onTouchEvent(event);
}

@Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String sKey)
{

}
}

}