-> 이벤트 핸들러가 정의되는 영역.
-> CCLayer에서 터치를 활성화시키는 작업등을 하는게 아니라, CCStandardTouchDelegate 나 CCTargetedTouchDelegate 중에서 사용하는 프로토콜을 완성해야 한다고 나오네요.
기본 생성된 레이아웃 XML파일의 코드를 전체삭제후 프레임 레이아웃처럼 아무런 설정이 없는것을 넣으면 화면전환이 개선되는것을 볼수 있다. 부가적으로 스플래쉬/로딩화면을 이용해서 액티비티에 서페이스뷰가 덮어지는 틈새시간을 가려주는 작업이 필요해보입니다.
package cocos.android.ex1;
import org.cocos2d.layers.CCLayer;
import org.cocos2d.layers.CCScene;
import org.cocos2d.nodes.CCDirector;
import org.cocos2d.nodes.CCSprite;
import org.cocos2d.opengl.CCGLSurfaceView;
import org.cocos2d.types.CGPoint;
import org.cocos2d.types.CGSize;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.Window;
import android.view.WindowManager;
public class MainActivity extends Activity
{
private CCGLSurfaceView surfaceView;
// 내부클래스
public static class LayerSample extends CCLayer
{
CCSprite bgImg;
CCSprite spirite1;
CCSprite spirite2;
public LayerSample() {
this.setIsTouchEnabled(true);
setImgBg();
setImgSprite();
}
private void setImgBg()
{// cocos2d-android기준 스프라이트 확대/축소 예시 & 화면크기값 구하기
CGSize display = CCDirector.sharedDirector().displaySize();
bgImg = CCSprite.sprite("background.png");
float w = bgImg.getBoundingBox().size.width;
float h = bgImg.getBoundingBox().size.height;
bgImg.setScaleX(display.width / w);
bgImg.setScaleY(display.height / h);
bgImg.setPosition(display.width / 2, display.height / 2);
this.addChild(bgImg);
}
private void setImgSprite()
{
spirite1 = CCSprite.sprite("logo.png");
spirite1.setPosition(200f, 0f);
this.addChild(spirite1);
spirite2 = CCSprite.sprite("logo-2dx.png");
spirite2.setPosition(200f, 500f);
spirite2.addChild(spirite1); //스프라이트에 스프라이트를 addChild
this.addChild(spirite2); //레이어나 씬에 스프라이트를 addChild
}
public static CCScene scene()
{
CCScene scene = CCScene.node();
CCLayer layer = new LayerSample();
scene.addChild(layer); //씬에 레이어를 addChild
return scene;
}
@Override
public boolean ccTouchesBegan(MotionEvent event) {
CGPoint startLocation = CCDirector.sharedDirector().convertToGL(CGPoint.make(event.getX(), event.getY()));
if(spirite1.getBoundingBox().contains(startLocation.x, startLocation.y))
{
CCScene scene = LayerSample.scene();
CCDirector.sharedDirector().replaceScene(scene);
}
if(spirite2.getBoundingBox().contains(startLocation.x, startLocation.y))
{
CCDirector.sharedDirector().getActivity().finish();//해당 이미지를 터치미 액티비티 종료
}
return super.ccTouchesBegan(event);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
surfaceView = new CCGLSurfaceView(this);
CCDirector director = CCDirector.sharedDirector(); // 디렉터
director.attachInView(surfaceView);
}
@Override
protected void onStart() {
super.onStart();
setContentView(surfaceView);
CCDirector.sharedDirector().setDisplayFPS(true);
CCDirector.sharedDirector().setAnimationInterval(2.0f / 60.0f); //프레임량 조절.
CCScene scene = LayerSample.scene();
CCDirector.sharedDirector().runWithScene(scene);
}
}
해외권 자료.