質問編集履歴

11

更新

2016/09/30 15:07

投稿

kt.tk.co
kt.tk.co

スコア27

test CHANGED
File without changes
test CHANGED
@@ -539,3 +539,91 @@
539
539
  また、メモリの管理などの理解が足りないため、そのようなご指摘など頂けますと幸いです。
540
540
 
541
541
  何卒よろしくお願いいたします。
542
+
543
+
544
+
545
+
546
+
547
+ ■Island.classについて
548
+
549
+ Island.classの中身を記載いたします。
550
+
551
+ ライブラリに入っていた(?)ものだと思います。
552
+
553
+ .classの拡張子のファイルを扱うのは初めてで、内容を変更できないことなどに戸惑っています。
554
+
555
+ また、デバッグで呼び出されていることはわかったのですが、どこに保存されているのか、どこから呼び出されているのか がわかっておりません。
556
+
557
+
558
+
559
+ public void init(int bodyCapacity, int contactCapacity, int jointCapacity, ContactListener listener) {}
560
+
561
+ が呼び出された際に、「jointCapacity」などが引数として得られているようです。
562
+
563
+ ただ、どこで「jointCapacity」を決めてinit()が実行されているのでしょうか?
564
+
565
+
566
+
567
+ Island.class
568
+
569
+ 一部抜粋
570
+
571
+
572
+
573
+ ```Java
574
+
575
+
576
+
577
+ /* */ public class Island {
578
+
579
+ /* */ public ContactListener m_listener;
580
+
581
+ /* */ public Body[] m_bodies;
582
+
583
+ /* */ public Contact[] m_contacts;
584
+
585
+ /* */ public Joint[] m_joints;
586
+
587
+ /* */ public Position[] m_positions;
588
+
589
+ /* */ public Velocity[] m_velocities;
590
+
591
+ /* */ public int m_bodyCount;
592
+
593
+ /* */ public int m_jointCount;
594
+
595
+ /* */ public int m_contactCount;
596
+
597
+ /* */ public int m_bodyCapacity;
598
+
599
+ //~~省略~~
600
+
601
+
602
+
603
+ /* */ public void init(int bodyCapacity, int contactCapacity, int jointCapacity, ContactListener listener) {
604
+
605
+ /* 189 */ this.m_bodyCapacity = bodyCapacity;
606
+
607
+ /* 190 */ this.m_contactCapacity = contactCapacity;
608
+
609
+ /* 191 */ this.m_jointCapacity = jointCapacity;
610
+
611
+ /* 192 */ this.m_bodyCount = 0;
612
+
613
+ /* 193 */ this.m_contactCount = 0;
614
+
615
+ /* 194 */ this.m_jointCount = 0;
616
+
617
+
618
+
619
+ //~~省略~~
620
+
621
+
622
+
623
+ /* */ }
624
+
625
+ /* */ }
626
+
627
+
628
+
629
+ ```

10

更新

2016/09/30 15:07

投稿

kt.tk.co
kt.tk.co

スコア27

test CHANGED
File without changes
test CHANGED
@@ -484,10 +484,20 @@
484
484
 
485
485
 
486
486
 
487
+ ■ご回答頂いた内容についての補足
488
+
487
- ■生成済みのBodyやJointを入れる配列が問題かと考えテスト中です。
489
+ JointOfItem2Centerという配列につい、以下に詳細を記載致します。
488
490
 
489
491
  PhysicsWorld.javaで使えるグローバル変数として定義しております。
490
492
 
493
+
494
+
495
+ 現段階でのBodyの個数は6個です。(int ItemNum = 6; としました。)
496
+
497
+ Jointを削除する操作をしたいので、Joint型の配列に保存しました。
498
+
499
+
500
+
491
501
  ```Java
492
502
 
493
503
  //グローバル変数として定義
@@ -516,6 +526,10 @@
516
526
 
517
527
 
518
528
 
529
+ ■現在
530
+
531
+ 生成済みのBodyやJointを入れる配列が問題かと考えてテスト中です。
532
+
519
533
 
520
534
 
521
535
  ■おわりに

9

情報の更新

2016/09/30 14:56

投稿

kt.tk.co
kt.tk.co

スコア27

test CHANGED
File without changes
test CHANGED
@@ -482,6 +482,8 @@
482
482
 
483
483
 
484
484
 
485
+
486
+
485
487
  ■生成済みのBodyやJointを入れる配列が問題かと考えてテスト中です。
486
488
 
487
489
  PhysicsWorld.javaで使えるグローバル変数として定義しております。
@@ -516,6 +518,8 @@
516
518
 
517
519
 
518
520
 
521
+ ■おわりに
522
+
519
523
  上手く変数の引き渡しなどができないため、グローバル変数を多用してしまっている節があります。
520
524
 
521
525
  また、メモリの管理などの理解が足りないため、そのようなご指摘など頂けますと幸いです。

8

情報の更新

2016/09/30 14:54

投稿

kt.tk.co
kt.tk.co

スコア27

test CHANGED
File without changes
test CHANGED
@@ -424,11 +424,11 @@
424
424
 
425
425
 
426
426
 
427
- Bodyの生成やJointの生成を行うために関数を作ってあります。
427
+ Bodyの生成やJointの生成を行うために関数を作ってあります。
428
-
429
-
430
-
428
+
429
+
430
+
431
- Bodyの生成処理
431
+ Bodyの生成処理
432
432
 
433
433
  ```Java
434
434
 
@@ -458,7 +458,7 @@
458
458
 
459
459
 
460
460
 
461
- Jointの生成処理
461
+ Jointの生成処理
462
462
 
463
463
  ```Java
464
464
 
@@ -482,8 +482,42 @@
482
482
 
483
483
 
484
484
 
485
-
485
+ ■生成済みのBodyやJointを入れる配列が問題かと考えてテスト中です。
486
+
486
-
487
+ PhysicsWorld.javaで使えるグローバル変数として定義しております。
488
+
487
-
489
+ ```Java
490
+
491
+ //グローバル変数として定義
492
+
493
+
494
+
495
+ //アイテムの数だけ、Bodyを生成する。(識別して処理ができる)
496
+
497
+ Body body[] = new Body[ItemNum];
498
+
499
+
500
+
501
+ //アイテムの数だけ、Jointを生成する。(識別して処理ができる)
502
+
503
+ Joint JointOfItem2Center[] = new Joint[ItemNum]; //→Body(ゴンドラ)ごとに、画面の中心とのJoint情報を保存するため。(常にItemNum個で問題ないはずです。)
504
+
505
+
506
+
507
+ Joint JointOfItem2Item[] = new Joint[ItemNum]; //→Body(ゴンドラ)ごとに、隣りのBodyとJointした情報を保存するため。(常にItemNum個で問題ないはずです。)
508
+
509
+ ```
510
+
511
+
512
+
513
+ ![観覧車_補足](646fa8bc2c94fda58a2bc2c4372571b3.png)
514
+
515
+
516
+
517
+
518
+
519
+ 上手く変数の引き渡しなどができないため、グローバル変数を多用してしまっている節があります。
520
+
521
+ また、メモリの管理などの理解が足りないため、そのようなご指摘など頂けますと幸いです。
488
522
 
489
523
  何卒よろしくお願いいたします。

7

情報の更新

2016/09/30 14:53

投稿

kt.tk.co
kt.tk.co

スコア27

test CHANGED
File without changes
test CHANGED
@@ -12,9 +12,33 @@
12
12
 
13
13
 
14
14
 
15
-
15
+ 「Testing Box2D」のサンプルプログラムにコードを書き足して使用しております。
16
+
16
-
17
+ googleのplayストアはこちら
18
+
19
+ https://play.google.com/store/apps/details?id=pl.mg6.testing.box2d&hl=ja
20
+
21
+ サンプルコードはこちら
22
+
23
+ https://code.google.com/p/testing-box2d/
24
+
25
+
26
+
27
+
28
+
29
+ はじめに、物理演算BOX2Dで行いたい事は、観覧車のように中心を軸として回転する動作をさせるためです。
30
+
31
+ そのため、生成したBodyは観覧車のゴンドラのように、画面の中心を軸として回転します。
32
+
33
+ ![観覧車](0ce8f6d9af0cad02c74525edc5bf0a74.png)
34
+
35
+
36
+
37
+
38
+
39
+
40
+
17
- 複数のbody同士では当たり判定がないように設定してあり、重なり合うような状態にしてあります。
41
+ 複数のbody同士では当たり判定がないように設定してあり、実際には重なり合うような状態にしてあります。
18
42
 
19
43
  この複数のbodyの表示を、画面下にあるものほど最前面に表示させる処理を行いたいです。
20
44
 
@@ -158,6 +182,8 @@
158
182
 
159
183
  以下、コードとなります。
160
184
 
185
+ ※ここに記載してあるコードは、すべてPhysicsWorld.javaの変数・関数です。
186
+
161
187
 
162
188
 
163
189
  ```Java
@@ -394,4 +420,70 @@
394
420
 
395
421
 
396
422
 
423
+
424
+
425
+
426
+
427
+ Bodyの生成やJointの生成を行うために関数を作ってあります。
428
+
429
+
430
+
431
+ ■Bodyの生成処理
432
+
433
+ ```Java
434
+
435
+ MakeBody (String ItemWhich,float x,float y ,int MoveAble ,int RotationAble ,int CollisionAble) {
436
+
437
+ //String ItemWhich : どのアイテムを生成するか。(if文で判定して、画像や半径などを振り分けます。)
438
+
439
+ //float x : 生成するx座標
440
+
441
+ //float y : 生成するy座標
442
+
443
+ //int MoveAble : 移動できるかのFlag
444
+
445
+ //int RotationAble : Bodyを回転させるかのFlag
446
+
447
+ //int CollisionAble : 衝突できるかのFlag
448
+
449
+ ~省略~
450
+
451
+ MakedBody.createFixture(fixtureDef); //この処理で実際に生成する
452
+
453
+ return MakedBody;
454
+
455
+ }
456
+
457
+ ```
458
+
459
+
460
+
461
+ ■Jointの生成処理
462
+
463
+ ```Java
464
+
465
+ Joint JointBody(Body body1, Body body2 , String JointType ) {
466
+
467
+ //Body body1
468
+
469
+ //Body body2
470
+
471
+ //String JointType
472
+
473
+ ~省略~
474
+
475
+ MyJoint = world.createJoint(Joint情報); //この処理で実際に生成する
476
+
477
+ return MyJoint;
478
+
479
+ }
480
+
481
+ ```
482
+
483
+
484
+
485
+
486
+
487
+
488
+
397
489
  何卒よろしくお願いいたします。

6

変更

2016/09/30 14:47

投稿

kt.tk.co
kt.tk.co

スコア27

test CHANGED
File without changes
test CHANGED
@@ -124,7 +124,7 @@
124
124
 
125
125
  となっております。
126
126
 
127
- ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
127
+ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
128
128
 
129
129
 
130
130
 
@@ -246,7 +246,11 @@
246
246
 
247
247
 
248
248
 
249
-
249
+ Body2Backward( SortBodyList[iiiaa] );
250
+
251
+ の部分でエラーが起きるため、さらに詳しく掲載します。
252
+
253
+ (一部省略しております。)
250
254
 
251
255
 
252
256
 

5

解説の追加

2016/09/28 19:17

投稿

kt.tk.co
kt.tk.co

スコア27

test CHANGED
File without changes
test CHANGED
@@ -124,6 +124,8 @@
124
124
 
125
125
  となっております。
126
126
 
127
+ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
128
+
127
129
 
128
130
 
129
131
  ![スクリーンショット](fbb1a83cddd4d23433c81ac75e532425.jpeg)
@@ -138,13 +140,15 @@
138
140
 
139
141
  デバッグを行うことで、エラー場所は特定できました。
140
142
 
143
+ しかし、原因や解決策はまったくわかりません。
144
+
141
145
 
142
146
 
143
147
  動的に変更されるjointの個数がずれてしまい、joint配列の範囲外のものを指定しているようです。
144
148
 
145
149
 
146
150
 
147
- 本来であれば動的にjointの個数に合わせてm_jointCapacityの数が変更されていたのですが、なぜかエラーが発生してしまいます。
151
+ 本来であれば動的にjointの個数に合わせてm_jointCapacityの数が変更されていたのですが、なぜか今回の処理を行うとエラーが発生してしまいます。
148
152
 
149
153
  (bodyやjointを削除・生成を繰り返す過程が問題?)
150
154
 
@@ -381,3 +385,9 @@
381
385
  }
382
386
 
383
387
  ```
388
+
389
+
390
+
391
+
392
+
393
+ 何卒よろしくお願いいたします。

4

情報の修正

2016/09/28 19:15

投稿

kt.tk.co
kt.tk.co

スコア27

test CHANGED
File without changes
test CHANGED
@@ -158,7 +158,7 @@
158
158
 
159
159
  ```Java
160
160
 
161
- /////////////////////////////
161
+ /////////////////////////////
162
162
 
163
163
  //「表示順を変更する処理」
164
164
 
@@ -184,9 +184,9 @@
184
184
 
185
185
 
186
186
 
187
- //設定したbodyIdを並び替えたリストを取得しint[]の配列へ代入
187
+ //bodyごとに設定したbodyId(整数)並び替えた取得し配列へ代入
188
-
188
+
189
- SortBodyList = GetSortedBodyList();
189
+ int[] SortBodyList = GetSortedBodyList();
190
190
 
191
191
 
192
192
 
@@ -194,43 +194,29 @@
194
194
 
195
195
  boolean ArraySameFlag = ArraySameCheck(SortBodyList,SortBodyListPrevious);
196
196
 
197
+
198
+
197
- //問題あり
199
+ //もし、前回と同じなら
198
-
199
-
200
-
201
-
202
-
203
- //もし、前回と同じなら (風車のアイテムがないときは同じになる)
204
200
 
205
201
  if (ArraySameFlag){
206
202
 
207
203
  //なにもしない
208
204
 
209
-
210
-
211
205
  }else{ //前回と中身が異なるなら
212
206
 
213
-
214
-
215
- //風車Itemの数だけ、再生成する。
207
+ //bodyの数だけ、一つずつ再生成する。
216
208
 
217
209
  for (int iiiaa = 0 ; iiiaa < ItemNum ; iiiaa++){
218
210
 
219
-
220
-
221
211
  //順番通り再度生成する。bodyIdの順番を引き渡す
222
212
 
223
213
  Body2Backward( SortBodyList[iiiaa] );
224
214
 
225
-
226
-
227
215
  }
228
216
 
229
217
 
230
218
 
231
-
232
-
233
- //一つ前のBodyListを保存する
219
+ //SortBodyListPrevious(一つ前のBodyList)に、いまのSortBodyList代入
234
220
 
235
221
  SortBodyListPrevious = SortBodyList;
236
222
 
@@ -270,7 +256,7 @@
270
256
 
271
257
  ```Java
272
258
 
273
- /////////////////////////////
259
+ /////////////////////////////
274
260
 
275
261
  //「bodyとjointを再度生成する」
276
262
 
@@ -278,14 +264,12 @@
278
264
 
279
265
 
280
266
 
281
- //風車のアイテム順を指定し、順にアイテムを再度生成するこで表示の重なりを調節する。(新く生成さたものは後ろに位置づけられる。
267
+ //アイテム順番号が引数として得らる(body個数6つなので、itemOrderにはItemの号であ0~5が入る)
282
268
 
283
269
  public void Body2Backward(int itemOrder) {
284
270
 
285
271
 
286
272
 
287
- //Itemの番号である0~5を指定する。
288
-
289
273
  int NumNum = itemOrder;
290
274
 
291
275
 
@@ -300,7 +284,7 @@
300
284
 
301
285
  //Jointを消す
302
286
 
303
- world.destroyJoint( JointOfItem2Center[NumNum] );
287
+ world.destroyJoint( JointOfItem2Center[NumNum] ); //body番号(NumNum)ごとにJointを生成してあるため、そのJointを削除する。JointOfItem2Center[body番号]にはjointの情報が入っている。
304
288
 
305
289
  JointOfItem2Center[NumNum] = null;
306
290
 
@@ -310,7 +294,7 @@
310
294
 
311
295
  //Jointを消す
312
296
 
313
- //省略
297
+ //同様の処理なので省略
314
298
 
315
299
  //
316
300
 
@@ -318,7 +302,7 @@
318
302
 
319
303
 
320
304
 
321
-
305
+ //bodyを削除するまえに行う処理
322
306
 
323
307
  //座標を取得する。(再度アイテムを生成するために、同じ座標を記録しておく)
324
308
 
@@ -372,11 +356,13 @@
372
356
 
373
357
  //生成したアイテムをjoinする (ここでエラーが起きる!!!)
374
358
 
375
- JointOfItem2Center[NumNum] = JointBody(CenterPoint1,body[NumNum],"distance");
359
+ JointOfItem2Center[NumNum] = JointBody(CenterPoint1,body[NumNum],"distance"); //CenterPoint1は、画面の中央に生成したbodyです。再度生成したbodyを画面の中央に紐付ける必要があるのですが、この処理を実行するとエラーがおきます。
376
-
377
-
378
-
360
+
361
+
362
+
363
+
364
+
379
- //生成したアイテムをjoinする (ここではエラーが起きない)
365
+ //生成したアイテムをjoinする
380
366
 
381
367
  //省略
382
368
 

3

情報の修正

2016/09/28 19:13

投稿

kt.tk.co
kt.tk.co

スコア27

test CHANGED
File without changes
test CHANGED
@@ -44,7 +44,7 @@
44
44
 
45
45
  「bodyとjointを再度生成する」の処理は (★下記にコード貼り付け★)
46
46
 
47
- すでに生成されているbodyを削除し、画面下のものから一つずつ再度生成していくものです。(早く生成されたbodyほど画面面に表示されているため)
47
+ すでに生成されているbodyを削除し、画面下のものから一つずつ再度生成していくものです。(早く生成されたbodyほど画面面に表示されているため)
48
48
 
49
49
  この処理自体はうまくできているのですが、この処理を入れた状態でbodyのjointを行うとエラーでアプリケーションが停止してしまいます。
50
50
 
@@ -52,8 +52,6 @@
52
52
 
53
53
 
54
54
 
55
-
56
-
57
55
  何日も同じエラーで悩んでおります。
58
56
 
59
57
  お力添え頂けますと幸いです。
@@ -62,57 +60,191 @@
62
60
 
63
61
 
64
62
 
63
+ エラーメッセージです。
64
+
65
+
66
+
67
+ ```エラーメッセージ
68
+
69
+ 09-29 02:57:05.778: E/AndroidRuntime(6811): FATAL EXCEPTION: main
70
+
71
+ 09-29 02:57:05.778: E/AndroidRuntime(6811): java.lang.ArrayIndexOutOfBoundsException: index=13 length=13
72
+
73
+ 09-29 02:57:05.778: E/AndroidRuntime(6811): at org.jbox2d.dynamics.Island.add(Island.java:423)
74
+
75
+ 09-29 02:57:05.778: E/AndroidRuntime(6811): at org.jbox2d.dynamics.World.solve(World.java:976)
76
+
77
+ 09-29 02:57:05.778: E/AndroidRuntime(6811): at org.jbox2d.dynamics.World.step(World.java:560)
78
+
79
+ 09-29 02:57:05.778: E/AndroidRuntime(6811): at mori.ken.tab.breath001.box2d.PhysicsWorld.update(PhysicsWorld.java:1926)
80
+
81
+ 09-29 02:57:05.778: E/AndroidRuntime(6811): at mori.ken.tab.breath001.box2d.Box2dActivity$3.run(Box2dActivity.java:461)
82
+
83
+ 09-29 02:57:05.778: E/AndroidRuntime(6811): at android.os.Handler.handleCallback(Handler.java:587)
84
+
85
+ 09-29 02:57:05.778: E/AndroidRuntime(6811): at android.os.Handler.dispatchMessage(Handler.java:92)
86
+
87
+ 09-29 02:57:05.778: E/AndroidRuntime(6811): at android.os.Looper.loop(Looper.java:132)
88
+
89
+ 09-29 02:57:05.778: E/AndroidRuntime(6811): at android.app.ActivityThread.main(ActivityThread.java:4123)
90
+
91
+ 09-29 02:57:05.778: E/AndroidRuntime(6811): at java.lang.reflect.Method.invokeNative(Native Method)
92
+
93
+ 09-29 02:57:05.778: E/AndroidRuntime(6811): at java.lang.reflect.Method.invoke(Method.java:491)
94
+
95
+ 09-29 02:57:05.778: E/AndroidRuntime(6811): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
96
+
97
+ 09-29 02:57:05.778: E/AndroidRuntime(6811): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
98
+
99
+ 09-29 02:57:05.778: E/AndroidRuntime(6811): at dalvik.system.NativeStart.main(Native Method)
100
+
101
+
102
+
103
+ ```
104
+
105
+
106
+
107
+
108
+
109
+ の部分より、該当箇所を抜粋します。
110
+
111
+
112
+
113
+ ```エラーメッセージ
114
+
115
+ java.lang.ArrayIndexOutOfBoundsException: index=13 length=13`
116
+
117
+ ```
118
+
119
+ m_jointCapacity=13
120
+
121
+ なのに対して、
122
+
123
+ m_jointCount=14
124
+
125
+ となっております。
126
+
127
+
128
+
129
+ ![スクリーンショット](fbb1a83cddd4d23433c81ac75e532425.jpeg)
130
+
131
+
132
+
133
+
134
+
135
+
136
+
65
137
  ■バグの推測
66
138
 
67
- デバッグを行うことで、ほぼ原因は特定できました。
68
-
69
-
70
-
71
- jointの個数がずれてしまい、配列の範囲外のものを指定しているようです。(bodyやjointを削除・生成を繰り返す過程が問題?)
72
-
73
-
74
-
75
-
76
-
77
- エラーメッセージで
78
-
79
-
80
-
81
- ```エラーメッセージ
82
-
83
- 09-29 02:57:05.778: E/AndroidRuntime(6811): FATAL EXCEPTION: main
84
-
85
- 09-29 02:57:05.778: E/AndroidRuntime(6811): java.lang.ArrayIndexOutOfBoundsException: index=13 length=13
86
-
87
- 09-29 02:57:05.778: E/AndroidRuntime(6811): at org.jbox2d.dynamics.Island.add(Island.java:423)
88
-
89
- 09-29 02:57:05.778: E/AndroidRuntime(6811): at org.jbox2d.dynamics.World.solve(World.java:976)
90
-
91
- 09-29 02:57:05.778: E/AndroidRuntime(6811): at org.jbox2d.dynamics.World.step(World.java:560)
92
-
93
- 09-29 02:57:05.778: E/AndroidRuntime(6811): at mori.ken.tab.breath001.box2d.PhysicsWorld.update(PhysicsWorld.java:1926)
94
-
95
- 09-29 02:57:05.778: E/AndroidRuntime(6811): at mori.ken.tab.breath001.box2d.Box2dActivity$3.run(Box2dActivity.java:461)
96
-
97
- 09-29 02:57:05.778: E/AndroidRuntime(6811): at android.os.Handler.handleCallback(Handler.java:587)
98
-
99
- 09-29 02:57:05.778: E/AndroidRuntime(6811): at android.os.Handler.dispatchMessage(Handler.java:92)
100
-
101
- 09-29 02:57:05.778: E/AndroidRuntime(6811): at android.os.Looper.loop(Looper.java:132)
102
-
103
- 09-29 02:57:05.778: E/AndroidRuntime(6811): at android.app.ActivityThread.main(ActivityThread.java:4123)
104
-
105
- 09-29 02:57:05.778: E/AndroidRuntime(6811): at java.lang.reflect.Method.invokeNative(Native Method)
106
-
107
- 09-29 02:57:05.778: E/AndroidRuntime(6811): at java.lang.reflect.Method.invoke(Method.java:491)
108
-
109
- 09-29 02:57:05.778: E/AndroidRuntime(6811): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
110
-
111
- 09-29 02:57:05.778: E/AndroidRuntime(6811): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
112
-
113
- 09-29 02:57:05.778: E/AndroidRuntime(6811): at dalvik.system.NativeStart.main(Native Method)
114
-
115
-
139
+ デバッグを行うことで、エラー場所は特定できました。
140
+
141
+
142
+
143
+ 動的に変更されるjointの個数がずれてしまい、joint配列の範囲外のものを指定しているようです。
144
+
145
+
146
+
147
+ 本来であれば動的にjointの個数に合わせてm_jointCapacityの数が変更されていたのですが、なぜかエラーが発生してしまいます。
148
+
149
+ (bodyやjointを削除・生成を繰り返過程が問題?)
150
+
151
+
152
+
153
+
154
+
155
+ 以下、コードとなります。
156
+
157
+
158
+
159
+ ```Java
160
+
161
+ /////////////////////////////
162
+
163
+ //「表示順を変更する処理」
164
+
165
+ /////////////////////////////
166
+
167
+
168
+
169
+ //重なりを調節するために再生成する関数
170
+
171
+ public void ShowItem2Forward( ) {
172
+
173
+
174
+
175
+ //現在のbody(剛体・物体)のリストを取得
176
+
177
+ Body bodies = getWorld().getBodyList();
178
+
179
+
180
+
181
+ //bodyが空でなければ
182
+
183
+ if (bodies != null) {
184
+
185
+
186
+
187
+ //設定したbodyIdを並び替えたリストを取得しint[]の配列へ代入
188
+
189
+ SortBodyList = GetSortedBodyList();
190
+
191
+
192
+
193
+ //並び順が前回と同じか否かを取得する。(同じならTrue、異なるならFalse)
194
+
195
+ boolean ArraySameFlag = ArraySameCheck(SortBodyList,SortBodyListPrevious);
196
+
197
+ //問題あり
198
+
199
+
200
+
201
+
202
+
203
+ //もし、前回と同じなら (風車のアイテムがないときは同じになる)
204
+
205
+ if (ArraySameFlag){
206
+
207
+ //なにもしない
208
+
209
+
210
+
211
+ }else{ //前回と中身が異なるなら
212
+
213
+
214
+
215
+ //風車Itemの数だけ、再生成する。
216
+
217
+ for (int iiiaa = 0 ; iiiaa < ItemNum ; iiiaa++){
218
+
219
+
220
+
221
+ //順番通り再度生成する。bodyIdの順番を引き渡す
222
+
223
+ Body2Backward( SortBodyList[iiiaa] );
224
+
225
+
226
+
227
+ }
228
+
229
+
230
+
231
+
232
+
233
+ //一つ前のBodyListを保存する
234
+
235
+ SortBodyListPrevious = SortBodyList;
236
+
237
+
238
+
239
+ }
240
+
241
+
242
+
243
+ }
244
+
245
+
246
+
247
+ }
116
248
 
117
249
  ```
118
250
 
@@ -120,274 +252,146 @@
120
252
 
121
253
 
122
254
 
123
- の部分より、該当箇所を抜粋します。
255
+
124
-
125
-
126
-
256
+
257
+
258
+
259
+
260
+
261
+
262
+
263
+
264
+
265
+
266
+
267
+
268
+
269
+
270
+
127
- ```エラーメッセージ
271
+ ```Java
272
+
128
-
273
+ /////////////////////////////
274
+
275
+ //「bodyとjointを再度生成する」
276
+
277
+ /////////////////////////////
278
+
279
+
280
+
281
+ //風車のアイテム順を指定し、順番にアイテムを再度生成することで表示の重なりを調節する。(新しく生成されたものは一番後ろに位置づけられる。)
282
+
283
+ public void Body2Backward(int itemOrder) {
284
+
285
+
286
+
287
+ //Itemの番号である0~5を指定する。
288
+
289
+ int NumNum = itemOrder;
290
+
291
+
292
+
293
+ //////////////////////
294
+
295
+ //アイテムを削除する処理
296
+
297
+ //////////////////////
298
+
299
+
300
+
301
+ //Jointを消す
302
+
129
- java.lang.ArrayIndexOutOfBoundsException: index=13 length=13`
303
+ world.destroyJoint( JointOfItem2Center[NumNum] );
304
+
305
+ JointOfItem2Center[NumNum] = null;
306
+
307
+
308
+
309
+
310
+
311
+ //Jointを消す
312
+
313
+ //省略
314
+
315
+ //
316
+
317
+
318
+
319
+
320
+
321
+
322
+
323
+ //座標を取得する。(再度アイテムを生成するために、同じ座標を記録しておく)
324
+
325
+ Vec2 position = body[NumNum].getWorldCenter();
326
+
327
+ //速度を取得する。
328
+
329
+ Vec2 velocity = body[NumNum].getLinearVelocity();
330
+
331
+
332
+
333
+
334
+
335
+
336
+
337
+ //Bodyを消す
338
+
339
+ if (body[NumNum].m_userData != null) {
340
+
341
+ world.destroyBody( body[NumNum] );
342
+
343
+ body[NumNum].m_userData = null;
344
+
345
+ body[NumNum] = null;
346
+
347
+ }
348
+
349
+
350
+
351
+
352
+
353
+ //////////////////////
354
+
355
+ //全く同じアイテムを生成する処理
356
+
357
+ //////////////////////
358
+
359
+
360
+
361
+ body[NumNum] = MakeBody( ItemName[NumNum] , (float) (position.x) , (float)(position.y),1,0,0);
362
+
363
+
364
+
365
+ //速度を割り当てる
366
+
367
+ body[NumNum].setLinearVelocity(velocity);
368
+
369
+
370
+
371
+
372
+
373
+ //生成したアイテムをjoinする (ここでエラーが起きる!!!)
374
+
375
+ JointOfItem2Center[NumNum] = JointBody(CenterPoint1,body[NumNum],"distance");
376
+
377
+
378
+
379
+ //生成したアイテムをjoinする (ここではエラーが起きない)
380
+
381
+ //省略
382
+
383
+ //
384
+
385
+
386
+
387
+
388
+
389
+
390
+
391
+
392
+
393
+
394
+
395
+ }
130
396
 
131
397
  ```
132
-
133
- m_jointCapacity=13
134
-
135
- なのに対して、
136
-
137
- m_jointCount=14
138
-
139
- となっております。
140
-
141
-
142
-
143
- ![スクリーンショット](fbb1a83cddd4d23433c81ac75e532425.jpeg)
144
-
145
-
146
-
147
-
148
-
149
- 本来であれば動的にjointの個数に合わせてm_jointCapacityの数が変更されていたのですが、なぜか上記のようなエラーが発生してしまいます。
150
-
151
-
152
-
153
-
154
-
155
- ```Java
156
-
157
- /////////////////////////////
158
-
159
- //「表示順を変更する処理」
160
-
161
- /////////////////////////////
162
-
163
-
164
-
165
- //重なりを調節するために再生成する関数
166
-
167
- public void ShowItem2Forward( ) {
168
-
169
-
170
-
171
- //現在のbody(剛体・物体)のリストを取得
172
-
173
- Body bodies = getWorld().getBodyList();
174
-
175
-
176
-
177
- //bodyが空でなければ
178
-
179
- if (bodies != null) {
180
-
181
-
182
-
183
- //設定したbodyIdを並び替えたリストを取得しint[]の配列へ代入
184
-
185
- SortBodyList = GetSortedBodyList();
186
-
187
-
188
-
189
- //並び順が前回と同じか否かを取得する。(同じならTrue、異なるならFalse)
190
-
191
- boolean ArraySameFlag = ArraySameCheck(SortBodyList,SortBodyListPrevious);
192
-
193
- //問題あり
194
-
195
-
196
-
197
-
198
-
199
- //もし、前回と同じなら (風車のアイテムがないときは同じになる)
200
-
201
- if (ArraySameFlag){
202
-
203
- //なにもしない
204
-
205
-
206
-
207
- }else{ //前回と中身が異なるなら
208
-
209
-
210
-
211
- //風車Itemの数だけ、再生成する。
212
-
213
- for (int iiiaa = 0 ; iiiaa < ItemNum ; iiiaa++){
214
-
215
-
216
-
217
- //順番通り再度生成する。bodyIdの順番を引き渡す
218
-
219
- Body2Backward( SortBodyList[iiiaa] );
220
-
221
-
222
-
223
- }
224
-
225
-
226
-
227
-
228
-
229
- //一つ前のBodyListを保存する
230
-
231
- SortBodyListPrevious = SortBodyList;
232
-
233
-
234
-
235
- }
236
-
237
-
238
-
239
- }
240
-
241
-
242
-
243
- }
244
-
245
- ```
246
-
247
-
248
-
249
-
250
-
251
-
252
-
253
-
254
-
255
-
256
-
257
-
258
-
259
-
260
-
261
-
262
-
263
-
264
-
265
-
266
-
267
- ```Java
268
-
269
- /////////////////////////////
270
-
271
- //「bodyとjointを再度生成する」
272
-
273
- /////////////////////////////
274
-
275
-
276
-
277
- //風車のアイテム順を指定し、順番にアイテムを再度生成することで表示の重なりを調節する。(新しく生成されたものは一番後ろに位置づけられる。)
278
-
279
- public void Body2Backward(int itemOrder) {
280
-
281
-
282
-
283
- //Itemの番号である0~5を指定する。
284
-
285
- int NumNum = itemOrder;
286
-
287
-
288
-
289
- //////////////////////
290
-
291
- //アイテムを削除する処理
292
-
293
- //////////////////////
294
-
295
-
296
-
297
- //Jointを消す
298
-
299
- world.destroyJoint( JointOfItem2Center[NumNum] );
300
-
301
- JointOfItem2Center[NumNum] = null;
302
-
303
-
304
-
305
-
306
-
307
- //Jointを消す
308
-
309
- //省略
310
-
311
- //
312
-
313
-
314
-
315
-
316
-
317
-
318
-
319
- //座標を取得する。(再度アイテムを生成するために、同じ座標を記録しておく)
320
-
321
- Vec2 position = body[NumNum].getWorldCenter();
322
-
323
- //速度を取得する。
324
-
325
- Vec2 velocity = body[NumNum].getLinearVelocity();
326
-
327
-
328
-
329
-
330
-
331
-
332
-
333
- //Bodyを消す
334
-
335
- if (body[NumNum].m_userData != null) {
336
-
337
- world.destroyBody( body[NumNum] );
338
-
339
- body[NumNum].m_userData = null;
340
-
341
- body[NumNum] = null;
342
-
343
- }
344
-
345
-
346
-
347
-
348
-
349
- //////////////////////
350
-
351
- //全く同じアイテムを生成する処理
352
-
353
- //////////////////////
354
-
355
-
356
-
357
- body[NumNum] = MakeBody( ItemName[NumNum] , (float) (position.x) , (float)(position.y),1,0,0);
358
-
359
-
360
-
361
- //速度を割り当てる
362
-
363
- body[NumNum].setLinearVelocity(velocity);
364
-
365
-
366
-
367
-
368
-
369
- //生成したアイテムをjoinする (ここでエラーが起きる!!!)
370
-
371
- JointOfItem2Center[NumNum] = JointBody(CenterPoint1,body[NumNum],"distance");
372
-
373
-
374
-
375
- //生成したアイテムをjoinする (ここではエラーが起きない)
376
-
377
- //省略
378
-
379
- //
380
-
381
-
382
-
383
-
384
-
385
-
386
-
387
-
388
-
389
-
390
-
391
- }
392
-
393
- ```

2

情報の追加

2016/09/28 19:00

投稿

kt.tk.co
kt.tk.co

スコア27

test CHANGED
File without changes
test CHANGED
@@ -26,15 +26,27 @@
26
26
 
27
27
  簡単に処理ができればよかったのですが、そのような設定は見つかりませんでした。
28
28
 
29
- そのため、すべてのbodyの座標を読み取りy軸の座標が小さい順に並び替え、順番が変化した場合に「表示順を並び替える処理」を実行させることにしました。
29
+ そのため、「表示順を変更する処理」を実行させたいです (★下記にコード貼り付け★)
30
-
31
-
32
-
30
+
33
- 「表示順を並び替える処理」は
31
+ 「表示順を変更する処理」
32
+
34
-
33
+ ①すべてのbodyの座標を読み取る
34
+
35
+ ②y軸の座標が小さい順に並び替え
36
+
37
+ ③表示順を並び替えるため、「bodyとjointを再度生成する」
38
+
39
+ ことで実行させることにしました。
40
+
41
+
42
+
43
+
44
+
45
+ 「bodyとjointを再度生成する」の処理は (★下記にコード貼り付け★)
46
+
35
- すでに生成されているbodyを削除し、画面下のものから一つずつ再生成していくものです。(早く生成されたbodyほど画面全面に表示されているため)
47
+ すでに生成されているbodyを削除し、画面下のものから一つずつ再生成していくものです。(早く生成されたbodyほど画面全面に表示されているため)
36
-
48
+
37
- 処理自体はうまくできているのですが、この処理を入れた状態でbodyのjointを行うとエラーでアプリケーションが停止してしまいます。
49
+ この処理自体はうまくできているのですが、この処理を入れた状態でbodyのjointを行うとエラーでアプリケーションが停止してしまいます。
38
50
 
39
51
 
40
52
 
@@ -142,6 +154,14 @@
142
154
 
143
155
  ```Java
144
156
 
157
+ /////////////////////////////
158
+
159
+ //「表示順を変更する処理」
160
+
161
+ /////////////////////////////
162
+
163
+
164
+
145
165
  //重なりを調節するために再生成する関数
146
166
 
147
167
  public void ShowItem2Forward( ) {
@@ -223,3 +243,151 @@
223
243
  }
224
244
 
225
245
  ```
246
+
247
+
248
+
249
+
250
+
251
+
252
+
253
+
254
+
255
+
256
+
257
+
258
+
259
+
260
+
261
+
262
+
263
+
264
+
265
+
266
+
267
+ ```Java
268
+
269
+ /////////////////////////////
270
+
271
+ //「bodyとjointを再度生成する」
272
+
273
+ /////////////////////////////
274
+
275
+
276
+
277
+ //風車のアイテム順を指定し、順番にアイテムを再度生成することで表示の重なりを調節する。(新しく生成されたものは一番後ろに位置づけられる。)
278
+
279
+ public void Body2Backward(int itemOrder) {
280
+
281
+
282
+
283
+ //Itemの番号である0~5を指定する。
284
+
285
+ int NumNum = itemOrder;
286
+
287
+
288
+
289
+ //////////////////////
290
+
291
+ //アイテムを削除する処理
292
+
293
+ //////////////////////
294
+
295
+
296
+
297
+ //Jointを消す
298
+
299
+ world.destroyJoint( JointOfItem2Center[NumNum] );
300
+
301
+ JointOfItem2Center[NumNum] = null;
302
+
303
+
304
+
305
+
306
+
307
+ //Jointを消す
308
+
309
+ //省略
310
+
311
+ //
312
+
313
+
314
+
315
+
316
+
317
+
318
+
319
+ //座標を取得する。(再度アイテムを生成するために、同じ座標を記録しておく)
320
+
321
+ Vec2 position = body[NumNum].getWorldCenter();
322
+
323
+ //速度を取得する。
324
+
325
+ Vec2 velocity = body[NumNum].getLinearVelocity();
326
+
327
+
328
+
329
+
330
+
331
+
332
+
333
+ //Bodyを消す
334
+
335
+ if (body[NumNum].m_userData != null) {
336
+
337
+ world.destroyBody( body[NumNum] );
338
+
339
+ body[NumNum].m_userData = null;
340
+
341
+ body[NumNum] = null;
342
+
343
+ }
344
+
345
+
346
+
347
+
348
+
349
+ //////////////////////
350
+
351
+ //全く同じアイテムを生成する処理
352
+
353
+ //////////////////////
354
+
355
+
356
+
357
+ body[NumNum] = MakeBody( ItemName[NumNum] , (float) (position.x) , (float)(position.y),1,0,0);
358
+
359
+
360
+
361
+ //速度を割り当てる
362
+
363
+ body[NumNum].setLinearVelocity(velocity);
364
+
365
+
366
+
367
+
368
+
369
+ //生成したアイテムをjoinする (ここでエラーが起きる!!!)
370
+
371
+ JointOfItem2Center[NumNum] = JointBody(CenterPoint1,body[NumNum],"distance");
372
+
373
+
374
+
375
+ //生成したアイテムをjoinする (ここではエラーが起きない)
376
+
377
+ //省略
378
+
379
+ //
380
+
381
+
382
+
383
+
384
+
385
+
386
+
387
+
388
+
389
+
390
+
391
+ }
392
+
393
+ ```

1

情報追加

2016/09/28 18:57

投稿

kt.tk.co
kt.tk.co

スコア27

test CHANGED
File without changes
test CHANGED
@@ -108,6 +108,8 @@
108
108
 
109
109
 
110
110
 
111
+ の部分より、該当箇所を抜粋します。
112
+
111
113
 
112
114
 
113
115
  ```エラーメッセージ
@@ -116,7 +118,13 @@
116
118
 
117
119
  ```
118
120
 
119
- の部分より、該当箇所を特定しました。
121
+ m_jointCapacity=13
122
+
123
+ なのに対して、
124
+
125
+ m_jointCount=14
126
+
127
+ となっております。
120
128
 
121
129
 
122
130
 
@@ -124,4 +132,94 @@
124
132
 
125
133
 
126
134
 
135
+
136
+
137
+ 本来であれば動的にjointの個数に合わせてm_jointCapacityの数が変更されていたのですが、なぜか上記のようなエラーが発生してしまいます。
138
+
139
+
140
+
141
+
142
+
143
+ ```Java
144
+
145
+ //重なりを調節するために再生成する関数
146
+
147
+ public void ShowItem2Forward( ) {
148
+
149
+
150
+
151
+ //現在のbody(剛体・物体)のリストを取得
152
+
153
+ Body bodies = getWorld().getBodyList();
154
+
155
+
156
+
157
+ //bodyが空でなければ
158
+
127
- 動的にjointの個数を
159
+ if (bodies != null) {
160
+
161
+
162
+
163
+ //設定したbodyIdを並び替えたリストを取得しint[]の配列へ代入
164
+
165
+ SortBodyList = GetSortedBodyList();
166
+
167
+
168
+
169
+ //並び順が前回と同じか否かを取得する。(同じならTrue、異なるならFalse)
170
+
171
+ boolean ArraySameFlag = ArraySameCheck(SortBodyList,SortBodyListPrevious);
172
+
173
+ //問題あり
174
+
175
+
176
+
177
+
178
+
179
+ //もし、前回と同じなら (風車のアイテムがないときは同じになる)
180
+
181
+ if (ArraySameFlag){
182
+
183
+ //なにもしない
184
+
185
+
186
+
187
+ }else{ //前回と中身が異なるなら
188
+
189
+
190
+
191
+ //風車Itemの数だけ、再生成する。
192
+
193
+ for (int iiiaa = 0 ; iiiaa < ItemNum ; iiiaa++){
194
+
195
+
196
+
197
+ //順番通り再度生成する。bodyIdの順番を引き渡す
198
+
199
+ Body2Backward( SortBodyList[iiiaa] );
200
+
201
+
202
+
203
+ }
204
+
205
+
206
+
207
+
208
+
209
+ //一つ前のBodyListを保存する
210
+
211
+ SortBodyListPrevious = SortBodyList;
212
+
213
+
214
+
215
+ }
216
+
217
+
218
+
219
+ }
220
+
221
+
222
+
223
+ }
224
+
225
+ ```