Project

General

Profile

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

magiccube / src / main / java / org / distorted / effects / objectchange / ObjectChangeEffect.java @ 36b9ee93

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