From: ChadF <ch...@us...> - 2007-08-22 03:44:39
|
Update of /cvsroot/arianne/stendhal/src/games/stendhal/client/sprite In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv29510/src/games/stendhal/client/sprite Modified Files: AnimatedSprite.java TilesetAnimationMap.java TilesetGroupAnimationMap.java Log Message: Added custom delay support in animation config by using @<delay> after index(s). Index: TilesetAnimationMap.java =================================================================== RCS file: /cvsroot/arianne/stendhal/src/games/stendhal/client/sprite/TilesetAnimationMap.java,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** TilesetAnimationMap.java 15 Jul 2007 02:39:49 -0000 1.1 --- TilesetAnimationMap.java 22 Aug 2007 03:44:37 -0000 1.2 *************** *** 10,13 **** --- 10,14 ---- // + import java.util.Arrays; import java.util.HashMap; import java.util.Map; *************** *** 18,24 **** public class TilesetAnimationMap { /** * The map of tileset animations. */ ! protected Map<Integer, int []> animations; --- 19,30 ---- public class TilesetAnimationMap { /** + * The default frame delay (in ms). + */ + public static final int DEFAULT_DELAY = 500; + + /** * The map of tileset animations. */ ! protected Map<Integer, Mapping> animations; *************** *** 27,31 **** */ public TilesetAnimationMap() { ! animations = new HashMap<Integer, int []>(); } --- 33,37 ---- */ public TilesetAnimationMap() { ! animations = new HashMap<Integer, Mapping>(); } *************** *** 38,49 **** * Add a mapping of a tile index to animation frame indexes. * ! * <strong>NOTE: The array of frame indexes passed is not copied, ! * and should not be altered after this is called.</strong> * * @param index The tile index to map. * @param frameIndexes The indexes of frame tiles. */ ! public void add(final int index, final int [] frameIndexes) { ! animations.put(new Integer(index), frameIndexes); } --- 44,56 ---- * Add a mapping of a tile index to animation frame indexes. * ! * <strong>NOTE: The array of frame indexes/delays passed is not ! * copied, and should not be altered after this is called.</strong> * * @param index The tile index to map. * @param frameIndexes The indexes of frame tiles. + * @param frameDelays The frame delays (in ms). */ ! public void add(final int index, final int [] frameIndexes, final int [] frameDelays) { ! animations.put(new Integer(index), new Mapping(frameIndexes, frameDelays)); } *************** *** 56,67 **** * @param index The tile index to map. * @param frameIndexes The indexes of frame tiles. */ ! public void add(final int [] frameIndexes) { for(int i = 0; i < frameIndexes.length; i++) { int [] frames = new int[frameIndexes.length]; int tidx = i; for(int fidx = 0; fidx < frameIndexes.length; fidx++) { frames[fidx] = frameIndexes[tidx]; if(++tidx >= frameIndexes.length) { --- 63,85 ---- * @param index The tile index to map. * @param frameIndexes The indexes of frame tiles. + * @param frameDelays The frame delays (in ms). + * + * @throws IllegalArgumentException + * If the number of indexes and delays + * don't match. */ ! public void add(final int [] frameIndexes, final int [] frameDelays) { ! if(frameIndexes.length != frameDelays.length) { ! throw new IllegalArgumentException("Mismatched number of frame indexes and delays"); ! } ! for(int i = 0; i < frameIndexes.length; i++) { int [] frames = new int[frameIndexes.length]; + int [] delays = new int[frameIndexes.length]; int tidx = i; for(int fidx = 0; fidx < frameIndexes.length; fidx++) { frames[fidx] = frameIndexes[tidx]; + delays[fidx] = frameDelays[tidx]; if(++tidx >= frameIndexes.length) { *************** *** 70,74 **** } ! add(frameIndexes[i], frames); } } --- 88,92 ---- } ! add(frameIndexes[i], frames, delays); } } *************** *** 84,93 **** */ public Sprite getSprite(final Tileset tileset, final int index) { ! int [] frameIndexes = animations.get(new Integer(index)); ! if(frameIndexes == null) { return null; } Sprite [] frames = new Sprite[frameIndexes.length]; --- 102,114 ---- */ public Sprite getSprite(final Tileset tileset, final int index) { ! Mapping mapping = animations.get(new Integer(index)); ! if(mapping == null) { return null; } + int [] frameIndexes = mapping.getIndexes(); + int [] frameDelays = mapping.getDelays(); + Sprite [] frames = new Sprite[frameIndexes.length]; *************** *** 96,100 **** } ! return new AnimatedSprite(frames, 500L); } } --- 117,159 ---- } ! return new AnimatedSprite(frames, frameDelays, true, null); ! } ! ! // ! // ! ! /** ! * A frame indexes/delays mapping entry for an animated tile. ! */ ! protected static class Mapping { ! /** ! * The frame indexes. ! */ ! protected int [] indexes; ! ! /** ! * The frame delays. ! */ ! protected int [] delays; ! ! ! public Mapping(final int [] indexes, final int [] delays) { ! this.indexes = indexes; ! this.delays = delays; ! } ! ! ! // ! // Mapping ! // ! ! public int [] getDelays() { ! return delays; ! } ! ! ! public int [] getIndexes() { ! return indexes; ! } } } Index: TilesetGroupAnimationMap.java =================================================================== RCS file: /cvsroot/arianne/stendhal/src/games/stendhal/client/sprite/TilesetGroupAnimationMap.java,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** TilesetGroupAnimationMap.java 15 Jul 2007 02:39:49 -0000 1.1 --- TilesetGroupAnimationMap.java 22 Aug 2007 03:44:37 -0000 1.2 *************** *** 73,85 **** * Add a mapping of a tile index to animation frame indexes. * ! * <strong>NOTE: The array of frame indexes passed is not copied, ! * and should not be altered after this is called.</strong> * * @param name The name of the tileset. * @param index The tile index to map. * @param frameIndexes The indexes of frame tiles. */ ! public void add(final String name, final int index, final int [] frameIndexes) { ! acquire(name).add(index, frameIndexes); } --- 73,86 ---- * Add a mapping of a tile index to animation frame indexes. * ! * <strong>NOTE: The array of frame indexes/delays passed is not ! * copied, and should not be altered after this is called.</strong> * * @param name The name of the tileset. * @param index The tile index to map. * @param frameIndexes The indexes of frame tiles. + * @param frameDelays The delays of frame tiles. */ ! public void add(final String name, final int index, final int [] frameIndexes, int [] frameDelays) { ! acquire(name).add(index, frameIndexes, frameDelays); } *************** *** 90,102 **** * indexes as it's frames (in order, starting with it's index). * ! * <strong>NOTE: The array of frame indexes passed is not copied, ! * and should not be altered after this is called.</strong> * * @param name The name of the tileset. * @param index The tile index to map. * @param frameIndexes The indexes of frame tiles. */ ! public void add(final String name, final int [] frameIndexes) { ! acquire(name).add(frameIndexes); } --- 91,104 ---- * indexes as it's frames (in order, starting with it's index). * ! * <strong>NOTE: The array of frame indexes/delays passed is not ! * copied, and should not be altered after this is called.</strong> * * @param name The name of the tileset. * @param index The tile index to map. * @param frameIndexes The indexes of frame tiles. + * @param frameDelays The delays of frame tiles. */ ! public void add(final String name, final int [] frameIndexes, int [] frameDelays) { ! acquire(name).add(frameIndexes, frameDelays); } *************** *** 110,113 **** --- 112,118 ---- */ protected void addConfig(final String line) { + int pos; + int defaultDelay; + StringTokenizer st = new StringTokenizer(line, " \t"); *************** *** 132,135 **** --- 137,155 ---- String index = st.nextToken(); + if((pos = index.indexOf('@')) != -1) { + String val = index.substring(pos + 1); + index = index.substring(0, pos); + + try { + defaultDelay = Integer.parseInt(val); + } catch(NumberFormatException ex) { + logger.error("Invalid default delay: " + val); + return; + } + } else { + defaultDelay = TilesetAnimationMap.DEFAULT_DELAY; + } + + /* * Frame indexes *************** *** 148,155 **** int [] frameIndexes = new int[st.countTokens()]; for(int i = 0; i < frameIndexes.length; i++) { try { ! frameIndexes[i] = Integer.parseInt(st.nextToken()); } catch(NumberFormatException ex) { logger.error("Invalid frame #" + (i + 1) + ": " + line); --- 168,198 ---- int [] frameIndexes = new int[st.countTokens()]; + int [] frameDelays = new int[frameIndexes.length]; for(int i = 0; i < frameIndexes.length; i++) { + String frameIndex = st.nextToken(); + + /* + * Custom frame duration? + */ + if((pos = index.indexOf('@')) != -1) { + String val = frameIndex.substring(pos + 1); + frameIndex = frameIndex.substring(0, pos); + + try { + frameDelays[i] = Integer.parseInt(val); + } catch(NumberFormatException ex) { + logger.error("Invalid delay #" + (i + 1) + ": " + line); + return; + } + } else { + frameDelays[i] = defaultDelay; + } + + /* + * Frame index + */ try { ! frameIndexes[i] = Integer.parseInt(frameIndex); } catch(NumberFormatException ex) { logger.error("Invalid frame #" + (i + 1) + ": " + line); *************** *** 162,169 **** */ if(index.equals("*")) { ! add(name, frameIndexes); } else { try { ! add(name, Integer.parseInt(index), frameIndexes); } catch(NumberFormatException ex) { logger.error("Invalid tile index: " + line); --- 205,212 ---- */ if(index.equals("*")) { ! add(name, frameIndexes, frameDelays); } else { try { ! add(name, Integer.parseInt(index), frameIndexes, frameDelays); } catch(NumberFormatException ex) { logger.error("Invalid tile index: " + line); *************** *** 210,214 **** * Spaces may be any whitespace. The <em>index</em> may also be * <code>*</code>, which indicates that an entry should be added ! * using each frame as a mapped index. * * @param in The input stream. --- 253,261 ---- * Spaces may be any whitespace. The <em>index</em> may also be * <code>*</code>, which indicates that an entry should be added ! * using each frame as a mapped index. The mapped index or frame ! * index(s) maybe be appended by <code>@</code><em>delay</em>, ! * where <em>delay</em> is a value in milliseconds of for the ! * duration of the frame (or the default for all frames, if ! * specificed for mapped index). * * @param in The input stream. Index: AnimatedSprite.java =================================================================== RCS file: /cvsroot/arianne/stendhal/src/games/stendhal/client/sprite/AnimatedSprite.java,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** AnimatedSprite.java 21 Aug 2007 22:55:06 -0000 1.5 --- AnimatedSprite.java 22 Aug 2007 03:44:37 -0000 1.6 *************** *** 30,34 **** * The [minimum] frame durations. */ ! protected long [] delays; /** --- 30,34 ---- * The [minimum] frame durations. */ ! protected int [] delays; /** *************** *** 124,128 **** */ public AnimatedSprite(final Sprite [] frames, final long delay, final boolean animating, final Object reference) throws IllegalArgumentException { ! this(frames, createDelays(delay, frames.length), animating, reference); } --- 124,128 ---- */ public AnimatedSprite(final Sprite [] frames, final long delay, final boolean animating, final Object reference) throws IllegalArgumentException { ! this(frames, createDelays((int) delay, frames.length), animating, reference); } *************** *** 144,148 **** * the delay is < 0. */ ! public AnimatedSprite(final Sprite [] frames, final long [] delays, final boolean animating, final Object reference) throws IllegalArgumentException { if(frames.length == 0) { throw new IllegalArgumentException("Must have at least one frame"); --- 144,148 ---- * the delay is < 0. */ ! public AnimatedSprite(final Sprite [] frames, final int [] delays, final boolean animating, final Object reference) throws IllegalArgumentException { if(frames.length == 0) { throw new IllegalArgumentException("Must have at least one frame"); *************** *** 157,161 **** */ for(int i = 0; i < delays.length; i++) { ! if(delays[i] < 0L) { throw new IllegalArgumentException("Delay < 0"); } --- 157,161 ---- */ for(int i = 0; i < delays.length; i++) { ! if(delays[i] < 0) { throw new IllegalArgumentException("Delay < 0"); } *************** *** 196,201 **** * @return An array of delays. */ ! protected static long [] createDelays(final long delay, final int count) { ! long [] delays = new long[count]; Arrays.fill(delays, delay); --- 196,201 ---- * @return An array of delays. */ ! protected static int [] createDelays(final int delay, final int count) { ! int [] delays = new int[count]; Arrays.fill(delays, delay); *************** *** 212,216 **** * @return The minimum delays for each frame (in ms). */ ! public long [] getDelays() { return delays; } --- 212,216 ---- * @return The minimum delays for each frame (in ms). */ ! public int [] getDelays() { return delays; } |