Project

General

Profile

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

magiccube / src / main / java / org / distorted / effect / sizechange / SizeChangeEffect.java @ 64975793

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