こんにちは、Java初心者です。
Turtleアプレットの作成を通じて、イベント処理とオブジェクト指向の学習をしています。
現在、亀に足跡を描かせるクラス。Turtleクラスをを用いて、4匹の亀を生成します。うち1匹をドラッグすると、それに伴って他の亀が同じ向きで距離だけ異なって移動し、図形を描画させたいです。
頑張って考えたのですが、実際に動かしてみると、全く描画されません。
急ぎなので、わかる方お願いします!
Turtle.java
lang
1import java.applet.Applet; 2import java.awt.*; 3import java.util.*; 4 5public class Turtle{ 6 7 //インスタンス変数の宣言 8 9 int x, y; 10 double angle = 0; 11 int pensize = 1; 12 Color pencolor = Color.black; 13 14 ArrayList<Point> points = new ArrayList<Point>(); 15 16 17 //コンストラクタの定義 18 19 Turtle(int i, int j){ 20 x = i; 21 y = j; 22 //亀さんの座標を決定 23 24 points.add(new Point(x, y)); 25 26 } 27 28 29 30 //各種メソッドの定義 31 32 //現在位置から進行方向に向かって距離lengthだけ移動する。 33 34 public void move(double length){ 35 int i = points.size()-1; 36 Point pt = points.get(i); 37 int x_l = (int)Math.round(length * Math.cos(angle)) + pt.x; 38 int y_l = (int)Math.round(length * Math.sin(angle)) + pt.y; 39 40 points.add(new Point(x_l, y_l)); 41 } 42 43 //進行方向をdegだけ左回転する。 44 public void turn(double deg){ 45 angle -= deg; 46 } 47 48 //ペンの太さを設定する。 49 50 public void PenSize(int size){ 51 pensize = size; 52 } 53 54 //ペンの色を設定する 55 56 public void penColor(Color c){ 57 pencolor = c; 58 } 59 60 //亀の軌跡の描画 61 62 public void paint(Graphics g){ 63 g.setColor(pencolor); 64 65 int i; 66 int px[] = new int[points.size()]; 67 int py[] = new int[points.size()]; 68 for( i = 0; i < points.size(); i++){ 69 Point p_i = points.get(i); 70 px[i] = p_i.x; 71 py[i] = p_i.y; 72 } 73 g.drawPolyline(px, py, points.size()); 74 } 75}
Turtle2.java
lang
1import java.applet.Applet; 2import java.awt.*; 3import java.util.*; 4 5public class Turtle2{ 6 7 Turtle kame[] = new Turtle[4]; 8 9 Turtle2(Turtle k[]){ 10 kame = k; 11 } 12 13 void move(double length){ 14 kame[0].move(length); 15 kame[1].move(length/2); 16 kame[2].move(length/3); 17 kame[3].move(length*2); 18 } 19 20 void turn(double deg){ 21 for(int i = 0; i < 4; i++){ 22 kame[i].turn(deg); 23 } 24 } 25 26 void paint(Graphics g){ 27 for(int i = 0; i < 4; i++){ 28 kame[i].paint(g); 29 } 30 } 31 32}
Rabbit.java
lang
1import java.applet.Applet; 2import java.awt.*; 3import java.util.*; 4import java.awt.event.*; 5 6 7public class Rabbit extends Applet implements MouseMotionListener{ 8 int current_x; //マウスの現在のx座標 9 int current_y; //マウスの現在のy座標 10 Turtle kame[] = new Turtle[4]; 11 Turtle2 Usagi = new Turtle2(kame); 12 double deg = 0; 13 double length = 0; 14 double pi = Math.PI; 15 Image imgs; 16 17 18 public void init(){ 19 setBackground(Color.white); 20 imgs= getImage(getDocumentBase(), "kame2.gif"); 21 22 kame[0] = new Turtle(100, 100); 23 kame[1] = new Turtle(300, 100); 24 kame[2] = new Turtle(100, 300); 25 kame[3] = new Turtle(300, 300); 26 27 //addMouseListener(this); 28 29 addMouseMotionListener(this); 30 31 } 32 33 public void mouseDragged(MouseEvent e){ 34 35 int size = kame[0].points.size() - 1; 36 Point p_0 = kame[0].points.get(size); 37 if(current_x >= p_0.x && current_x <= p_0.x+68 && current_y >= p_0.y && current_y <= p_0.y + 48){ 38 current_x = e.getX(); 39 current_y = e.getY(); 40 kame[0].points.add(new Point(current_x, current_y)); 41 } 42 repaint(); 43 } 44 45 public void mouseMoved(MouseEvent e){ 46 47 } 48 49 50 51 public void paint(Graphics g){ 52 int size = kame[0].points.size() - 1; 53 for(int i = 0; i < 4; i++){ 54 g.drawImage(imgs, kame[i].points.get(size).x, kame[i].points.get(size).y, this); 55 } 56 g.setColor(Color.black); 57 Point p_0 = kame[0].points.get(size - 1); 58 double dx = current_x - p_0.x; 59 double dy = current_y - p_0.y; 60 deg = Math.atan2(dy, dx); 61 if( deg != 0 || deg != pi || deg != -pi){ 62 length = dx; 63 } 64 else{ 65 length = dy/Math.sin(deg); 66 } 67 Usagi.turn(deg); 68 Usagi.move(length); 69 Usagi.paint(g); 70 } 71} 72 73
解決「現在は実行時エラーです。
また、実行時エラーにならずとも、足跡が描画されなかったり、右下にしか亀が動かなかったりします。」
現在、実行した段階でなぜか毎回決まった線が描画されてしまっています。
修正後
Turtle.java
lang
1public class Turtle{ 2 3 //インスタンス変数の宣言 4 5 int x, y; 6 double angle = 0; 7 8 ArrayList<Point> points = new ArrayList<Point>(); 9 10 11 //コンストラクタの定義 12 13 Turtle(int i, int j){ 14 x = i; 15 y = j; 16 points.add(new Point(x, y)); 17 18 } 19 //各種メソッドの定義 20 public void move(double x, double y){ 21 int i = points.size() - 1; 22 Point pt = points.get(i); 23 24 points.add(new Point( (int)x+pt.x, (int)y+pt.y)); 25 } 26 27 //亀の軌跡の描画 28 29 public void paint(Graphics g){ 30 31 g.setColor(pencolor); 32 33 int i; 34 int px[] = new int[points.size()]; 35 int py[] = new int[points.size()]; 36 for( i = 0; i < points.size(); i++){ 37 Point p_i = points.get(i); 38 px[i] = p_i.x; 39 py[i] = p_i.y; 40 } 41 g.drawPolyline(px, py, points.size()); 42 43 } 44}
Turtle2.java
lang
1public class Turtle2{ 2 3 Turtle kame[] = new Turtle[4]; 4 5 Turtle2(Turtle k[]){ 6 kame = k; 7 } 8 9 void move(double x, double y){ 10 kame[1].move(x/2, y/2); 11 kame[2].move(x/3, y/3); 12 kame[3].move(x*2, y*2); 13 14 15 void paint(Graphics g){ 16 for(int i = 0; i < 4; i++){ 17 kame[i].paint(g); 18 } 19 } 20 21}
Rabbit.java
lang
1public class Rabbit extends Applet implements MouseListener, MouseMotionListener{ 2 int current_x; //マウスの現在のx座標 3 int current_y; //マウスの現在のy座標 4 Turtle kame[] = new Turtle[4]; 5 Turtle2 Usagi = new Turtle2(kame); 6 Image imgs; 7 8 9 public void init(){ 10 setBackground(Color.white); 11 imgs= getImage(getDocumentBase(), "kame2.gif"); 12 13 kame[0] = new Turtle(100, 100); 14 kame[1] = new Turtle(300, 100); 15 kame[2] = new Turtle(100, 300); 16 kame[3] = new Turtle(300, 300); 17 18 addMouseListener(this); 19 20 addMouseMotionListener(this); 21 22 } 23 24 public void mouseDragged(MouseEvent e){ 25 26 int size = kame[0].points.size() - 1; 27 Point p_0 = kame[0].points.get(size); 28 if(current_x >= p_0.x && current_x <= p_0.x+68 && current_y >= p_0.y && current_y <= p_0.y + 48){ 29 current_x = e.getX(); 30 current_y = e.getY(); 31 kame[0].points.add(new Point(current_x, current_y)); 32 repaint(); 33 } 34 } 35 36 public void mouseMoved(MouseEvent e){ 37 38 } 39 40 public void mouseClicked(MouseEvent e){ 41 42 } 43 public void mouseEntered(MouseEvent e){ 44 45 } 46 public void mouseExited(MouseEvent e){ 47 48 } 49 50 public void mousePressed(MouseEvent e){ 51 52 } 53 54 public void mouseReleased(MouseEvent e){ 55 56 } 57 58 public void paint(Graphics g){ 59 for(int i = 0; i < 4; i++){ 60 61 int size = kame[i].points.size() - 1; 62 63 Point p_cur = kame[i].points.get(size - 1); 64 Point p_prev = kame[i].points.get(size - 1); 65 double dx = p_cur.x - p_prev.x; 66 double dy = p_cur.y - p_prev.y; 67 Usagi.move(dx, dy); 68 g.drawImage(imgs, kame[i].points.get(size).x, kame[i].points.get(size).y,this); 69 } 70 g.setColor(Color.black); 71 Usagi.paint(g); 72 } 73}
こんなかんじになりました。現在実行時エラーです(´;ω;`)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。