菜單滑動效果的實現
公共類別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;私人 int iItemClicked = -1;私有矩形滾動條; private List<TextureRegion> columns = new ArrayList<TextureRegion>(); // ================================================== == =========== // 建構子// ================================= ===== ========================= // ==================== ===== ====================================== // Getter & Setter // ======= ============================================= ======== == // ======================================== ========== ============= // 超類別/介面的方法// =================== =========== ================================= @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 public Engine onLoadEngine() { this.mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);最終 EngineOptions engineOptions = new EngineOptions(true, ScreenOrientation.LANDSCAPE, new FillResolutionPolicy(), this.mCamera); engineOptions.getTouchOptions().setRunOnUpdateThread(true);最終引擎引擎 = 新引擎(engineOptions);返回引擎; } @Override public Scene onLoadScene() { this.mEngine.registerUpdateHandler(new FPSLogger()); this.mScene = new Scene(); this.mScene.setBackground(new ColorBackground(0, 0, 0)); this.mScrollDetector = new SurfaceScrollDetector(this); this.mClickDetector = new ClickDetector(this); this.mScene.setOnSceneTouchListener(this); this.mScene.setTouchAreaBindingEnabled(true); this.mScene.setOnSceneTouchListenerBindingEnabled(true);建立選單框();返回this.mScene; } @Override public boolean onSceneTouchEvent(final Scene pScene, Final TouchEvent pSceneTouchEvent) { this.mClickDetector.onTouchEvent(pSceneTouchEvent); this.mScrollDetector.onTouchEvent(pSceneTouchEvent);返回真; } @Override public void onScroll(final ScrollDetector pScolDetector, Final TouchEvent pTouchEvent, Final float pDistanceX, Final float pDistanceY) { //停用左右選單箭頭(15px 填充) if(mCamera.getMinX()<15) );否則 menuleft.setVisible(true); if(mCamera.getMinX()>mMaxX-15) menuright.setVisible(false);否則 menuright.setVisible(true); //如果到達終點則回傳 if ( ((mCurrentX - pDistanceX) < mMinX) ){ return; }否則 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()); //因為Camera可以有負的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 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(精靈); this.mScene.registerTouchArea(sprite); spriteX += 20 + PADDING+sprite.getWidth(); mMaxX = spriteX - CAMERA_WIDTH; //設定捲軸的大小 float scrollbarsize = CAMERA_WIDTH/((mMaxX+CAMERA_WIDTH)/CAMERA_WIDTH);捲軸=新矩形(0,CAMERA_HEIGHT-20,滾動條大小,20);滾動條.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(menuright); 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 } }); } }}以上就是本文的全部了,希望大家能夠喜歡。