質問編集履歴

3

付けたし

2016/06/10 02:31

投稿

nakamura-
nakamura-

スコア48

test CHANGED
File without changes
test CHANGED
@@ -23,3 +23,545 @@
23
23
  カクカクな動きを改善する方法
24
24
 
25
25
  [リンク内容](https://teratail.com/questions/36609)
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+ 桜の花びらが舞っているプログラム
34
+
35
+ ```ここに言語を入力
36
+
37
+ コード
38
+
39
+ public class MainActivity extends Activity{
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+ int sakuraCount = 50; //表示する桜の枚数
48
+
49
+
50
+
51
+ Sakura sakura[] = new Sakura[sakuraCount];
52
+
53
+ CanvasView canvasview;
54
+
55
+
56
+
57
+ /**
58
+
59
+ * メインメソッド
60
+
61
+ */
62
+
63
+ @Override
64
+
65
+ protected void onCreate(Bundle savedInstanceState) {
66
+
67
+ super.onCreate(savedInstanceState);
68
+
69
+
70
+
71
+ canvasview = new CanvasView(this);
72
+
73
+ setContentView(canvasview);
74
+
75
+
76
+
77
+ sakuraCreate();
78
+
79
+ }
80
+
81
+
82
+
83
+
84
+
85
+ /**
86
+
87
+ * 桜インスタンス化・スレッド開始メソッド
88
+
89
+ */
90
+
91
+ public void sakuraCreate(){
92
+
93
+ Random rnd = new Random();
94
+
95
+
96
+
97
+ for(int i = 0; i < sakuraCount; i++){
98
+
99
+ sakura[i] =
100
+
101
+ new Sakura( (Math.random() * 800) - 100, 0,
102
+
103
+ rnd.nextInt(11) + 5, rnd.nextInt(100)*100,
104
+
105
+ Math.random() /*+ 1*/);
106
+
107
+
108
+
109
+ /*このクラスのcanvasviewがSakuraクラスのものと同値であると示す*/
110
+
111
+ sakura[i].setCanvasView(canvasview);
112
+
113
+ sakura[i].start();
114
+
115
+ }
116
+
117
+ /*このクラスのsakuraCountとSakuraがCanvasViewクラスのものと同値であると示す*/
118
+
119
+ canvasview.setSakuraCountAndSakura(sakuraCount, sakura);
120
+
121
+ }
122
+
123
+
124
+
125
+ }
126
+
127
+ ```
128
+
129
+
130
+
131
+ ```ここに言語を入力
132
+
133
+ コード
134
+
135
+ public class CanvasView extends SurfaceView
136
+
137
+ implements SurfaceHolder.Callback, Runnable{
138
+
139
+
140
+
141
+ int sakuraCount;
142
+
143
+ Sakura sakura[] = new Sakura[sakuraCount];
144
+
145
+
146
+
147
+ SurfaceHolder sHolder;
148
+
149
+ Thread thread;
150
+
151
+ boolean trueOrFalse;
152
+
153
+
154
+
155
+ /**
156
+
157
+ * CanvasViewクラスのコンストラクタ
158
+
159
+ */
160
+
161
+ public CanvasView(Context context){
162
+
163
+ super(context);
164
+
165
+
166
+
167
+ sHolder = getHolder();
168
+
169
+ sHolder.addCallback(this);
170
+
171
+ }
172
+
173
+
174
+
175
+ /**
176
+
177
+ * sakuraCountとsakura[]同値メソッド
178
+
179
+ */
180
+
181
+ public void setSakuraCountAndSakura(int sakuraCount, Sakura sakura[]){
182
+
183
+ this.sakuraCount = sakuraCount;
184
+
185
+ this.sakura =sakura;
186
+
187
+ }
188
+
189
+
190
+
191
+ /**
192
+
193
+ * SurfaceViewが生成されたときに呼ばれるメソッド
194
+
195
+ */
196
+
197
+ @Override
198
+
199
+ public void surfaceCreated(SurfaceHolder sHolder){
200
+
201
+ trueOrFalse = true;
202
+
203
+ thread = new Thread(this);
204
+
205
+ }
206
+
207
+
208
+
209
+ /**
210
+
211
+ * SurfaceViewの状態が変更されたときと
212
+
213
+ * 生成されたときも呼ばれるメソッド
214
+
215
+ */
216
+
217
+ @Override
218
+
219
+ public void surfaceChanged(SurfaceHolder holder,
220
+
221
+ int format, int width, int height){
222
+
223
+ thread.start();
224
+
225
+ }
226
+
227
+
228
+
229
+ /**
230
+
231
+ * SurfaceViewが破棄されるときに呼ばれるメソッド
232
+
233
+ */
234
+
235
+ @Override
236
+
237
+ public void surfaceDestroyed(SurfaceHolder holder){
238
+
239
+ trueOrFalse = false;
240
+
241
+
242
+
243
+ while(thread != null && thread.isAlive()){
244
+
245
+ thread = null;
246
+
247
+ };
248
+
249
+ }
250
+
251
+
252
+
253
+
254
+
255
+ /**
256
+
257
+ * run(描画)メソッド
258
+
259
+ */
260
+
261
+ public void run(){
262
+
263
+ while (trueOrFalse == true){
264
+
265
+ Canvas canvas = sHolder.lockCanvas();
266
+
267
+
268
+
269
+ if(canvas != null){
270
+
271
+ canvas.drawColor(Color.WHITE);
272
+
273
+
274
+
275
+ Path path = new Path();
276
+
277
+ for(int i = 0; i < sakuraCount; i++){
278
+
279
+ path.moveTo(sakura[i].Screen_vData[0][0], sakura[i].Screen_vData[0][1]);
280
+
281
+ 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]);
282
+
283
+ 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]);
284
+
285
+ canvas.drawPath(path, sakura[i].paint);
286
+
287
+ }
288
+
289
+ }
290
+
291
+ //Canvasのロックを解除する
292
+
293
+ sHolder.unlockCanvasAndPost(canvas);
294
+
295
+ }
296
+
297
+ }
298
+
299
+
300
+
301
+ }
302
+
303
+ ```
304
+
305
+
306
+
307
+ ```ここに言語を入力
308
+
309
+ コード
310
+
311
+ public class Sakura extends Thread{
312
+
313
+
314
+
315
+
316
+
317
+ CanvasView canvasview;
318
+
319
+ Paint paint = new Paint(); //Paintクラスをインスタンスごとに管理
320
+
321
+
322
+
323
+ int Vertex_data[][] = { { 1, 1, 0}, //点P0
324
+
325
+ { -1, -1, 0} }; //点P1
326
+
327
+ //頂点データ
328
+
329
+ float Screen_vData[][] = new float[2][3]; //表示頂点データ
330
+
331
+
332
+
333
+ int Control_data[][] = { {-1, 1, 0}, //点P0から点P1
334
+
335
+ { 1, -1, 0} }; //点P1から点P0
336
+
337
+ //曲線描くときのコントロールデータ
338
+
339
+ float Screen_cData[][] = new float[2][3]; //表示コントロールデータ
340
+
341
+
342
+
343
+ double pointX; //表示位置のx座標
344
+
345
+ double pointY; //表示位置のy座標
346
+
347
+ int scale; //描画倍数
348
+
349
+ int time; //開始時間
350
+
351
+ double distanceY; //移動距離
352
+
353
+
354
+
355
+ double phi; //x軸周りの回転角
356
+
357
+ double theta; //y軸周りの回転角
358
+
359
+
360
+
361
+ int select; //左右判定
362
+
363
+
364
+
365
+ Random rnd = new Random();
366
+
367
+
368
+
369
+
370
+
371
+
372
+
373
+ /*Sakuraクラスのコンストラクタ*/
374
+
375
+ public Sakura( double pointX, double pointY,
376
+
377
+ int scale, int time,
378
+
379
+ double distanceY){
380
+
381
+ this.pointX = pointX;
382
+
383
+ this.pointY = pointY;
384
+
385
+ this.scale = scale;
386
+
387
+ this.time = time;
388
+
389
+ this.distanceY = distanceY;
390
+
391
+
392
+
393
+ phi = 0;
394
+
395
+ theta = 0;
396
+
397
+
398
+
399
+ //左右どちらに動くか判定
400
+
401
+ select = rnd.nextInt(2) + 1;
402
+
403
+
404
+
405
+ paint.setColor(Color.MAGENTA ); //色設定
406
+
407
+ paint.setStrokeWidth(1); //線の太さ設定
408
+
409
+ paint.setAntiAlias(true); //滑らかに書く
410
+
411
+ paint.setStyle(Paint.Style.FILL); //塗りつぶし
412
+
413
+ }
414
+
415
+
416
+
417
+
418
+
419
+ /*runメソッド・時間繰り返し処理(startメソッドの後に呼び出される)*/
420
+
421
+ public void run(){
422
+
423
+ //開始時間設定
424
+
425
+ try{
426
+
427
+ Thread.sleep(time);
428
+
429
+ }
430
+
431
+ catch(InterruptedException e){
432
+
433
+ }
434
+
435
+
436
+
437
+ for(int i = 0; i < 100000; i++){
438
+
439
+ try{
440
+
441
+ Thread.sleep(5);
442
+
443
+ }
444
+
445
+ catch(InterruptedException e){
446
+
447
+ }
448
+
449
+
450
+
451
+ if(select == 1){
452
+
453
+ pointX += (Math.random() * 1);
454
+
455
+ }
456
+
457
+ else{
458
+
459
+ pointX -= (Math.random() * 1);
460
+
461
+ }
462
+
463
+
464
+
465
+ phi += Math.PI / (rnd.nextInt(101) + 30); //角度変更処理
466
+
467
+ theta += Math.PI / (rnd.nextInt(101) + 30); //角度変更処理
468
+
469
+ pointY += distanceY; //落下処理
470
+
471
+
472
+
473
+ setRotPosition();
474
+
475
+ }
476
+
477
+ }
478
+
479
+
480
+
481
+
482
+
483
+ /*回転後、座標を更新するメソッド*/
484
+
485
+ public void setRotPosition(){
486
+
487
+ //回転後の頂点座標
488
+
489
+ for(int i = 0; i < Vertex_data.length; i++){
490
+
491
+ double rvx = Vertex_data[i][0] * Math.cos(theta) +
492
+
493
+ Vertex_data[i][2] * Math.sin(theta);
494
+
495
+ double rvy = Vertex_data[i][0] * Math.sin(phi) * Math.sin(theta) +
496
+
497
+ Vertex_data[i][1] * Math.cos(phi) -
498
+
499
+ Vertex_data[i][2] * Math.cos(phi) * Math.cos(theta);
500
+
501
+ double rvz = - Vertex_data[i][0] * Math.cos(phi) * Math.sin(theta) +
502
+
503
+ Vertex_data[i][1] * Math.sin(phi) +
504
+
505
+ Vertex_data[i][2] * Math.cos(phi) * Math.cos(theta);
506
+
507
+
508
+
509
+ Screen_vData[i][0] = (float)(pointX + (rvx * scale));
510
+
511
+ Screen_vData[i][1] = (float)(pointY - (rvy * scale));
512
+
513
+ Screen_vData[i][2] = (float)(rvz * scale);
514
+
515
+ }
516
+
517
+
518
+
519
+ //回転後のコントロールデータ
520
+
521
+ for(int i = 0; i < Control_data.length; i++){
522
+
523
+ double rcx = Control_data[i][0] * Math.cos(theta) +
524
+
525
+ Control_data[i][2] * Math.sin(theta);
526
+
527
+ double rcy = Control_data[i][0] * Math.sin(phi) * Math.sin(theta) +
528
+
529
+ Control_data[i][1] * Math.cos(phi) -
530
+
531
+ Control_data[i][2] * Math.cos(phi) * Math.cos(theta);
532
+
533
+ double rcz = - Control_data[i][0] * Math.cos(phi) * Math.sin(theta) +
534
+
535
+ Control_data[i][1] * Math.sin(phi) +
536
+
537
+ Control_data[i][2] * Math.cos(phi) * Math.cos(theta);
538
+
539
+
540
+
541
+ Screen_cData[i][0] = (float)(pointX + (rcx * scale));
542
+
543
+ Screen_cData[i][1] = (float)(pointY - (rcy * scale));
544
+
545
+ Screen_cData[i][2] = (float)(rcz * scale);
546
+
547
+ }
548
+
549
+ }
550
+
551
+
552
+
553
+
554
+
555
+ /*canvasview同値メソッド*/
556
+
557
+ public void setCanvasView(CanvasView canvasview) {
558
+
559
+ this.canvasview = canvasview;
560
+
561
+ }
562
+
563
+
564
+
565
+ }
566
+
567
+ ```

2

手直し

2016/06/10 02:31

投稿

nakamura-
nakamura-

スコア48

test CHANGED
File without changes
test CHANGED
@@ -22,4 +22,4 @@
22
22
 
23
23
  カクカクな動きを改善する方法
24
24
 
25
- https://teratail.com/questions/36609
25
+ [リンク内容](https://teratail.com/questions/36609)

1

付けたし

2016/06/10 02:13

投稿

nakamura-
nakamura-

スコア48

test CHANGED
File without changes
test CHANGED
@@ -13,3 +13,13 @@
13
13
 
14
14
 
15
15
  よろしくお願いします。
16
+
17
+
18
+
19
+ 追記
20
+
21
+ 前回の質問
22
+
23
+ カクカクな動きを改善する方法
24
+
25
+ https://teratail.com/questions/36609