为什么我的鱼不转?

时间:2015-07-21 20:39:13

标签: java animation graphics

我无法将鱼类移到另一个地方,当它们到达右边缘或左边缘时转身。窗口是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 个答案:

答案 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);
而不是简单地交换标志。原因是,如果你只是交换标志,你就有可能让鱼被困在角落里。