Scroll Level Selector advanced

  ... tutorials on how to use AndEngine.

Scroll Level Selector advanced

Postby onerain88 » Wed Mar 07, 2012 9:36 am

Recently, I find some topic about "Scroll Level Selector", they are wonderful
But they couldnot turn page when I wanna, just scrolling, not turn!
Today, I try to implement it, as follow
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. package onerain.lsd;
  2.  
  3. import org.andengine.engine.camera.Camera;
  4. import org.andengine.engine.camera.hud.HUD;
  5. import org.andengine.engine.options.EngineOptions;
  6. import org.andengine.engine.options.EngineOptions.ScreenOrientation;
  7. import org.andengine.engine.options.resolutionpolicy.FillResolutionPolicy;
  8. import org.andengine.entity.primitive.Rectangle;
  9. import org.andengine.entity.scene.Scene;
  10. import org.andengine.entity.scene.Scene.IOnSceneTouchListener;
  11. import org.andengine.entity.scene.background.Background;
  12. import org.andengine.entity.text.Text;
  13. import org.andengine.entity.util.FPSLogger;
  14. import org.andengine.input.touch.TouchEvent;
  15. import org.andengine.input.touch.detector.ClickDetector;
  16. import org.andengine.input.touch.detector.ClickDetector.IClickDetectorListener;
  17. import org.andengine.input.touch.detector.ScrollDetector;
  18. import org.andengine.input.touch.detector.ScrollDetector.IScrollDetectorListener;
  19. import org.andengine.input.touch.detector.SurfaceScrollDetector;
  20. import org.andengine.opengl.font.Font;
  21. import org.andengine.opengl.font.FontFactory;
  22. import org.andengine.ui.activity.SimpleBaseGameActivity;
  23. import org.andengine.util.color.Color;
  24.  
  25. import android.graphics.Typeface;
  26. import android.util.Log;
  27. import android.widget.Toast;
  28.  
  29. public class ScrollMenuActivity extends SimpleBaseGameActivity implements IScrollDetectorListener,
  30.                 IOnSceneTouchListener, IClickDetectorListener
  31. {
  32.         private final static String TAG = "onerain";
  33.  
  34.         private final static int CAMERA_WIDTH = 480;
  35.         private final static int CAMERA_HEIGHT = 800;
  36.  
  37.         // 假设有60个关卡
  38.         private final static int LEVELS = 60;
  39.         // 每屏显示关卡的列数
  40.         private final static int LEVEL_COLUMNS_PER_SCREEN = 3;
  41.         // 每屏显示关卡的行数
  42.         private final static int LEVEL_ROWS_PER_SCREEN = 3;
  43.         // 页数
  44.         private final static int LEVEL_PAGES = (LEVELS % (LEVEL_COLUMNS_PER_SCREEN * LEVEL_ROWS_PER_SCREEN)) == 0 ?
  45.                         (LEVELS / (LEVEL_COLUMNS_PER_SCREEN * LEVEL_ROWS_PER_SCREEN)): (LEVELS / (LEVEL_COLUMNS_PER_SCREEN * LEVEL_ROWS_PER_SCREEN)) + 1;
  46.         // 关卡之间的间距
  47.         private final static int LEVEL_PADDING = 30;
  48.         // 默认滑动认为是翻页的距离
  49.         private final static int TURN_PAGE_DISTANCE = 150;
  50.  
  51.         private Scene scene;
  52.         private Camera camera;
  53.         private HUD hud;
  54.  
  55.         private Font font;
  56.  
  57.         private SurfaceScrollDetector surfaceScrollDetector;
  58.         private ClickDetector clickDetector;
  59.  
  60.         private int levelClicked = -1;
  61.  
  62.         private int maxLevelReached = 30;
  63.  
  64.         private float distanceX;
  65.        
  66.         private int page = 0;
  67.  
  68.         @Override
  69.         public EngineOptions onCreateEngineOptions()
  70.         {
  71.                 // TODO Auto-generated method stub
  72.                 camera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
  73.  
  74.                 return new EngineOptions(true, ScreenOrientation.PORTRAIT_FIXED, new FillResolutionPolicy(), camera);
  75.         }
  76.  
  77.         @Override
  78.         protected void onCreateResources()
  79.         {
  80.                 // TODO Auto-generated method stub
  81.                 font = FontFactory.create(getFontManager(), getTextureManager(), 256, 256,
  82.                                 Typeface.create(Typeface.DEFAULT, Typeface.BOLD), 32);
  83.                 font.load();
  84.         }
  85.  
  86.         @Override
  87.         protected Scene onCreateScene()
  88.         {
  89.                 // TODO Auto-generated method stub
  90.                 mEngine.registerUpdateHandler(new FPSLogger());
  91.  
  92.                 scene = new Scene();
  93.                 scene.setBackground(new Background(0.9f, 0.9f, 0.9f));
  94.  
  95.                 surfaceScrollDetector = new SurfaceScrollDetector(this);
  96.                 clickDetector = new ClickDetector(this);
  97.  
  98.                 scene.setOnSceneTouchListener(this);
  99.                 scene.setTouchAreaBindingOnActionDownEnabled(true);
  100.                 scene.setTouchAreaBindingOnActionMoveEnabled(true);
  101.                 scene.setOnSceneTouchListenerBindingOnActionDownEnabled(true);
  102.  
  103.                 createHUD();
  104.                 createLevelBoxes();
  105.  
  106.                 return scene;
  107.         }
  108.  
  109.         @Override
  110.         public void onClick(ClickDetector pClickDetector, int pPointerID, float pSceneX, float pSceneY)
  111.         {
  112.                 // TODO Auto-generated method stub
  113.                 loadLevel(levelClicked);
  114.         }
  115.  
  116.         @Override
  117.         public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent)
  118.         {
  119.                 // TODO Auto-generated method stub
  120.                 clickDetector.onTouchEvent(pSceneTouchEvent);
  121.                 surfaceScrollDetector.onTouchEvent(pSceneTouchEvent);
  122.  
  123.                 return true;
  124.         }
  125.  
  126.         @Override
  127.         public void onScrollStarted(ScrollDetector pScollDetector, int pPointerID, float pDistanceX,
  128.                         float pDistanceY)
  129.         {
  130.                 // TODO Auto-generated method stub
  131.                 distanceX = 0;
  132.         }
  133.  
  134.         @Override
  135.         public void onScroll(ScrollDetector pScollDetector, int pPointerID, float pDistanceX, float pDistanceY)
  136.         {
  137.                 // TODO Auto-generated method stub
  138.                 camera.offsetCenter(-pDistanceX, 0);
  139.  
  140.                 distanceX += pDistanceX;
  141.         }
  142.  
  143.         @Override
  144.         public void onScrollFinished(ScrollDetector pScollDetector, int pPointerID, float pDistanceX,
  145.                         float pDistanceY)
  146.         {
  147.                 // TODO Auto-generated method stub
  148.                 Log.d(TAG, "page: " + page);
  149.                
  150.                 // 判断是否翻页,注意:手指向左滑动是想看到右一页
  151.                 if ((distanceX > TURN_PAGE_DISTANCE) && (page > 0))
  152.                 {
  153.                         Log.d(TAG, "上翻一页");
  154.                         page--;
  155.                         camera.offsetCenter(distanceX - CAMERA_WIDTH, 0);
  156.                 }
  157.                 else if ((distanceX < -TURN_PAGE_DISTANCE) && (page < LEVEL_PAGES - 1))
  158.                 {
  159.                         Log.d(TAG, "下翻一页");
  160.                         page++;
  161.                         camera.offsetCenter(distanceX + CAMERA_WIDTH, 0);
  162.                 }
  163.                 else
  164.                 {
  165.                         Log.d(TAG, "不翻");
  166.                         camera.offsetCenter(distanceX, 0);
  167.                 }
  168.         }
  169.  
  170.         /**
  171.          * 创建HUD层
  172.          */
  173.         private void createHUD()
  174.         {
  175.                 // 不用考虑层
  176.                 hud = new HUD();
  177.                 Rectangle hudBox = new Rectangle(20, 700, 80, 80, getVertexBufferObjectManager())
  178.                 {
  179.                         @Override
  180.                         public boolean onAreaTouched(TouchEvent pSceneTouchEvent, float pTouchAreaLocalX,
  181.                                         float pTouchAreaLocalY)
  182.                         {
  183.                                 // TODO Auto-generated method stub
  184.                                 if (pSceneTouchEvent.isActionUp())
  185.                                 {
  186.                                         runOnUiThread(new Runnable()
  187.                                         {
  188.                                                 @Override
  189.                                                 public void run()
  190.                                                 {
  191.                                                         // TODO Auto-generated method stub
  192.                                                         Toast.makeText(ScrollMenuActivity.this, "BACK", Toast.LENGTH_SHORT).show();
  193.                                                 }
  194.                                         });
  195.                                 }
  196.                                
  197.                                 return true;
  198.                         }
  199.                 };
  200.                 hudBox.setColor(Color.RED);
  201.                 hud.attachChild(hudBox);
  202.                 hud.registerTouchArea(hudBox);
  203.                 camera.setHUD(hud);
  204.         }
  205.        
  206.         /**
  207.          * 创建关卡盒子
  208.          */
  209.         private void createLevelBoxes()
  210.         {
  211.                 // 计算行间距
  212.                 int spaceBetweenRaws = (CAMERA_HEIGHT / LEVEL_ROWS_PER_SCREEN) - LEVEL_PADDING;
  213.                 // 计算列间距
  214.                 int spaceBetweenColumns = (CAMERA_WIDTH / LEVEL_COLUMNS_PER_SCREEN) - LEVEL_PADDING;
  215.  
  216.                 int level = 0;
  217.  
  218.                 int boxX = LEVEL_PADDING;
  219.                 int boxY = LEVEL_PADDING;
  220.                
  221.                 for (int i=0; i<LEVEL_PAGES; i++)
  222.                 {
  223.                         int startX = i * CAMERA_WIDTH;
  224.                        
  225.                         for (int j=0; j<LEVEL_ROWS_PER_SCREEN; j++)
  226.                         {
  227.                                 for (int k=0; k<LEVEL_COLUMNS_PER_SCREEN; k++)
  228.                                 {
  229.                                         final int levelToLoad = level;
  230.                                         Rectangle box = new Rectangle(startX + boxX, boxY, 100, 100, getVertexBufferObjectManager())
  231.                                         {
  232.                                                 @Override
  233.                                                 public boolean onAreaTouched(TouchEvent pSceneTouchEvent, float pTouchAreaLocalX,
  234.                                                                 float pTouchAreaLocalY)
  235.                                                 {
  236.                                                         // TODO Auto-generated method stub
  237.                                                         levelClicked = levelToLoad;
  238.                                                        
  239.                                                         return false;
  240.                                                 }
  241.                                         };
  242.                                         if (level >= maxLevelReached)
  243.                                         {
  244.                                                 box.setColor(0, 0, 0.9f);
  245.                                         }
  246.                                         else
  247.                                         {
  248.                                                 box.setColor(0, 0.9f, 0);
  249.                                         }
  250.                                         scene.attachChild(box);
  251.                                         scene.registerTouchArea(box);
  252.                                         int textOffX = 0;
  253.                                         if (level < 10)
  254.                                         {
  255.                                                 textOffX = 28;
  256.                                         }
  257.                                         else
  258.                                         {
  259.                                                 textOffX = 20;
  260.                                         }
  261.                                         box.attachChild(new Text(textOffX, 20, font, String.valueOf(level + 1), getVertexBufferObjectManager()));
  262.                                        
  263.                                         level++;
  264.                                         boxX += spaceBetweenColumns + LEVEL_PADDING;
  265.                                         if (level > LEVELS)
  266.                                         {
  267.                                                 break;
  268.                                         }
  269.                                 }
  270.                                 if (level > LEVELS)
  271.                                 {
  272.                                         break;
  273.                                 }
  274.                                 boxY += spaceBetweenRaws + LEVEL_PADDING;
  275.                                 boxX = LEVEL_PADDING;
  276.                         }
  277.                        
  278.                         boxY = LEVEL_PADDING;
  279.                 }
  280.         }
  281.  
  282.         /**
  283.          * 模拟显示等级载入
  284.          * @param level
  285.          */
  286.         private void loadLevel(final int level)
  287.         {
  288.                 if (level != -1)
  289.                 {
  290.                         runOnUiThread(new Runnable()
  291.                         {
  292.                                 @Override
  293.                                 public void run()
  294.                                 {
  295.                                         // TODO Auto-generated method stub
  296.                                         Toast.makeText(ScrollMenuActivity.this, "Loading the " + (level + 1) + " level!", Toast.LENGTH_SHORT)
  297.                                                         .show();
  298.                                 }
  299.                         });
  300.                 }
  301.         }
  302. }
  303.  
Parsed in 0.060 seconds, using GeSHi 1.0.8.4


Hope to help you!
Thanks!
onerain88
 
Posts: 8
Joined: Mon Feb 06, 2012 6:12 am

Re: Scroll Level Selector advanced

Postby kbarresi » Thu Aug 16, 2012 3:46 pm

Hi,

Just wanted to say thanks for this! I did notice that when swiping, the next page/previous page will be shifted horizontally by a few pixels. Working on a fix now :)
Help save the penguins! --Penguin Panic
User avatar
kbarresi
 
Posts: 93
Joined: Fri Aug 03, 2012 3:31 pm

Re: Scroll Level Selector advanced

Postby xastor » Fri Oct 19, 2012 10:05 pm

This is very nice.. thank you!
xastor
 
Posts: 8
Joined: Wed Oct 10, 2012 9:22 pm


Return to Tutorials

Who is online

Users browsing this forum: Exabot [Bot] and 24 guests