我无法将鱼类移到另一个地方,当它们到达右边缘或左边缘时转身。窗口是600 x 400.在方法void swim();
中,无论我改变什么,鱼都会到达同一个地方(鱼经过窗户的右边缘)。如何移动鱼,当它到达右边缘或左边并转向并移动到窗口的左边缘时?
注意:我使用的是GWindow
,这是我学校提供的课程。
import java.awt.Color;
import java.util.Random;
import uwcse.graphics.*;
/**
* A fish in a graphics window
*/
public class Fish {
public static final int LEFT_MOVING = 0;
public static final int RIGHT_MOVING = 0;
// The graphics window the fish belongs to
private GWindow window;
// The location of the fish
private int x;
private int y;
// Scale of the drawing of the fish
private double scale;
private Color color;
private int direction;
private Oval O1; Oval O2;
private Triangle tail1; Triangle tail2;
private Line eye1; Line eye2;
/**
* Draws a Fish in a graphics window
*
* @param x
* the x coordinate of the location of the fish
* @param y
* the y coordinate of the location of the fish
* @param scale
* the scale of the drawing of the fish
* @param window
* the graphics window the fish belongs to
*/
public Fish(int x, int y, double scale,int direction, GWindow window) {
// Initialize the instance fields
this.x = x;
this.y = y;
this.scale = scale;
this.window = window;
this.color = randomColor();
this.direction = direction;
// Draw the fish
this.draw();
}
private Color randomColor(){
Random random = new Random();
int R = random.nextInt(256);
int G = random.nextInt(256);
int B = random.nextInt(256);
return new Color(R,B,G);
}
/**
* Draws this fish
*/
private void draw() {
int Fsize = (int)(this.scale*15);
this.O1 = new Oval(
this.x - Fsize /3,
this.y - Fsize /7 ,
Fsize + 4*Fsize/3,
Fsize + Fsize/5,
this.color,true);
this.tail1 =new Triangle(
this.x - Fsize,
this.y,
this.x - 2/Fsize,
this.y + Fsize/2,
this.x - Fsize,
this.y + Fsize,this.color,true);
this.eye1 = new Line(
this.x + 15*Fsize/10,
this.y + 5*Fsize/10 ,
this.x + 15 *Fsize/10,
this.y + 5* Fsize /10,
Color.BLACK);
Oval O2 = new Oval(
this.x - 37*Fsize/5,
this.y+ 27*Fsize/5 ,
Fsize + 2*Fsize/3,
Fsize + Fsize/5,
this.color,true);
Line eye2 = new Line(
this.x - 35*Fsize/5,
this.y + 30*Fsize/5,
this.x - 35*Fsize/5,
this.y + 30*Fsize/5, Color.BLACK);
Triangle tail2 =new Triangle(
this.x - Fsize*5 ,
this.y + 13*Fsize/2,
this.x - 10*Fsize/2,
this.y + 11*Fsize/2,
this.x - Fsize*6,
this.y + Fsize*6,this.color,true);
this.window.add(O1);
this.window.add(O2);
this.window.add(tail2);
this.window.add(tail1);
this.window.add(eye1);
this.window.add(eye2);
}
public void moveBy (int dx, int dy){
x += dx;
y += dy;
}
public void swim(){
if (RIGHT_MOVING >= 250 || this.direction == RIGHT_MOVING){
this.O1.moveBy(3,0);
this.tail1.moveBy(3,0);
this.eye1.moveBy(3,0);
}
}
}
答案 0 :(得分:1)
您需要测试与边界的鱼碰撞,如果是,则更改动画设置以更改移动方向。这将需要在您移动鱼的代码中使用if块或两个块。在伪代码中,它看起来像:
if fish location is equal to or less than 0
change deltaX to a positive value
if fish location + fish width is equal to or greater than width of tank
change deltaX to a negative value
move fish by deltaX
我通常使用detlaX的绝对值,即
deltaX = Math.abs(deltaX);
和
deltaX = -Math.abs(deltaX);
而不是简单地交换标志。原因是,如果你只是交换标志,你就有可能让鱼被困在角落里。