Project

General

Profile

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

magiccube / src / main / java / org / distorted / effects / objectchange / ObjectChangeEffect.java @ 3f7a4363

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