2015-07-21 40 views
0

我无法将我的鱼移动到另一个地方,并在到达右侧或左侧边缘时出现问题。窗口是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); 
     } 
    }  
}  

回答

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); 

,而不是简单地交换的迹象。原因是,如果你只是交换标志,你可能会让鱼被困在角落。