OSDN Git Service

00f5bf330d38dd9394e634f83719c54b929f96db
[jugglemaster/source.git] / workspace / JuggleMaster / src / com / jm / JuggleView.java
1 package com.jm;\r
2 \r
3 import javax.microedition.khronos.opengles.GL10;\r
4 \r
5 import android.os.Bundle;\r
6 import android.view.MotionEvent;\r
7 \r
8 import com.jm.db.Dao;\r
9 import com.jm.opengl.JuggleDrawer;\r
10 import com.jm.opengl.OpenGLActivityBase;\r
11 import com.jm.utility.JmException;\r
12 import com.jm.utility.Resource;\r
13 \r
14 public class JuggleView extends OpenGLActivityBase {\r
15     private static final float FPS_NUM = 0.0f;\r
16         private static JuggleDrawer drawer = null;\r
17         \r
18         private int tx = -1;\r
19         private int ty = -1;\r
20         private int rr = -1;\r
21         \r
22         public static void init(){\r
23                 drawer = null;\r
24         }\r
25         \r
26         public JuggleView() {\r
27         super(FPS_NUM + Resource.speed * 3, true);        \r
28         }\r
29 \r
30     @Override\r
31     public void onCreate(Bundle savedInstanceState) {\r
32         super.onCreate(savedInstanceState);\r
33         //setContentView(R.layout.juggleview);        \r
34     }\r
35     \r
36         protected void update(){\r
37                 if (drawer == null){\r
38                         return;\r
39                 }\r
40                 drawer.update();\r
41         }\r
42         \r
43         protected void draw(GL10 gl){\r
44                 if (drawer == null){\r
45                         return;\r
46                 }\r
47                 drawer.draw(gl);\r
48         }\r
49         \r
50         @Override\r
51         public void onSurfaceChanged(GL10 gl, int width, int height) {\r
52                 super.onSurfaceChanged(gl, width, height);\r
53                 \r
54                 if (drawer != null){\r
55                         return;\r
56                 }\r
57                 \r
58             Bundle extras = getIntent().getExtras();\r
59                 try {\r
60                         JmPattern jp = null;\r
61                         int id = extras.getInt("ID");\r
62                         if (id >= 0) {\r
63                                 JmPattern[] list = Dao.getInstance().getFromId(id);\r
64                                 if (list.length <= 0) {\r
65                                         throw new JmException();\r
66                                 }\r
67                                 jp = list[0];\r
68                         } else {\r
69                                 jp = (JmPattern) extras.getSerializable("PATTERN");\r
70                         }\r
71                         \r
72                         drawer = new JuggleDrawer(this, jp);\r
73                         drawer.clear();\r
74                 } catch (JmException e) {\r
75                         showDialog(this, e);\r
76                 } catch (Exception e) {\r
77                         showDialog(this, e);\r
78                 }\r
79         }\r
80 \r
81         @Override\r
82         public boolean onTouchEvent(MotionEvent event) {\r
83                 if (drawer == null){\r
84                         return true;\r
85                 }\r
86                 int type = event.getAction();\r
87                 int count = event.getPointerCount();\r
88                 \r
89                 switch (type){\r
90                 case MotionEvent.ACTION_DOWN:\r
91                         tx = -1;\r
92                         ty = -1;\r
93                         rr = -1;\r
94                         break;\r
95                 case MotionEvent.ACTION_MOVE:\r
96                         int history = event.getHistorySize() / count;\r
97                         \r
98                         for (int i = 0; i < history; i++){\r
99                                 int index1 = event.findPointerIndex(0);\r
100                                 int index2 = event.findPointerIndex(1);\r
101 \r
102                                 if (index1 >= 0 && index2 >= 0){\r
103                                         int ux1 = (int) event.getHistoricalX(index1, i);\r
104                                         int uy1 = (int) event.getHistoricalY(index1, i);\r
105                                         int ux2 = (int) event.getHistoricalX(index2, i);\r
106                                         int uy2 = (int) event.getHistoricalY(index2, i);\r
107                                         int ss = (ux1 - ux2) * (ux1 - ux2) + (uy1 - uy2) * (uy1 - uy2);\r
108                                         if (rr >= 0){\r
109                                                 float drr = rotateR(rr, ss);\r
110                                                 if (drr != 0){\r
111                                                         drawer.rotate(0, 0, drr);                                               \r
112                                                 }\r
113                                         }\r
114                                         rr = ss;                                        \r
115                                 }\r
116                                 else if (index1 >= 0 || index2 >= 0){\r
117                                         int index;\r
118                                         if (index1 >= 0){\r
119                                                 index = index1;\r
120                                         }\r
121                                         else {\r
122                                                 index = index2;\r
123                                         }\r
124                                         \r
125                                         int ux = (int) event.getHistoricalX(index, i);\r
126                                         int uy = (int) event.getHistoricalY(index, i);\r
127                                         if (tx >= 0) {\r
128                                                 float rx = rotateXY(tx, ux);\r
129                                                 float ry = rotateXY(ty, uy);\r
130                                                 if (rx != 0 || ry != 0) {\r
131                                                         drawer.rotate(rx, ry, 0);\r
132                                                 }\r
133                                         }\r
134                                         tx = ux;\r
135                                         ty = uy;\r
136                                         rr = -1;\r
137                                 }\r
138                         }\r
139                         int index1 = event.findPointerIndex(0);\r
140                         int index2 = event.findPointerIndex(1);\r
141                         if (index1 >= 0 && index2 >= 0){\r
142                                 int ux1 = (int) event.getX(index1);\r
143                                 int uy1 = (int) event.getY(index1);\r
144                                 int ux2 = (int) event.getX(index2);\r
145                                 int uy2 = (int) event.getY(index2);\r
146                                 int ss = (ux1 - ux2) * (ux1 - ux2) + (uy1 - uy2) * (uy1 - uy2);\r
147                                 if (rr >= 0){\r
148                                         float drr = rotateR(rr, ss);\r
149                                         if (drr != 0){\r
150                                                 drawer.rotate(0, 0, drr);                                               \r
151                                         }\r
152                                 }\r
153                                 rr = ss;\r
154                         }\r
155                         else if (index1 >= 0 || index2 >= 0){\r
156                                 int index;\r
157                                 if (index1 >= 0){\r
158                                         index = index1;\r
159                                 }\r
160                                 else {\r
161                                         index = index2;\r
162                                 }\r
163                                 \r
164                                 int ux = (int) event.getX(index);\r
165                                 int uy = (int) event.getY(index);\r
166                                 if (tx >= 0) {\r
167                                         float rx = rotateXY(tx, ux);\r
168                                         float ry = rotateXY(ty, uy);\r
169                                         if (rx != 0 || ry != 0) {\r
170                                                 drawer.rotate(rx, ry, 0);\r
171                                         }\r
172                                 }\r
173                                 tx = ux;\r
174                                 ty = uy;\r
175                                 rr = -1;\r
176                         }\r
177                         break;\r
178                 }\r
179                 \r
180                 return true;\r
181         }\r
182         \r
183         private float rotateXY(int src, int dst){\r
184                 if (src > dst){\r
185                         return -0.02f;\r
186                 }\r
187                 else if (src < dst){\r
188                         return 0.02f;                   \r
189                 }\r
190                 else {\r
191                         return 0.0f;\r
192                 }\r
193         }\r
194 \r
195         private float rotateR(int src, int dst){\r
196                 if (src > dst){\r
197                         return -10.0f;\r
198                 }\r
199                 else if (src < dst){\r
200                         return 10.0f;                   \r
201                 }\r
202                 else {\r
203                         return 0.0f;\r
204                 }\r
205         }\r
206 }\r