Project

General

Profile

Download (9.02 KB) Statistics
| Branch: | Tag: | Revision:

magiccube / src / main / java / org / distorted / effect / SizeChangeEffect.java @ 42772cff

1 434f2f5a Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2019 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Distorted.                                                               //
5
//                                                                                               //
6
// Distorted is free software: you can redistribute it and/or modify                             //
7
// it under the terms of the GNU General Public License as published by                          //
8
// the Free Software Foundation, either version 2 of the License, or                             //
9
// (at your option) any later version.                                                           //
10
//                                                                                               //
11
// Distorted is distributed in the hope that it will be useful,                                  //
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
14
// GNU General Public License for more details.                                                  //
15
//                                                                                               //
16
// You should have received a copy of the GNU General Public License                             //
17
// along with Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19
20
package org.distorted.effect;
21
22 584f7954 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
23
24 9208e27b Leszek Koltunski
import org.distorted.library.effect.Effect;
25 4fd9efa1 Leszek Koltunski
import org.distorted.library.main.DistortedEffects;
26 434f2f5a Leszek Koltunski
import org.distorted.library.main.DistortedScreen;
27
import org.distorted.library.message.EffectListener;
28
import org.distorted.magic.RubikCube;
29
30
import java.lang.reflect.Method;
31
32 584f7954 Leszek Koltunski
public abstract class SizeChangeEffect implements EffectListener
33
{
34 434f2f5a Leszek Koltunski
  public enum Type
35
    {
36 086a24d0 Leszek Koltunski
    NONE         (SizeChangeEffectNone.class        ),
37
    TRANSPARENCY (SizeChangeEffectTransparency.class),
38
    MOVE         (SizeChangeEffectMove.class        ),
39
    ROUND        (SizeChangeEffectRound.class       ),
40
    SCALE        (SizeChangeEffectScale.class       ),
41 f291130e Leszek Koltunski
    ;
42 434f2f5a Leszek Koltunski
43 086a24d0 Leszek Koltunski
    final Class<? extends SizeChangeEffect> effect;
44 434f2f5a Leszek Koltunski
45 086a24d0 Leszek Koltunski
    Type(Class<? extends SizeChangeEffect> effect)
46 434f2f5a Leszek Koltunski
      {
47 086a24d0 Leszek Koltunski
      this.effect= effect;
48 434f2f5a Leszek Koltunski
      }
49
    }
50
51 584f7954 Leszek Koltunski
  private static int NUM_EFFECTS = Type.values().length;
52 086a24d0 Leszek Koltunski
  private static final int NUM_PHASES  = 2;
53
  private static final int FAKE_EFFECT_ID  = -1;
54 b0a2ce63 Leszek Koltunski
  private static final Type[] types;
55
56
  static
57
    {
58
    int i=0;
59
    types = new Type[NUM_EFFECTS];
60
61
    for(Type type: Type.values())
62
      {
63 584f7954 Leszek Koltunski
      types[i++] = type;
64 b0a2ce63 Leszek Koltunski
      }
65
    }
66
67 9208e27b Leszek Koltunski
  private EffectListener mListener;
68 086a24d0 Leszek Koltunski
  private int mDuration;
69
  private int[] mEffectReturned;
70
  private int[] mCubeEffectNumber, mNodeEffectNumber;
71
  private int[] mEffectFinished;
72
  private boolean[] mPhaseActive;
73 c909b8e3 Leszek Koltunski
  private RubikCube[] mCube;
74 9208e27b Leszek Koltunski
75 4fd9efa1 Leszek Koltunski
  DistortedScreen mScreen;
76 086a24d0 Leszek Koltunski
  Effect[][] mCubeEffects;
77
  int[][] mCubeEffectPosition;
78
  Effect[][] mNodeEffects;
79
  int[][] mNodeEffectPosition;
80 9208e27b Leszek Koltunski
81
///////////////////////////////////////////////////////////////////////////////////////////////////
82
83 086a24d0 Leszek Koltunski
  SizeChangeEffect()
84 9208e27b Leszek Koltunski
    {
85 086a24d0 Leszek Koltunski
    mPhaseActive        = new boolean[NUM_PHASES];
86
    mEffectReturned     = new int[NUM_PHASES];
87
    mCubeEffectNumber   = new int[NUM_PHASES];
88
    mNodeEffectNumber   = new int[NUM_PHASES];
89
    mEffectFinished     = new int[NUM_PHASES];
90
    mCubeEffectPosition = new int[NUM_PHASES][];
91
    mNodeEffectPosition = new int[NUM_PHASES][];
92
    mCubeEffects        = new Effect[NUM_PHASES][];
93
    mNodeEffects        = new Effect[NUM_PHASES][];
94
    mCube               = new RubikCube[NUM_PHASES];
95 9208e27b Leszek Koltunski
    }
96
97 b0a2ce63 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
98
99 584f7954 Leszek Koltunski
  public static String[] getNames()
100 b0a2ce63 Leszek Koltunski
    {
101 584f7954 Leszek Koltunski
    String[] names = new String[NUM_EFFECTS];
102
103
    for( int i=0; i<NUM_EFFECTS; i++)
104
      {
105
      names[i] = types[i].name();
106
      }
107
108
    return names;
109 b0a2ce63 Leszek Koltunski
    }
110
111 584f7954 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
112
113 42772cff Leszek Koltunski
  public static SizeChangeEffect create(int ordinal) throws InstantiationException, IllegalAccessException
114 086a24d0 Leszek Koltunski
    {
115 42772cff Leszek Koltunski
    return types[ordinal].effect.newInstance();
116 086a24d0 Leszek Koltunski
    }
117
118
///////////////////////////////////////////////////////////////////////////////////////////////////
119
120
  abstract int createEffectsPhase0(int duration);
121
  abstract int createEffectsPhase1(int duration);
122 584f7954 Leszek Koltunski
123 9208e27b Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
124
125 f647630d Leszek Koltunski
  public void effectFinished(final long effectID)
126 9208e27b Leszek Koltunski
    {
127 086a24d0 Leszek Koltunski
    if( mPhaseActive[0] ) effectFinishedPhase(effectID,0);
128
    if( mPhaseActive[1] ) effectFinishedPhase(effectID,1);
129
    }
130
131
///////////////////////////////////////////////////////////////////////////////////////////////////
132
133
  private void effectFinishedPhase(final long effectID, int phase)
134
    {
135
    for(int i=0; i<mCubeEffectNumber[phase]; i++)
136 9208e27b Leszek Koltunski
      {
137 086a24d0 Leszek Koltunski
      long id = mCubeEffects[phase][i].getID();
138 f291130e Leszek Koltunski
139
      if( effectID == id )
140
        {
141 086a24d0 Leszek Koltunski
        effectReturned(phase);
142
        mCube[phase].remove(id);
143
        return;
144 f291130e Leszek Koltunski
        }
145 9208e27b Leszek Koltunski
      }
146 086a24d0 Leszek Koltunski
    for(int i=0; i<mNodeEffectNumber[phase]; i++)
147 4fd9efa1 Leszek Koltunski
      {
148 086a24d0 Leszek Koltunski
      long id = mNodeEffects[phase][i].getID();
149 4fd9efa1 Leszek Koltunski
150
      if( effectID == id )
151
        {
152 086a24d0 Leszek Koltunski
        effectReturned(phase);
153
        mCube[phase].getEffects().abortById(id);
154
        return;
155
        }
156
      }
157
    }
158 4fd9efa1 Leszek Koltunski
159 086a24d0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
160 4fd9efa1 Leszek Koltunski
161 086a24d0 Leszek Koltunski
  private void effectReturned(int phase)
162
    {
163
    mEffectReturned[phase]++;
164 4fd9efa1 Leszek Koltunski
165 086a24d0 Leszek Koltunski
    if( mEffectReturned[phase] == mEffectFinished[phase] )
166
      {
167
      switch(phase)
168
        {
169
        case 0: mPhaseActive[1] = true;
170
                mEffectFinished[1] = createEffectsPhase1(mDuration);
171
                assignEffects(1);
172
                mScreen.attach(mCube[1]);
173
                break;
174
        case 1: mListener.effectFinished(FAKE_EFFECT_ID);
175
                break;
176
        }
177
      }
178
    if( mEffectReturned[phase] == mCubeEffectNumber[phase]+mNodeEffectNumber[phase] )
179
      {
180
      switch(phase)
181
        {
182
        case 0: mPhaseActive[0] = false;
183
                mScreen.detach(mCube[0]);
184
                break;
185
        case 1: mPhaseActive[1] = false;
186
                break;
187 584f7954 Leszek Koltunski
        }
188 4fd9efa1 Leszek Koltunski
      }
189 9208e27b Leszek Koltunski
    }
190
191 434f2f5a Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
192
193 086a24d0 Leszek Koltunski
  public long start(int duration, DistortedScreen screen, RubikCube oldcube, RubikCube newcube, EffectListener listener)
194 9208e27b Leszek Koltunski
    {
195
    mScreen   = screen;
196 086a24d0 Leszek Koltunski
    mCube[0]  = oldcube;
197
    mCube[1]  = newcube;
198 9208e27b Leszek Koltunski
    mListener = listener;
199 086a24d0 Leszek Koltunski
    mDuration = duration;
200
201
    if( oldcube!=null )
202
      {
203
      mPhaseActive[0] = true;
204
      mEffectFinished[0] = createEffectsPhase0(mDuration);
205
      assignEffects(0);
206
      }
207
    else
208
      {
209
      mPhaseActive[1] = true;
210
      mEffectFinished[1] = createEffectsPhase1(mDuration);
211
      assignEffects(1);
212
      mScreen.attach(mCube[1]);
213
      }
214 9208e27b Leszek Koltunski
215 086a24d0 Leszek Koltunski
    return FAKE_EFFECT_ID;
216
    }
217 f291130e Leszek Koltunski
218 086a24d0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
219
220
  private void assignEffects(int phase)
221
    {
222
    mCubeEffectNumber[phase] = ( mCubeEffects[phase]!=null ) ? mCubeEffects[phase].length : 0;
223
    mNodeEffectNumber[phase] = ( mNodeEffects[phase]!=null ) ? mNodeEffects[phase].length : 0;
224 4fd9efa1 Leszek Koltunski
225 086a24d0 Leszek Koltunski
    if( mCubeEffectNumber[phase]==0 && mNodeEffectNumber[phase]==0 )
226 f291130e Leszek Koltunski
      {
227 086a24d0 Leszek Koltunski
      throw new RuntimeException("Cube and Node Effects ("+phase+" phase) both not created!");
228 f291130e Leszek Koltunski
      }
229
230 086a24d0 Leszek Koltunski
    for(int i=0; i<mCubeEffectNumber[phase]; i++)
231 f291130e Leszek Koltunski
      {
232 086a24d0 Leszek Koltunski
      mCube[phase].apply(mCubeEffects[phase][i],mCubeEffectPosition[phase][i]);
233
      mCubeEffects[phase][i].notifyWhenFinished(this);
234 4fd9efa1 Leszek Koltunski
      }
235
236 086a24d0 Leszek Koltunski
    DistortedEffects nodeEffects = mCube[phase].getEffects();
237 4fd9efa1 Leszek Koltunski
238 086a24d0 Leszek Koltunski
    for(int i=0; i<mNodeEffectNumber[phase]; i++)
239 4fd9efa1 Leszek Koltunski
      {
240 086a24d0 Leszek Koltunski
      nodeEffects.apply(mNodeEffects[phase][i],mNodeEffectPosition[phase][i]);
241
      mNodeEffects[phase][i].notifyWhenFinished(this);
242 f291130e Leszek Koltunski
      }
243 434f2f5a Leszek Koltunski
    }
244
245
///////////////////////////////////////////////////////////////////////////////////////////////////
246
247
  public static void enableEffects()
248
    {
249 a8cbefce Leszek Koltunski
    Method method;
250 434f2f5a Leszek Koltunski
251
    for(Type type: Type.values())
252
      {
253 584f7954 Leszek Koltunski
      try
254
        {
255 a8cbefce Leszek Koltunski
        method = type.effect.getDeclaredMethod("enable");  // enable not public, thus getDeclaredMethod
256 434f2f5a Leszek Koltunski
        }
257
      catch(NoSuchMethodException ex)
258
        {
259 a8cbefce Leszek Koltunski
        android.util.Log.e("SizeChangeEffect", type.effect.getSimpleName()+": exception getting method: "+ex.getMessage());
260
        method = null;
261 434f2f5a Leszek Koltunski
        }
262
263
      try
264
        {
265 a8cbefce Leszek Koltunski
        if( method!=null ) method.invoke(null);
266 434f2f5a Leszek Koltunski
        }
267
      catch(Exception ex)
268
        {
269 a8cbefce Leszek Koltunski
        android.util.Log.e("SizeChangeEffect", type.effect.getSimpleName()+": exception invoking method: "+ex.getMessage());
270 434f2f5a Leszek Koltunski
        }
271
      }
272
    }
273 584f7954 Leszek Koltunski
}