2015-07-21 60 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); 

,而不是簡單地交換的跡象。原因是,如果你只是交換標誌,你可能會讓魚被困在角落。