菜单滑动效果的实现
공개 클래스 MenuScrollerActivity는 BaseGameActivity를 확장하여 IScrollDetectorListener, IOnSceneTouchListener, IClickDetectorListener를 구현합니다. { // ==================================== ======================= // 상수 // ================================================= ========= protected static int CAMERA_WIDTH = 480; protected static int CAMERA_HEIGHT = 320; protected static int FONT_SIZE = 24; protected static int PADDING = 50; protected static int MENUITEMS = 7; // ================================================ =========== // 필드 // ================================================= ========= 비공개 장면 mScene; 개인용 카메라 mCamera; 개인 글꼴 mFont; 개인 BitmapTextureAtlas mFontTexture; 개인 BitmapTextureAtlas mMenuTextureAtlas; 개인 TextureRegion mMenuLeftTextureRegion; 개인 TextureRegion mMenuRightTextureRegion; 개인 스프라이트 메뉴왼쪽; 개인 스프라이트 메뉴권리; // 스크롤링 private SurfaceScrollDetector mScrollDetector; 개인 ClickDetector mClickDetector; 개인 부동 소수점 mMinX = 0; 개인 부동 소수점 mMaxX = 0; 개인 부동 소수점 mCurrentX = 0; private int iItemClicked = -1; 개인 직사각형 스크롤바; private List<TextureRegion> columns = new ArrayList<TextureRegion>(); // ================================================ =========== // 생성자 // ================================================= ========= // ================================================= ========= // 게터 및 세터 // ================================================= ========= // ================================================= ========= // 슈퍼클래스/인터페이스의 메서드 // ================================================= ========= @Override public void onLoadResources() { // 경로 FontFactory.setAssetBasePath("font/"); BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/"); // 글꼴 this.mFontTexture = new BitmapTextureAtlas(256, 256); this.mFont = FontFactory.createFromAsset(this.mFontTexture, this, "Plok.TTF", FONT_SIZE, true, Color.BLACK); this.mEngine.getTextureManager().loadTextures(this.mFontTexture); this.mEngine.getFontManager().loadFonts(this.mFont); //메뉴 이미지 for (int i = 0; i < MENUITEMS; i++) { BitmapTextureAtlas mMenuBitmapTextureAtlas = new BitmapTextureAtlas(256,256, TextureOptions.BILINEAR_PREMULTIPLYALPHA); TextureRegion mMenuTextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(mMenuBitmapTextureAtlas, this, "menu"+i+".png", 0, 0); this.mEngine.getTextureManager().loadTexture(mMenuBitmapTextureAtlas); columns.add(mMenuTextureRegion); } //메뉴 화살표의 텍스처 this.mMenuTextureAtlas = new BitmapTextureAtlas(128,128, TextureOptions.BILINEAR_PREMULTIPLYALPHA); this.mMenuLeftTextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(mMenuTextureAtlas, this, "menu_left.png", 0, 0); this.mMenuRightTextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(mMenuTextureAtlas, this, "menu_right.png",64, 0); this.mEngine.getTextureManager().loadTexture(mMenuTextureAtlas); } @Override 공용 엔진 onLoadEngine() { this.mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT); final EngineOptionsengineOptions = new EngineOptions(true, ScreenOrientation.LANDSCAPE, new FillResolutionPolicy(), this.mCamera); engineOptions.getTouchOptions().setRunOnUpdateThread(true); 최종 엔진 엔진 = new Engine(engineOptions); 리턴 엔진; } @Override public Scene onLoadScene() { this.mEngine.registerUpdateHandler(new FPSLogger()); this.mScene = 새로운 장면(); this.mScene.setBackground(new ColorBackground(0, 0, 0)); this.mScrollDetector = 새로운 SurfaceScrollDetector(this); this.mClickDetector = 새로운 ClickDetector(this); this.mScene.setOnSceneTouchListener(this); this.mScene.setTouchAreaBindingEnabled(true); this.mScene.setOnSceneTouchListenerBindingEnabled(true); CreateMenuBoxes(); this.mScene을 반환합니다. } @Override public boolean onSceneTouchEvent(최종 장면 pScene, 최종 TouchEvent pSceneTouchEvent) { this.mClickDetector.onTouchEvent(pSceneTouchEvent); this.mScrollDetector.onTouchEvent(pSceneTouchEvent); 사실을 반환; } @Override public void onScroll(final ScrollDetector pScollDetector, final TouchEvent pTouchEvent, final float pDistanceX, final float pDistanceY) { //왼쪽 및 오른쪽 메뉴 화살표를 비활성화합니다(15px 패딩) if(mCamera.getMinX()<=15) menuleft. setVisible(false); 그렇지 않으면 menuleft.setVisible(true); if(mCamera.getMinX()>mMaxX-15) menuright.setVisible(false); 그렇지 않으면 menuright.setVisible(true); //끝점에 도달하면 반환합니다. if ( ((mCurrentX - pDistanceX) < mMinX) ){ return; }else if((mCurrentX - pDistanceX) > mMaxX){ return; } //현재 지점을 카메라 중심에 둡니다. this.mCamera.offsetCenter(-pDistanceX,0 ); mCurrentX -= pDistanceX; //카메라 부동으로 스크롤바 설정 tempX =mCamera.getCenterX()-CAMERA_WIDTH/2; // 위치에 % 부분을 추가합니다. tempX+= (tempX/(mMaxX+CAMERA_WIDTH))*CAMERA_WIDTH; //위치 설정 scrollBar.setPosition(tempX, scrollBar.getY()); //왼쪽 및 오른쪽 화살표 설정 menuright.setPosition(mCamera.getCenterX()+CAMERA_WIDTH/2-menuright.getWidth(),menuright.getY()); menuleft.setPosition(mCamera.getCenterX()-CAMERA_WIDTH/2,menuleft.getY()); //카메라는 음수 X 값을 가질 수 있으므로 0으로 설정합니다. if(this.mCamera.getMinX()<0){ this.mCamera.offsetCenter(0,0 ); m현재X=0; } } @Override public void onClick(ClickDetector pClickDetector, TouchEvent pTouchEvent) { loadLevel(iItemClicked); }; // ================================================ =========== // 메소드 // ================================================= ========= private void CreateMenuBoxes() { int spriteX = PADDING; int spriteY = PADDING; //현재 아이템 카운터 int iItem = 1; for (int x = 0; x < columns.size(); x++) { //터치 시 스크롤이 아닌 클릭인 경우에 대비해 클릭한 항목을 저장합니다. final int itemToLoad = iItem; Sprite sprite = new Sprite(spriteX,spriteY,columns.get(x)){ public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) { iItemClicked = itemToLoad; 거짓을 반환; } }; iItem++; this.mScene.attachChild(sprite); this.mScene.registerTouchArea(sprite); spriteX += 20 + PADDING+sprite.getWidth(); } mMaxX = spriteX - CAMERA_WIDTH; //스크롤바 크기 설정 float scrollbarsize = CAMERA_WIDTH/((mMaxX+CAMERA_WIDTH)/CAMERA_WIDTH); scrollBar = new Rectangle(0,CAMERA_HEIGHT-20,scrollbarsize, 20); scrollBar.setColor(1,0,0); this.mScene.attachChild(scrollBar); menuleft = new Sprite(0,CAMERA_HEIGHT/2-mMenuLeftTextureRegion.getHeight()/2,mMenuLeftTextureRegion); menuright = new Sprite(CAMERA_WIDTH-mMenuRightTextureRegion.getWidth(),CAMERA_HEIGHT/2-mMenuRightTextureRegion.getHeight()/2,mMenuRightTextureRegion); this.mScene.attachChild(메뉴오른쪽); menuleft.setVisible(false); this.mScene.attachChild(menuleft); } @Override public void onLoadComplete() { } //여기에서 항목 로드를 호출합니다. private void loadLevel(final int iLevel) { if (iLevel != -1) { runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(MenuScrollerActivity.this, "항목 로드" + String.valueOf( iLevel), Toast.LENGTH_SHORT).show(); iItemClicked = -1 } }); } }}以上所述就是本文의 전체 부서는 内容了, 希望大家能够喜欢입니다.