菜単滑動効果の成果
public class MenuScrollerActivity extends BaseGameActivityimplements 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; private TextureRegion mMenuLeftTextureRegion;プライベート TextureRegion mMenuRightTextureRegion;プライベートスプライトメニュー左;プライベート スプライト メニュー右; // スクロールプライベート SurfaceScrollDetector mScrollDetector;プライベート ClickDetector mClickDetector;プライベートフロートmMinX = 0;プライベートフロートmMaxX = 0;プライベートフロート mCurrentX = 0; private int iItemClicked = -1;プライベート長方形スクロールバー; private List<TextureRegion> 列 = 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 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 = 新しいシーン(); 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(final Scene pScene、final TouchEvent pSceneTouchEvent) { this.mClickDetector.onTouchEvent(pSceneTouchEvent); this.mScrollDetector.onTouchEvent(pSceneTouchEvent); true を返します。 } @Override public void onScroll(final ScrollDetector pScollDetector,final TouchEvent pTouchEvent,final float pDistanceX,final float pDistanceY) { //メニューの左右の矢印を無効にします (15 ピクセルのパディング) 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; //カメラを使用してスクロールバーを設定します 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++) { //タッチ時、スクロールではなくクリックだった場合に備えて、クリックした項目を保存します。 Final int itemToLoad = iItem;スプライト sprite = new Sprite(spriteX,spriteY,columns.get(x)){public boolean onAreaTouched(final TouchEvent pSceneTouchEvent,final float pTouchAreaLocalX,final float pTouchAreaLocalY) { iItemClicked = itemToLoad; false を返します。 } }; iItem++; this.mScene.attachChild(スプライト); this.mScene.registerTouchArea(スプライト); spriteX += 20 + PADDING+sprite.getWidth(); mMaxX = スプライトX - カメラの幅; // スクロールバーのサイズを設定します float スクロールバーサイズ = CAMERA_WIDTH/((mMaxX+CAMERA_WIDTH)/CAMERA_WIDTH);スクロールバー = 新しい Rectangle(0,CAMERA_HEIGHT-20,scrollbarsize, 20);スクロールバー.setColor(1,0,0); this.mScene.attachChild(scrollBar); menuleft = 新しいスプライト(0,CAMERA_HEIGHT/2-mMenuLeftTextureRegion.getHeight()/2,mMenuLeftTextureRegion); menuright = 新しいスプライト(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, "Load Items" + String.valueOf() iLevel)、Toast.LENGTH_SHORT).show(); } }); } }}以上が本明細書のすべての内容であり、多くの皆様にご満足いただけることを願っております。