菜单滑动效果的实现
публичный класс MenuScrollerActivity расширяет BaseGameActivity реализует IScrollDetectorListener, IOnSceneTouchListener, IClickDetectorListener { // ================================= ====================== // Константы // =============================================== ========= protected static int CAMERA_WIDTH = 480; защищенный статический int CAMERA_HEIGHT = 320; защищенный статический int FONT_SIZE = 24; защищенный статический int PADDING = 50; защищенный статический 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; частный ИНТ iItemClicked = -1; частный прямоугольник прокрутки; частные столбцы List<TextureRegion> = новый ArrayList<TextureRegion>(); // ============================================== =========== // Конструкторы // =============================================== ========= // =============================================== ========= // Получатель и сеттер // =============================================== ========= // =============================================== ========= // Методы для/из суперкласса/интерфейсов // =============================================== ========= @Override public void onLoadResources() { // Пути FontFactory.setAssetBasePath("font/"); BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/"); // Шрифт this.mFontTexture = новый 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 public Engine onLoadEngine () { this.mCamera = новая камера (0, 0, CAMERA_WIDTH, CAMERA_HEIGHT); окончательный вариант EngineOptions engineOptions = new EngineOptions(true, ScreenOrientation.LANDSCAPE, new FillResolutionPolicy(), this.mCamera); engineOptions.getTouchOptions().setRunOnUpdateThread(true); окончательный двигатель Engine = новый 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.mScene.setTouchAreaBindingEnabled(истина); this.mScene.setOnSceneTouchListenerBindingEnabled(истина); СоздатьМенюБоксы(); верните this.mScene; } @Override public boolean onSceneTouchEvent (финальная сцена pScene, финальная TouchEvent pSceneTouchEvent) { this.mClickDetector.onTouchEvent (pSceneTouchEvent); this.mScrollDetector.onTouchEvent(pSceneTouchEvent); вернуть истину; } @Override public void onScroll(final ScrollDetector pScallDetector, Final TouchEvent pTouchEvent, Final float pDistanceX, Final float pDistanceY) { //Отключаем стрелки меню влево и вправо (отступ 15 пикселей) if(mCamera.getMinX()<=15) Menuleft. setVisible (ложь); иначе менюleft.setVisible(истина); if(mCamera.getMinX()>mMaxX-15) menuright.setVisible(false); иначе менюright.setVisible(истина); //Возврат, если достигнуты концы if ( ((mCurrentX - pDistanceX) < mMinX)){ return; } else if ((mCurrentX - pDistanceX) > mMaxX) { return; } //Центрируем камеру по текущей точке this.mCamera.offsetCenter(-pDistanceX,0 ); mCurrentX -= pDistanceX; //Установим полосу прокрутки с помощью камеры float 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 ); mCurrentX=0; } } @Override public void onClick (ClickDetector pClickDetector, TouchEvent pTouchEvent) {loadLevel (iItemClicked); }; // ============================================== =========== // Методы // =============================================== ========= Private void CreateMenuBoxes() { int spriteX = PADDING; int spriteY = ЗАПОЛНЕНИЕ; //счетчик текущего элемента int iItem = 1; for (int x = 0; x < columns.size(); x++) { //При касании сохраняем выбранный элемент на случай, если это щелчок, а не прокрутка. окончательный int itemToLoad = iItem; Спрайт спрайт = новый Sprite(spriteX,spriteY,columns.get(x)){ public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, Final float pTouchAreaLocalX, Final float pTouchAreaLocalY) { iItemClicked = itemToLoad; вернуть ложь; } }; iItem++; this.mScene.attachChild(спрайт); this.mScene.registerTouchArea(спрайт); spriteX += 20 + PADDING+sprite.getWidth(); } mMaxX = spriteX - CAMERA_WIDTH; //устанавливаем размер полосы прокрутки float Scrollbarsize = CAMERA_WIDTH/((mMaxX+CAMERA_WIDTH)/CAMERA_WIDTH); ScrollBar = новый прямоугольник (0,CAMERA_HEIGHT-20,размер полосы прокрутки, 20); ScrollBar.setColor(1,0,0); this.mScene.attachChild(scrollBar); Menuleft = новый Sprite(0,CAMERA_HEIGHT/2-mMenuLeftTextureRegion.getHeight()/2,mMenuLeftTextureRegion); Menuright = новый спрайт (CAMERA_WIDTH-mMenuRightTextureRegion.getWidth(),CAMERA_HEIGHT/2-mMenuRightTextureRegion.getHeight()/2,mMenuRightTextureRegion); this.mScene.attachChild(менюправо); менюleft.setVisible(ложь); this.mScene.attachChild(менюслева); } @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 } }; } }}以上所述就是本文的全部内容了,希望大家能够喜欢。