ParallaxLayer for GLES2

  ... the case you feel the need for a new feature or want to submit one.

ParallaxLayer for GLES2

Postby bluegreen12 » Sun Sep 21, 2014 4:22 am

I spent a while getting the old ParallaxLayer to work on GLES2 - AnchorCenter, and I also made it play nice with a zoomCamera. The main change is that it now works with the change to coordinates.

Another new feature is that you can set a zoomFactor from 0 to 1, where 0 is an object very far away from the camera and 1 is an object that follows the camera precisely. What this means is an object with 0 will not scale when you zoom in and will (almost) not appear to move in the y when you pan up and down. An object with 1 will scale fully when you zoom in and will move with the camera precisely. An object with .5 will land in the middle of these two effects.

ParallaxEntity is no longer a static class and requires an instance of ParallaxLayer so you can get its X and Y (which means setting X and Y on parallaxEntity works). Individual ParallaxEntities also have an X and Y offset, but I'm not using the x offset at all currently.

I'm kind of burn out on getting this to work, so I won't update it even though it's messy... but it might prove useful to someone looking for it to work with the GLES2-AnchorCenter Branch. If you guys want to mess with it, feel free.

Here is the link to the original thread since I won't take credit for the original version [http://www.andengine.org/forums/features/parallaxlayer-t5390.html]

Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. public class ParallaxLayer extends Entity {
  2.         // ===========================================================
  3.         // Constants
  4.         // ===========================================================
  5.  
  6.         // ===========================================================
  7.         // Fields
  8.         // ===========================================================
  9.  
  10.         private final ArrayList<ParallaxEntity> mParallaxEntities = new ArrayList<ParallaxEntity>();
  11.         private int mParallaxEntityCount;
  12.  
  13.         protected float mParallaxValue;
  14.         protected float mParallaxScrollValue;
  15.        
  16.         protected float mParallaxChangePerSecond;
  17.        
  18.         protected float mParallaxScrollFactor = 0.2f;
  19.        
  20.         private Camera mCamera;
  21.        
  22.         private float mCameraPreviousX;
  23.         private float mCameraOffsetX;
  24.        
  25.         private float   mLevelWidth = 0;
  26.        
  27.         private boolean mIsScrollable = false;
  28.  
  29.        
  30.         // ===========================================================
  31.         // Constructors
  32.         // ===========================================================
  33.         public ParallaxLayer() {
  34.         }
  35.  
  36.         public ParallaxLayer(final Camera camera, final boolean mIsScrollable){
  37.                 this.mCamera = camera;
  38.                 this.mIsScrollable = mIsScrollable;
  39.                
  40.                 mCameraPreviousX = camera.getCenterX();
  41.         }
  42.        
  43.         public ParallaxLayer(final Camera camera, final boolean mIsScrollable, final int mLevelWidth){
  44.                 this.mCamera = camera;
  45.                 this.mIsScrollable = mIsScrollable;
  46.                 this.mLevelWidth = mLevelWidth;
  47.                
  48.                 mCameraPreviousX = camera.getCenterX();
  49.         }
  50.        
  51.         // ===========================================================
  52.         // Getter & Setter
  53.         // ===========================================================
  54.  
  55.         public void setParallaxValue(final float pParallaxValue) {
  56.                 this.mParallaxValue = pParallaxValue;
  57.         }
  58.        
  59.         public void setParallaxChangePerSecond(final float pParallaxChangePerSecond) {
  60.                 this.mParallaxChangePerSecond = pParallaxChangePerSecond;
  61.         }
  62.  
  63.         public void setParallaxScrollFactor(final float pParallaxScrollFactor){
  64.                 this.mParallaxScrollFactor = pParallaxScrollFactor;
  65.         }
  66.        
  67.         // ===========================================================
  68.         // Methods for/from SuperClass/Interfaces
  69.         // ===========================================================
  70.         @Override
  71.         public void onManagedDraw(GLState pGLState, Camera pCamera) {
  72.                 super.preDraw(pGLState, pCamera);
  73.  
  74.                
  75.                 final float parallaxValue = this.mParallaxValue;
  76.                 final float parallaxScrollValue = this.mParallaxScrollValue;
  77.                 final ArrayList<ParallaxEntity> parallaxEntities = this.mParallaxEntities;
  78.  
  79.                 for(int i = 0; i < this.mParallaxEntityCount; i++) {
  80.                         if(parallaxEntities.get(i).mIsScrollable){
  81.                                 parallaxEntities.get(i).onDraw(pGLState, pCamera, parallaxScrollValue, mLevelWidth);
  82.                         } else {
  83.                                 parallaxEntities.get(i).onDraw(pGLState, pCamera, parallaxValue, mLevelWidth);
  84.                         }
  85.  
  86.                 }
  87.         }
  88.        
  89.         @Override
  90.         protected void onManagedUpdate(float pSecondsElapsed) {
  91.                
  92.                 if(mIsScrollable && mCameraPreviousX != this.mCamera.getCenterX()){
  93.                                 mCameraOffsetX = mCameraPreviousX - this.mCamera.getCenterX();
  94.                                 mCameraPreviousX = this.mCamera.getCenterX();
  95.                                
  96.                                 this.mParallaxScrollValue += mCameraOffsetX * this.mParallaxScrollFactor;
  97.                                 mCameraOffsetX = 0;
  98.                 }
  99.                
  100.                 this.mParallaxValue += this.mParallaxChangePerSecond * pSecondsElapsed;
  101.                 super.onManagedUpdate(pSecondsElapsed);
  102.         }
  103.  
  104.         // ===========================================================
  105.         // Methods
  106.         // ===========================================================
  107.  
  108.         public void attachParallaxEntity(final ParallaxEntity parallaxEntity) {
  109.                 this.mParallaxEntities.add(parallaxEntity);
  110.                 this.mParallaxEntityCount++;
  111.         }
  112.  
  113.         public boolean detachParallaxEntity(final ParallaxEntity pParallaxEntity) {
  114.                 this.mParallaxEntityCount--;
  115.                 final boolean success = this.mParallaxEntities.remove(pParallaxEntity);
  116.                 if(!success) {
  117.                         this.mParallaxEntityCount++;
  118.                 }
  119.                 return success;
  120.         }
  121.        
  122.         // ===========================================================
  123.         // Inner and Anonymous Classes
  124.         // ===========================================================
  125.  
  126.         public class ParallaxEntity {
  127.                 // ===========================================================
  128.                 // Constants
  129.                 // ===========================================================
  130.  
  131.                 // ===========================================================
  132.                 // Fields
  133.                 // ===========================================================
  134.  
  135.                 final float mZoomFactor; //0 means it doesn't zoom with the camera, 1 means it zooms exactly with the camera
  136.                 final float mParallaxFactor;
  137.                 final IShape mAreaShape;
  138.                 final boolean mIsScrollable;
  139.                
  140.                 final float mXOffset;
  141.                 final float mYOffset;
  142.                
  143.                 final float mReduceFrequency;
  144.  
  145.                 // ===========================================================
  146.                 // Constructors
  147.                 // ===========================================================
  148.                
  149.                
  150.                 public ParallaxEntity(final float pParallaxFactor, final float pZoomFactor, final IShape pAreaShape, float pXOffset, float pYOffset) {
  151.                         this(pParallaxFactor, pZoomFactor, pAreaShape, false, pXOffset, pYOffset, 1.0f);
  152.                 }
  153.                
  154.                 public ParallaxEntity(final float pParallaxFactor, final float pZoomFactor, final IShape pAreaShape, final boolean mIsScrollable, float pXOffset, float pYOffset) {
  155.                         this(pParallaxFactor, pZoomFactor, pAreaShape, mIsScrollable, pXOffset, pYOffset, 1.0f);
  156.                 }
  157.                
  158.                 public ParallaxEntity(final float pParallaxFactor, final float pZoomFactor, final IShape pAreaShape, final boolean mIsScrollable, float pXOffset, float pYOffset, final float pReduceFrequency) {
  159.                         this.mParallaxFactor = pParallaxFactor;
  160.                         this.mZoomFactor = pZoomFactor;
  161.                         this.mAreaShape = pAreaShape;
  162.                         this.mIsScrollable = mIsScrollable;
  163.                        
  164.                         this.mXOffset = pXOffset;
  165.                         this.mYOffset = pYOffset;
  166.                         this.mReduceFrequency = pReduceFrequency;
  167.                 }
  168.  
  169.                 // ===========================================================
  170.                 // Getter & Setter
  171.                 // ===========================================================
  172.  
  173.                 // ===========================================================
  174.                 // Methods for/from SuperClass/Interfaces
  175.                 // ===========================================================
  176.  
  177.                 // ===========================================================
  178.                 // Methods
  179.                 // ===========================================================
  180.  
  181.                 public void onDraw(final GLState pGLState, final Camera pCamera, final float pParallaxValue, final float mLevelWidth) {
  182.                         pGLState.pushModelViewGLMatrix();
  183.                         {
  184.                                 float widthRange;
  185.                                 float cameraZoom = 1;
  186.                                
  187.                                 if(mLevelWidth != 0){
  188.                                         widthRange = mLevelWidth;
  189.                                 } else {
  190.                                         widthRange = pCamera.getWidth();
  191.                                 }      
  192.                                
  193.                                 if(pCamera instanceof ZoomCamera){
  194.                                         cameraZoom = ((ZoomCamera)pCamera).getZoomFactor();
  195.                                 }
  196.                                
  197.                                 //set scale based on zoomFactor
  198.                                 float areaShapeScale = (1 - mZoomFactor)*(1/cameraZoom) + (mZoomFactor)*(1.0f);
  199.                                 //mitigate the "move" effect that a zoom has if the object is far away
  200.                                 float scaleCenterY
  201.                                         = (1 - mZoomFactor)*((pCamera.getHeight() * cameraZoom - getY() + mYOffset)/(pCamera.getHeight() * cameraZoom))
  202.                                                 + (mZoomFactor) * 0.5f;
  203.                                 mAreaShape.setScale(areaShapeScale);
  204.                                 mAreaShape.setScaleCenter(0.5f, scaleCenterY);
  205.                                
  206.                                
  207.                                 float shapeWidthScaled = this.mAreaShape.getWidth() * this.mAreaShape.getScaleX() * mReduceFrequency;
  208.                                
  209.                                 float baseXOffset = (pParallaxValue * this.mParallaxFactor) % shapeWidthScaled
  210.                                                 + (pCamera.getCenterX() - widthRange/2 + getX() + mXOffset);
  211.                                 baseXOffset -= (widthRange/2 * (cameraZoom - 1));
  212.                                
  213.                                 //for things that are far away leave the y more static
  214.                                 //for things that are close, set it to this.getY() to move it along with the camera
  215.                                 float yLoc = (pCamera.getCenterY() - (pCamera.getHeight() * cameraZoom/2)) * (1 - mZoomFactor) + getY() + mYOffset;
  216.                                
  217.  
  218.                                 while(baseXOffset - shapeWidthScaled/2 > pCamera.getCenterX() - widthRange/2) {
  219.                                         baseXOffset -= shapeWidthScaled;
  220.                                 }
  221.                                 pGLState.translateModelViewGLMatrixf(baseXOffset, yLoc, 0);
  222.  
  223.                                 float currentMaxX = baseXOffset;
  224.                                
  225.                                 do {
  226.                                         this.mAreaShape.onDraw(pGLState, pCamera);
  227.                                         pGLState.translateModelViewGLMatrixf(shapeWidthScaled - 1, 0, 0);
  228.                                         currentMaxX += shapeWidthScaled;
  229.                                 } while(currentMaxX - shapeWidthScaled/2 < pCamera.getCenterX() + widthRange/2);
  230.                         }
  231.                         pGLState.popModelViewGLMatrix();
  232.                 }
  233.  
  234.                 // ===========================================================
  235.                 // Inner and Anonymous Classes
  236.                 // ===========================================================
  237.         }
  238.  
  239.  
  240. }
  241.  
Parsed in 0.024 seconds, using GeSHi 1.0.8.4
bluegreen12
 
Posts: 1
Joined: Sun Sep 21, 2014 4:07 am

Return to Features

Who is online

Users browsing this forum: No registered users and 3 guests