AStarPathModifier

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

AStarPathModifier

Postby CaptnIgnit » Fri Aug 26, 2011 5:42 am

Made a few changes (made it more generalized) since I last posted the code but I think it'd be nice to have this as part of AndEngine. Basically took Nicholas' PathModifier and made it work with A* paths.

Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. package korkd.tower;
  2.  
  3. import org.anddev.andengine.entity.IEntity;
  4. import org.anddev.andengine.entity.modifier.EntityModifier;
  5. import org.anddev.andengine.entity.modifier.MoveModifier;
  6. import org.anddev.andengine.util.modifier.IModifier;
  7. import org.anddev.andengine.util.modifier.SequenceModifier;
  8. import org.anddev.andengine.util.modifier.SequenceModifier.ISubSequenceModifierListener;
  9. import org.anddev.andengine.util.modifier.ease.IEaseFunction;
  10. import org.anddev.andengine.util.path.Path;
  11.  
  12. import android.util.FloatMath;
  13.  
  14. public class AStarPathModifier extends EntityModifier {
  15.         // ===========================================================
  16.         // Constants
  17.         // ===========================================================
  18.  
  19.         // ===========================================================
  20.         // Fields
  21.         // ===========================================================
  22.  
  23.         private final SequenceModifier<IEntity> mSequenceModifier;
  24.  
  25.         private IAStarPathModifierListener mPathModifierListener;
  26.  
  27.         private final Path mPath;
  28.  
  29.         private int[] mTileDimensions;
  30.  
  31.         // ===========================================================
  32.         // Constructors
  33.         // ===========================================================
  34.  
  35.         public AStarPathModifier(final float pDuration, final Path pPath, final int[] pTileDimensions) {
  36.                 this(pDuration, pPath, pTileDimensions, null, null, IEaseFunction.DEFAULT);
  37.         }
  38.  
  39.         public AStarPathModifier(final float pDuration, final Path pPath, final int[] pTileDimensions, final IEaseFunction pEaseFunction) {
  40.                 this(pDuration, pPath, pTileDimensions, null, null, pEaseFunction);
  41.         }
  42.  
  43.         public AStarPathModifier(final float pDuration, final Path pPath, final int[] pTileDimensions, final IEntityModifierListener pEntityModiferListener) {
  44.                 this(pDuration, pPath, pTileDimensions, pEntityModiferListener, null, IEaseFunction.DEFAULT);
  45.         }
  46.  
  47.         public AStarPathModifier(final float pDuration, final Path pPath, final int[] pTileDimensions, final IAStarPathModifierListener pPathModifierListener) {
  48.                 this(pDuration, pPath, pTileDimensions, null, pPathModifierListener, IEaseFunction.DEFAULT);
  49.         }
  50.  
  51.         public AStarPathModifier(final float pDuration, final Path pPath, final int[] pTileDimensions, final IAStarPathModifierListener pPathModifierListener, final IEaseFunction pEaseFunction) {
  52.                 this(pDuration, pPath, pTileDimensions, null, pPathModifierListener, pEaseFunction);
  53.         }
  54.  
  55.         public AStarPathModifier(final float pDuration, final Path pPath, final int[] pTileDimensions, final IEntityModifierListener pEntityModiferListener, final IEaseFunction pEaseFunction) {
  56.                 this(pDuration, pPath, pTileDimensions, pEntityModiferListener, null, pEaseFunction);
  57.         }
  58.  
  59.         public AStarPathModifier(final float pDuration, final Path pPath, final int[] pTileDimensions, final IEntityModifierListener pEntityModiferListener, final IAStarPathModifierListener pPathModifierListener) throws IllegalArgumentException {
  60.                 this(pDuration, pPath, pTileDimensions, pEntityModiferListener, pPathModifierListener, IEaseFunction.DEFAULT);
  61.         }
  62.  
  63.         public AStarPathModifier(final float pDuration, final Path pPath, final int[] pTileDimensions, final IEntityModifierListener pEntityModiferListener, final IAStarPathModifierListener pPathModifierListener, final IEaseFunction pEaseFunction) throws IllegalArgumentException {
  64.                 super(pEntityModiferListener);
  65.                 final int pathSize = pPath.getLength();
  66.  
  67.                 if (pathSize < 2) {
  68.                         throw new IllegalArgumentException("Path needs at least 2 waypoints!");
  69.                 }
  70.                
  71.                 int pathLength = 0;
  72.                
  73.                 // Get the length of the path in coordinates
  74.                 for(int i=1; i < pathSize; i++)
  75.                 {
  76.                         if(pPath.getTileColumn(i) > pPath.getTileColumn(i-1))
  77.                         {
  78.                                 pathLength += pTileDimensions[0];
  79.                         }
  80.                         else
  81.                         {
  82.                                 pathLength += pTileDimensions[1];
  83.                         }
  84.                 }
  85.  
  86.                 this.mTileDimensions = pTileDimensions;
  87.                 this.mPath = pPath;
  88.                 this.mPathModifierListener = pPathModifierListener;
  89.  
  90.                 final MoveModifier[] moveModifiers = new MoveModifier[pathSize - 1];
  91.  
  92.                 final float velocity = pathLength / pDuration;
  93.  
  94.                 final int modifierCount = moveModifiers.length;
  95.                 for(int i = 0; i < modifierCount; i++) {
  96.                         final float duration = getSegmentLength(i) / velocity;
  97.                         moveModifiers[i] = new MoveModifier(duration, getXCoordinates(i), getXCoordinates(i + 1), getYCoordinates(i), getYCoordinates(i + 1), null, pEaseFunction);
  98.                 }
  99.  
  100.                 /* Create a new SequenceModifier and register the listeners that
  101.                  * call through to mEntityModifierListener and mPathModifierListener. */
  102.                 this.mSequenceModifier = new SequenceModifier<IEntity>(
  103.                                 new ISubSequenceModifierListener<IEntity>() {
  104.                                         @Override
  105.                                         public void onSubSequenceStarted(final IModifier<IEntity> pModifier, final IEntity pEntity, final int pIndex) {
  106.                                                 if(pIndex < pathSize)
  107.                                 {
  108.                                         switch(pPath.getDirectionToNextStep(pIndex)) {
  109.                                             case DOWN:
  110.                                                 if(AStarPathModifier.this.mPathModifierListener != null) {
  111.                                                                                 AStarPathModifier.this.mPathModifierListener.onNextMoveDown(AStarPathModifier.this, pEntity, pIndex);
  112.                                                                         }
  113.                                                 break;
  114.                                             case RIGHT:
  115.                                                 if(AStarPathModifier.this.mPathModifierListener != null) {
  116.                                                                                 AStarPathModifier.this.mPathModifierListener.onNextMoveRight(AStarPathModifier.this, pEntity, pIndex);
  117.                                                                         }
  118.                                             break;
  119.                                             case UP:
  120.                                                 if(AStarPathModifier.this.mPathModifierListener != null) {
  121.                                                                                 AStarPathModifier.this.mPathModifierListener.onNextMoveUp(AStarPathModifier.this, pEntity, pIndex);
  122.                                                                         }
  123.                                             break;
  124.                                             case LEFT:
  125.                                                 if(AStarPathModifier.this.mPathModifierListener != null) {
  126.                                                                                 AStarPathModifier.this.mPathModifierListener.onNextMoveLeft(AStarPathModifier.this, pEntity, pIndex);
  127.                                                                         }
  128.                                                 break;
  129.                                                 default:
  130.                                                                
  131.                                     }
  132.                                 }
  133.                                                
  134.                                                 if(AStarPathModifier.this.mPathModifierListener != null) {
  135.                                                         AStarPathModifier.this.mPathModifierListener.onPathWaypointStarted(AStarPathModifier.this, pEntity, pIndex);
  136.                                                 }
  137.                                         }
  138.  
  139.                                         @Override
  140.                                         public void onSubSequenceFinished(final IModifier<IEntity> pEntityModifier, final IEntity pEntity, final int pIndex) {
  141.                                                 if(AStarPathModifier.this.mPathModifierListener != null) {
  142.                                                         AStarPathModifier.this.mPathModifierListener.onPathWaypointFinished(AStarPathModifier.this, pEntity, pIndex);
  143.                                                 }
  144.                                         }
  145.                                 },
  146.                                 new IEntityModifierListener() {
  147.                                         @Override
  148.                                         public void onModifierStarted(final IModifier<IEntity> pModifier, final IEntity pEntity) {
  149.                                                 AStarPathModifier.this.onModifierStarted(pEntity);
  150.                                                 if(AStarPathModifier.this.mPathModifierListener != null) {
  151.                                                         AStarPathModifier.this.mPathModifierListener.onPathStarted(AStarPathModifier.this, pEntity);
  152.                                                 }
  153.                                         }
  154.  
  155.                                         @Override
  156.                                         public void onModifierFinished(final IModifier<IEntity> pEntityModifier, final IEntity pEntity) {
  157.                                                 AStarPathModifier.this.onModifierFinished(pEntity);
  158.                                                 if(AStarPathModifier.this.mPathModifierListener != null) {
  159.                                                         AStarPathModifier.this.mPathModifierListener.onPathFinished(AStarPathModifier.this, pEntity);
  160.                                                 }
  161.                                         }
  162.                                 },
  163.                                 moveModifiers
  164.                 );
  165.         }
  166.  
  167.         private float getXCoordinates(int pIndex) {
  168.                 return mPath.getStep(pIndex).getTileColumn() * mTileDimensions[0];
  169.         }
  170.  
  171.         private float getYCoordinates(int pIndex) {
  172.                 return mPath.getStep(pIndex).getTileRow() * mTileDimensions[1];
  173.         }
  174.        
  175.         private float getSegmentLength(int pIndex) {
  176.  
  177.         final int nextSegmentIndex = pIndex + 1;
  178.  
  179.         final float dx = getXCoordinates(pIndex) - getXCoordinates(nextSegmentIndex);
  180.         final float dy = getYCoordinates(pIndex) - getYCoordinates(nextSegmentIndex);
  181.  
  182.         return FloatMath.sqrt(dx * dx + dy * dy);
  183.         }
  184.  
  185.         protected AStarPathModifier(final AStarPathModifier pPathModifier) throws CloneNotSupportedException  {
  186.                 this.mPath = new Path();
  187.                 for(int i=0;i<pPathModifier.getPath().getLength();i++)
  188.                 {
  189.                         this.mPath.append(pPathModifier.getPath().getStep(i));
  190.                 }
  191.                 this.mSequenceModifier = pPathModifier.mSequenceModifier.clone();
  192.         }
  193.        
  194.         @Override
  195.         public AStarPathModifier clone() throws CloneNotSupportedException {
  196.                 return new AStarPathModifier(this);
  197.         }
  198.  
  199.         // ===========================================================
  200.         // Getter & Setter
  201.         // ===========================================================
  202.  
  203.         public Path getPath() {
  204.                 return this.mPath;
  205.         }
  206.  
  207.         // ===========================================================
  208.         // Methods for/from SuperClass/Interfaces
  209.         // ===========================================================
  210.  
  211.         @Override
  212.         public boolean isFinished() {
  213.                 return this.mSequenceModifier.isFinished();
  214.         }
  215.  
  216.         @Override
  217.         public float getSecondsElapsed() {
  218.                 return this.mSequenceModifier.getSecondsElapsed();
  219.         }
  220.  
  221.         @Override
  222.         public float getDuration() {
  223.                 return this.mSequenceModifier.getDuration();
  224.         }
  225.  
  226.         public IAStarPathModifierListener getPathModifierListener() {
  227.                 return this.mPathModifierListener;
  228.         }
  229.  
  230.         public void setPathModifierListener(final IAStarPathModifierListener pPathModifierListener) {
  231.                 this.mPathModifierListener = pPathModifierListener;
  232.         }
  233.  
  234.         @Override
  235.         public void reset() {
  236.                 this.mSequenceModifier.reset();
  237.         }
  238.  
  239.         @Override
  240.         public float onUpdate(final float pSecondsElapsed, final IEntity pEntity) {
  241.                 return this.mSequenceModifier.onUpdate(pSecondsElapsed, pEntity);
  242.         }
  243.  
  244.         // ===========================================================
  245.         // Methods
  246.         // ===========================================================
  247.  
  248.         // ===========================================================
  249.         // Inner and Anonymous Classes
  250.         // ===========================================================
  251.  
  252.         public static interface IAStarPathModifierListener {
  253.                 // ===========================================================
  254.                 // Constants
  255.                 // ===========================================================
  256.  
  257.                 // ===========================================================
  258.                 // Fields
  259.                 // ===========================================================
  260.  
  261.                 public void onPathStarted(final AStarPathModifier pPathModifier, final IEntity pEntity);
  262.                 public void onNextMoveLeft(AStarPathModifier aStarPathModifier, IEntity pEntity, int pIndex);
  263.                 public void onNextMoveUp(AStarPathModifier aStarPathModifier, IEntity pEntity, int pIndex);
  264.                 public void onNextMoveRight(AStarPathModifier aStarPathModifier, IEntity pEntity, int pIndex);
  265.                 public void onNextMoveDown(AStarPathModifier aStarPathModifier, IEntity pEntity, int pIndex);
  266.                 public void onPathWaypointStarted(final AStarPathModifier pPathModifier, final IEntity pEntity, final int pWaypointIndex);
  267.                 public void onPathWaypointFinished(final AStarPathModifier pPathModifier, final IEntity pEntity, final int pWaypointIndex);
  268.                 public void onPathFinished(final AStarPathModifier pPathModifier, final IEntity pEntity);
  269.         }
  270. }
  271.  
Parsed in 0.026 seconds, using GeSHi 1.0.8.4
CaptnIgnit
 
Posts: 87
Joined: Tue Feb 01, 2011 5:10 am

Re: AStarPathModifier

Postby rizzythedon » Sun Jan 29, 2012 2:55 am

I get a error :(

The type AStarPathModifier must implement the inherited abstract method IEntityModifier.deepCopy() to override BaseModifier<IEntity>.deepCopy()

any fix?
Games with AndEngine:
## Flop Ball [new]
## Tiny Elite Commando
## Copter
and more... click link and play
Market Link: https://market.android.com/developer?pub=Fihox
rizzythedon
 
Posts: 90
Joined: Thu Dec 22, 2011 2:45 am

Re: AStarPathModifier

Postby dsswift » Sun Jan 29, 2012 8:03 am

this is deepCopy's declaration:
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. @Override
  2.         public abstract IModifier<T> deepCopy() throws DeepCopyNotSupportedException;
  3.  
Parsed in 0.010 seconds, using GeSHi 1.0.8.4


Instead of using
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. IModifier<IEntity> deepCopy()
  2.  
Parsed in 0.010 seconds, using GeSHi 1.0.8.4


try this
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. @Override
  2.         public IEntityModifier deepCopy()
  3.                         throws org.anddev.andengine.util.modifier.IModifier.DeepCopyNotSupportedException {
  4.        
  5.                 return null;
  6.         }
  7.  
Parsed in 0.011 seconds, using GeSHi 1.0.8.4
dsswift
 
Posts: 5
Joined: Sat Jan 28, 2012 9:01 pm


Return to Features

Who is online

Users browsing this forum: No registered users and 5 guests