質問: 私はJava—というかProcessingを使ってプログラミングをしているかなたんといいます。 ProcessingがJavaと似ていることもあり、ここで質問させてもらうことにしました。 手の座標を用いたペイントソフトなんかを作りたいと思っています。 座標はPVector型で取得することができて、その取得した座標をArrayListへ追加し、その動きを線でつなごうと思っています。 複数人でもできるようにしたいと思っているので、手の数がいくつになるのかわかりません。 でも、複数の手それぞれに線の色を決めたり手の座標を記録していきたいと思っています。 そこで、線の色や手の座標などを管理したり、その座標を用いて線を描くためのクラスを作成することにしました。 class User_Paint{ color paint_color; //線の色を記憶 ArrayList paint_pos=new ArrayList(); //手の座標を記憶 User_Paint(){ paint_color=color(random(0,255),random(0,255),random(0,255)); //線の色をランダムに決定 paint_pos.clear(); //ArrayListの中身を念のため空にしておく } void point_add(PVector hand_pos){ paint_pos.add(hand_pos); //取得した手の座標を追加 } void draw_paint(){ stroke(paint_color); //線の色を決定した色にする strokeWeight(3); //線の太さを3にする for(int n=1;n(),new ArrayList()}; //左手と右手用にArrayListの配列にする //人を検出したら paint[0].add(new User_Paint()); //左手のインスタンス追加 paint[1].add(new User_Paint()); //右手のインスタンス追加 手の座標はdraw関数内で取得し、その取得した座標を先ほど作ったUser_Paintクラスのpoint_add関数を用いてクラス変数であるArrayListのpaint_posに追加して、その軌跡を描画させています。 //draw内で context.getJointPositionSkeleton(userList[i],SimpleOpenNI.SKEL_LEFT_HAND,hand_pos[0]); //i番目の人の左手の座標取得 context.getJointPositionSkeleton(userList[i],SimpleOpenNI.SKEL_RIGHT_HAND,hand_pos[1]); //i番目の人の右手の座標取得 User_Paint[] painting={(User_Paint)paint[0].get(i),(User_Paint)paint[1].get(i)}; //i番目の人のインスタンスを取得 painting[0].point_add(hand_pos[0]); //左手の座標追加 painting[0].draw_paint(); //左手の軌跡描画 painting[1].point_add(hand_pos[1]); //右手の座標追加 painting[1].draw_paint(); //右手の軌跡描画 実行して手を動かしてみても、線が描画されません。 実行画面を見てみると、線でなく点になってしまっています。 そこで、追加した座標や描画している座標を出力させてみたのですが、なんと追加したらその前の座標がみんな最後に追加した座標になってしまっています。 座標追加:[ 408.17795, 504.1026, 1185.2173 ] [ 408.17795, 504.1026, 1185.2173 ],[ 408.17795, 504.1026, 1185.2173 ],[ 408.17795, 504.1026, 1185.2173 ],[ 408.17795, 504.1026, 1185.2173 ],きちんとなってる? painting -5745259 [ 408.17795, 504.1026, 1185.2173 ],[ 408.17795, 504.1026, 1185.2173 ],[ 408.17795, 504.1026, 1185.2173 ],[ 408.17795, 504.1026, 1185.2173 ],描画終了 座標追加:[ -251.10933, -11.485046, 1247.2742 ] [ -251.10933, -11.485046, 1247.2742 ],[ -251.10933, -11.485046, 1247.2742 ],[ -251.10933, -11.485046, 1247.2742 ],[ -251.10933, -11.485046, 1247.2742 ],[ -251.10933, -11.485046, 1247.2742 ],きちんとなってる? painting -12211937 [ -251.10933, -11.485046, 1247.2742 ],[ -251.10933, -11.485046, 1247.2742 ],[ -251.10933, -11.485046, 1247.2742 ],[ -251.10933, -11.485046, 1247.2742 ],[ -251.10933, -11.485046, 1247.2742 ],描画終了 座標追加:[ 394.7011, 511.8561, 1187.2467 ] [ 394.7011, 511.8561, 1187.2467 ],[ 394.7011, 511.8561, 1187.2467 ],[ 394.7011, 511.8561, 1187.2467 ],[ 394.7011, 511.8561, 1187.2467 ],[ 394.7011, 511.8561, 1187.2467 ],きちんとなってる? painting -5745259 [ 394.7011, 511.8561, 1187.2467 ],[ 394.7011, 511.8561, 1187.2467 ],[ 394.7011, 511.8561, 1187.2467 ],[ 394.7011, 511.8561, 1187.2467 ],[ 394.7011, 511.8561, 1187.2467 ],描画終了 クラスやArrayListの使い方を間違えたでしょうか・・・?
回答: >参照という単語を聞いて、勝手にポインタやアドレスを連想したもので。 まさにそれなんだけど。 Javaは、ポインタが見えないようになってるだけ。やってることはCと一緒。 >人数×両手分インスタンスを用意したいんです 人数はともかく、問題はその「両手」の方だろう。 A a = new A(); list.add(a); list.add(a); という操作は、「Aのインスタンスを2つ追加」ではなく、「Aのインスタンス1つを2回追加」だということは、理解できてるだろうか。 何かの予約リストに対して、赤い服を着て記名、次に青い服を着て記名した。 名前が点呼されたとして、答えるのは両方とも青い服を着た自分だろう。 今やってるのは、そういうこと。