Project

General

Profile

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

magiccube / src / main / java / org / distorted / effect / DisappearEffect.java @ 5560eea9

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 9208e27b Leszek Koltunski
import org.distorted.library.effect.Effect;
23 434f2f5a Leszek Koltunski
import org.distorted.library.main.DistortedScreen;
24
import org.distorted.library.message.EffectListener;
25 9208e27b Leszek Koltunski
import org.distorted.library.message.EffectMessage;
26 434f2f5a Leszek Koltunski
import org.distorted.magic.RubikCube;
27
28
import java.lang.reflect.Method;
29
30
///////////////////////////////////////////////////////////////////////////////////////////////////
31
32 34747dd1 Leszek Koltunski
public abstract class DisappearEffect implements EffectListener
33 434f2f5a Leszek Koltunski
  {
34
  public enum Type
35
    {
36 34747dd1 Leszek Koltunski
    EMPTY         (DisappearEffectEmpty.class       ),
37
    TRANSPARENCY  (DisappearEffectTransparency.class),
38
    MOVE          (DisappearEffectMove.class        ),
39
    ROUND         (DisappearEffectRound.class       ),
40
    SCALE         (DisappearEffectScale.class       ),
41 f291130e Leszek Koltunski
    ;
42 434f2f5a Leszek Koltunski
43 34747dd1 Leszek Koltunski
    private final Class<? extends DisappearEffect> effectClass;
44 434f2f5a Leszek Koltunski
45 34747dd1 Leszek Koltunski
    Type(Class<? extends DisappearEffect> effectClass)
46 434f2f5a Leszek Koltunski
      {
47
      this.effectClass = effectClass;
48
      }
49
    }
50
51 f6fcf06a Leszek Koltunski
  public static final int NUM_EFFECTS = Type.values().length;
52 b0a2ce63 Leszek Koltunski
  private static final Type[] types;
53
54
  static
55
    {
56
    int i=0;
57
58
    types = new Type[NUM_EFFECTS];
59
60
    for(Type type: Type.values())
61
      {
62
      types[i] = type;
63
      i++;
64
      }
65
    }
66
67 34747dd1 Leszek Koltunski
  private final int FAKE_EFFECT_ID = -2;
68 f291130e Leszek Koltunski
69 34747dd1 Leszek Koltunski
  private int mCubeEffectNumber, mCubeEffectFinished, mCubeEffectReturned;
70 f291130e Leszek Koltunski
71 9208e27b Leszek Koltunski
  private EffectListener mListener;
72
  private DistortedScreen mScreen;
73 34747dd1 Leszek Koltunski
  private RubikCube mCube;
74 9208e27b Leszek Koltunski
75 34747dd1 Leszek Koltunski
  Effect[] mCubeEffects;
76
  int[] mCubeEffectPosition;
77 9208e27b Leszek Koltunski
78
///////////////////////////////////////////////////////////////////////////////////////////////////
79
80 34747dd1 Leszek Koltunski
  DisappearEffect()
81 9208e27b Leszek Koltunski
    {
82 34747dd1 Leszek Koltunski
    mCubeEffectReturned = 0;
83 9208e27b Leszek Koltunski
    }
84
85 34747dd1 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
86
87
  abstract int createEffects(int duration);
88
89 b0a2ce63 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
90
91
  public static Type getType(int ordinal)
92
    {
93
    return types[ordinal];
94
    }
95
96 9208e27b Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
97
98
  public void effectMessage(final EffectMessage em, final long effectID, final long objectID)
99
    {
100 34747dd1 Leszek Koltunski
    for(int i=0; i<mCubeEffectNumber; i++)
101 9208e27b Leszek Koltunski
      {
102 34747dd1 Leszek Koltunski
      long id = mCubeEffects[i].getID();
103 f291130e Leszek Koltunski
104
      if( effectID == id )
105
        {
106 34747dd1 Leszek Koltunski
        mCubeEffectReturned++;
107 f291130e Leszek Koltunski
108 34747dd1 Leszek Koltunski
        if( mCubeEffectReturned == mCubeEffectFinished )
109 f291130e Leszek Koltunski
          {
110 34747dd1 Leszek Koltunski
          mListener.effectMessage(null, FAKE_EFFECT_ID, 0);
111 f291130e Leszek Koltunski
          }
112
113 34747dd1 Leszek Koltunski
        if( mCubeEffectReturned == mCubeEffectNumber )
114 f291130e Leszek Koltunski
          {
115 34747dd1 Leszek Koltunski
          mScreen.detach(mCube);
116
          mCube.deregisterForMessages(this);
117 f291130e Leszek Koltunski
          }
118 34747dd1 Leszek Koltunski
119
        mCube.remove(id);
120 f291130e Leszek Koltunski
        break;
121
        }
122 9208e27b Leszek Koltunski
      }
123
    }
124
125 434f2f5a Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
126
127 aa8b36aa Leszek Koltunski
  public long start(int duration, DistortedScreen screen, RubikCube cube, EffectListener listener)
128 9208e27b Leszek Koltunski
    {
129
    mScreen   = screen;
130 34747dd1 Leszek Koltunski
    mCube     = cube;
131 9208e27b Leszek Koltunski
    mListener = listener;
132
133 aa8b36aa Leszek Koltunski
    mCubeEffectFinished = createEffects(duration);
134 f291130e Leszek Koltunski
135 34747dd1 Leszek Koltunski
    if( mCubeEffects!=null )
136 f291130e Leszek Koltunski
      {
137 34747dd1 Leszek Koltunski
      mCubeEffectNumber = mCubeEffects.length;
138 f291130e Leszek Koltunski
      }
139
    else
140
      {
141 34747dd1 Leszek Koltunski
      throw new RuntimeException("Disappear Cube Effects not created!");
142 f291130e Leszek Koltunski
      }
143
144 34747dd1 Leszek Koltunski
    for(int i=0; i<mCubeEffectNumber; i++)
145 f291130e Leszek Koltunski
      {
146 34747dd1 Leszek Koltunski
      mCube.apply(mCubeEffects[i],mCubeEffectPosition[i]);
147 f291130e Leszek Koltunski
      }
148 9208e27b Leszek Koltunski
149 34747dd1 Leszek Koltunski
    mCube.registerForMessages(this);
150 9208e27b Leszek Koltunski
151 f291130e Leszek Koltunski
    return FAKE_EFFECT_ID;
152 9208e27b Leszek Koltunski
    }
153 434f2f5a Leszek Koltunski
154
///////////////////////////////////////////////////////////////////////////////////////////////////
155
156 34747dd1 Leszek Koltunski
  public static DisappearEffect create(Type type) throws InstantiationException, IllegalAccessException
157 434f2f5a Leszek Koltunski
    {
158
    return type.effectClass.newInstance();
159
    }
160
161
///////////////////////////////////////////////////////////////////////////////////////////////////
162
163
  public static void enableEffects()
164
    {
165
    Method method=null;
166
167
    for(Type type: Type.values())
168
      {
169 34747dd1 Leszek Koltunski
      Class<? extends DisappearEffect> cls = type.effectClass;
170 434f2f5a Leszek Koltunski
171
      try
172
        {
173
        method = cls.getMethod("enable");
174
        }
175
      catch(NoSuchMethodException ex)
176
        {
177
        android.util.Log.e("transitionEffect", "exception getting method: "+ex.getMessage());
178
        }
179
180
      try
181
        {
182
        method.invoke(null);
183
        }
184
      catch(Exception ex)
185
        {
186
        android.util.Log.e("transitionEffect", "exception invoking method: "+ex.getMessage());
187
        }
188
      }
189
    }
190
  }