teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

付けたし

2016/06/10 02:31

投稿

nakamura-
nakamura-

スコア48

title CHANGED
File without changes
body CHANGED
@@ -10,4 +10,275 @@
10
10
  追記
11
11
  前回の質問
12
12
  カクカクな動きを改善する方法
13
- [リンク内容](https://teratail.com/questions/36609)
13
+ [リンク内容](https://teratail.com/questions/36609)
14
+
15
+
16
+
17
+ 桜の花びらが舞っているプログラム
18
+ ```ここに言語を入力
19
+ コード
20
+ public class MainActivity extends Activity{
21
+
22
+
23
+
24
+ int sakuraCount = 50; //表示する桜の枚数
25
+
26
+ Sakura sakura[] = new Sakura[sakuraCount];
27
+ CanvasView canvasview;
28
+
29
+ /**
30
+ * メインメソッド
31
+ */
32
+ @Override
33
+ protected void onCreate(Bundle savedInstanceState) {
34
+ super.onCreate(savedInstanceState);
35
+
36
+ canvasview = new CanvasView(this);
37
+ setContentView(canvasview);
38
+
39
+ sakuraCreate();
40
+ }
41
+
42
+
43
+ /**
44
+ * 桜インスタンス化・スレッド開始メソッド
45
+ */
46
+ public void sakuraCreate(){
47
+ Random rnd = new Random();
48
+
49
+ for(int i = 0; i < sakuraCount; i++){
50
+ sakura[i] =
51
+ new Sakura( (Math.random() * 800) - 100, 0,
52
+ rnd.nextInt(11) + 5, rnd.nextInt(100)*100,
53
+ Math.random() /*+ 1*/);
54
+
55
+ /*このクラスのcanvasviewがSakuraクラスのものと同値であると示す*/
56
+ sakura[i].setCanvasView(canvasview);
57
+ sakura[i].start();
58
+ }
59
+ /*このクラスのsakuraCountとSakuraがCanvasViewクラスのものと同値であると示す*/
60
+ canvasview.setSakuraCountAndSakura(sakuraCount, sakura);
61
+ }
62
+
63
+ }
64
+ ```
65
+
66
+ ```ここに言語を入力
67
+ コード
68
+ public class CanvasView extends SurfaceView
69
+ implements SurfaceHolder.Callback, Runnable{
70
+
71
+ int sakuraCount;
72
+ Sakura sakura[] = new Sakura[sakuraCount];
73
+
74
+ SurfaceHolder sHolder;
75
+ Thread thread;
76
+ boolean trueOrFalse;
77
+
78
+ /**
79
+ * CanvasViewクラスのコンストラクタ
80
+ */
81
+ public CanvasView(Context context){
82
+ super(context);
83
+
84
+ sHolder = getHolder();
85
+ sHolder.addCallback(this);
86
+ }
87
+
88
+ /**
89
+ * sakuraCountとsakura[]同値メソッド
90
+ */
91
+ public void setSakuraCountAndSakura(int sakuraCount, Sakura sakura[]){
92
+ this.sakuraCount = sakuraCount;
93
+ this.sakura =sakura;
94
+ }
95
+
96
+ /**
97
+ * SurfaceViewが生成されたときに呼ばれるメソッド
98
+ */
99
+ @Override
100
+ public void surfaceCreated(SurfaceHolder sHolder){
101
+ trueOrFalse = true;
102
+ thread = new Thread(this);
103
+ }
104
+
105
+ /**
106
+ * SurfaceViewの状態が変更されたときと
107
+ * 生成されたときも呼ばれるメソッド
108
+ */
109
+ @Override
110
+ public void surfaceChanged(SurfaceHolder holder,
111
+ int format, int width, int height){
112
+ thread.start();
113
+ }
114
+
115
+ /**
116
+ * SurfaceViewが破棄されるときに呼ばれるメソッド
117
+ */
118
+ @Override
119
+ public void surfaceDestroyed(SurfaceHolder holder){
120
+ trueOrFalse = false;
121
+
122
+ while(thread != null && thread.isAlive()){
123
+ thread = null;
124
+ };
125
+ }
126
+
127
+
128
+ /**
129
+ * run(描画)メソッド
130
+ */
131
+ public void run(){
132
+ while (trueOrFalse == true){
133
+ Canvas canvas = sHolder.lockCanvas();
134
+
135
+ if(canvas != null){
136
+ canvas.drawColor(Color.WHITE);
137
+
138
+ Path path = new Path();
139
+ for(int i = 0; i < sakuraCount; i++){
140
+ path.moveTo(sakura[i].Screen_vData[0][0], sakura[i].Screen_vData[0][1]);
141
+ path.quadTo(sakura[i].Screen_cData[0][0], sakura[i].Screen_cData[0][1], sakura[i].Screen_vData[1][0], sakura[i].Screen_vData[1][1]);
142
+ path.quadTo(sakura[i].Screen_cData[1][0], sakura[i].Screen_cData[1][1], sakura[i].Screen_vData[0][0], sakura[i].Screen_vData[0][1]);
143
+ canvas.drawPath(path, sakura[i].paint);
144
+ }
145
+ }
146
+ //Canvasのロックを解除する
147
+ sHolder.unlockCanvasAndPost(canvas);
148
+ }
149
+ }
150
+
151
+ }
152
+ ```
153
+
154
+ ```ここに言語を入力
155
+ コード
156
+ public class Sakura extends Thread{
157
+
158
+
159
+ CanvasView canvasview;
160
+ Paint paint = new Paint(); //Paintクラスをインスタンスごとに管理
161
+
162
+ int Vertex_data[][] = { { 1, 1, 0}, //点P0
163
+ { -1, -1, 0} }; //点P1
164
+ //頂点データ
165
+ float Screen_vData[][] = new float[2][3]; //表示頂点データ
166
+
167
+ int Control_data[][] = { {-1, 1, 0}, //点P0から点P1
168
+ { 1, -1, 0} }; //点P1から点P0
169
+ //曲線描くときのコントロールデータ
170
+ float Screen_cData[][] = new float[2][3]; //表示コントロールデータ
171
+
172
+ double pointX; //表示位置のx座標
173
+ double pointY; //表示位置のy座標
174
+ int scale; //描画倍数
175
+ int time; //開始時間
176
+ double distanceY; //移動距離
177
+
178
+ double phi; //x軸周りの回転角
179
+ double theta; //y軸周りの回転角
180
+
181
+ int select; //左右判定
182
+
183
+ Random rnd = new Random();
184
+
185
+
186
+
187
+ /*Sakuraクラスのコンストラクタ*/
188
+ public Sakura( double pointX, double pointY,
189
+ int scale, int time,
190
+ double distanceY){
191
+ this.pointX = pointX;
192
+ this.pointY = pointY;
193
+ this.scale = scale;
194
+ this.time = time;
195
+ this.distanceY = distanceY;
196
+
197
+ phi = 0;
198
+ theta = 0;
199
+
200
+ //左右どちらに動くか判定
201
+ select = rnd.nextInt(2) + 1;
202
+
203
+ paint.setColor(Color.MAGENTA ); //色設定
204
+ paint.setStrokeWidth(1); //線の太さ設定
205
+ paint.setAntiAlias(true); //滑らかに書く
206
+ paint.setStyle(Paint.Style.FILL); //塗りつぶし
207
+ }
208
+
209
+
210
+ /*runメソッド・時間繰り返し処理(startメソッドの後に呼び出される)*/
211
+ public void run(){
212
+ //開始時間設定
213
+ try{
214
+ Thread.sleep(time);
215
+ }
216
+ catch(InterruptedException e){
217
+ }
218
+
219
+ for(int i = 0; i < 100000; i++){
220
+ try{
221
+ Thread.sleep(5);
222
+ }
223
+ catch(InterruptedException e){
224
+ }
225
+
226
+ if(select == 1){
227
+ pointX += (Math.random() * 1);
228
+ }
229
+ else{
230
+ pointX -= (Math.random() * 1);
231
+ }
232
+
233
+ phi += Math.PI / (rnd.nextInt(101) + 30); //角度変更処理
234
+ theta += Math.PI / (rnd.nextInt(101) + 30); //角度変更処理
235
+ pointY += distanceY; //落下処理
236
+
237
+ setRotPosition();
238
+ }
239
+ }
240
+
241
+
242
+ /*回転後、座標を更新するメソッド*/
243
+ public void setRotPosition(){
244
+ //回転後の頂点座標
245
+ for(int i = 0; i < Vertex_data.length; i++){
246
+ double rvx = Vertex_data[i][0] * Math.cos(theta) +
247
+ Vertex_data[i][2] * Math.sin(theta);
248
+ double rvy = Vertex_data[i][0] * Math.sin(phi) * Math.sin(theta) +
249
+ Vertex_data[i][1] * Math.cos(phi) -
250
+ Vertex_data[i][2] * Math.cos(phi) * Math.cos(theta);
251
+ double rvz = - Vertex_data[i][0] * Math.cos(phi) * Math.sin(theta) +
252
+ Vertex_data[i][1] * Math.sin(phi) +
253
+ Vertex_data[i][2] * Math.cos(phi) * Math.cos(theta);
254
+
255
+ Screen_vData[i][0] = (float)(pointX + (rvx * scale));
256
+ Screen_vData[i][1] = (float)(pointY - (rvy * scale));
257
+ Screen_vData[i][2] = (float)(rvz * scale);
258
+ }
259
+
260
+ //回転後のコントロールデータ
261
+ for(int i = 0; i < Control_data.length; i++){
262
+ double rcx = Control_data[i][0] * Math.cos(theta) +
263
+ Control_data[i][2] * Math.sin(theta);
264
+ double rcy = Control_data[i][0] * Math.sin(phi) * Math.sin(theta) +
265
+ Control_data[i][1] * Math.cos(phi) -
266
+ Control_data[i][2] * Math.cos(phi) * Math.cos(theta);
267
+ double rcz = - Control_data[i][0] * Math.cos(phi) * Math.sin(theta) +
268
+ Control_data[i][1] * Math.sin(phi) +
269
+ Control_data[i][2] * Math.cos(phi) * Math.cos(theta);
270
+
271
+ Screen_cData[i][0] = (float)(pointX + (rcx * scale));
272
+ Screen_cData[i][1] = (float)(pointY - (rcy * scale));
273
+ Screen_cData[i][2] = (float)(rcz * scale);
274
+ }
275
+ }
276
+
277
+
278
+ /*canvasview同値メソッド*/
279
+ public void setCanvasView(CanvasView canvasview) {
280
+ this.canvasview = canvasview;
281
+ }
282
+
283
+ }
284
+ ```

2

手直し

2016/06/10 02:31

投稿

nakamura-
nakamura-

スコア48

title CHANGED
File without changes
body CHANGED
@@ -10,4 +10,4 @@
10
10
  追記
11
11
  前回の質問
12
12
  カクカクな動きを改善する方法
13
- https://teratail.com/questions/36609
13
+ [リンク内容](https://teratail.com/questions/36609)

1

付けたし

2016/06/10 02:13

投稿

nakamura-
nakamura-

スコア48

title CHANGED
File without changes
body CHANGED
@@ -5,4 +5,9 @@
5
5
  SurfaceView以上にカクカクを改善する方法はあるのでしょうか?
6
6
  それともSurfaceViewでカクカクするならプログラムを軽くするように改善するしかないのでしょうか?
7
7
 
8
- よろしくお願いします。
8
+ よろしくお願いします。
9
+
10
+ 追記
11
+ 前回の質問
12
+ カクカクな動きを改善する方法
13
+ https://teratail.com/questions/36609