2011-11-04 79 views
0

我有一只只要按下箭头键就会移动的鸡形象,当我开始运行程序时,图像总是出现在左下角。我的问题是,如何让图像出现在屏幕的顶部或任何位置(左下角除外),并且按下箭头键时图像仍然移动。我不太确定,但我认为这个问题来自我的translate()。我的计算有什么问题吗?感谢您分享您的想法...如何让我的图像出现在随机位置?

下面的代码...

public class Chicken extends Sprite implements ImageObserver 
{ 
private java.awt.Image fishImage; 
private final Board board; 
private double x; 
private double y; 
private final double chickenHeight = 1.6; 
private final double chickenWidth = 1.8; 
private double speed; 
private boolean visible; 
private double angle; 
private double dx_m; 
private double dy_m; 
private boolean collision = false; 

public Chicken(Board board, String name, double x, double y, double speed) 
{ 
    super(name); 

    this.board = board; 
    this.x = x; 
    this.y = y; 
    this.speed = convertToMeterPerSecond(speed); 
    visible = true; 

    URL iU = this.getClass().getResource("chicken.jpg"); 
    ImageIcon icon = new ImageIcon(iU); 
    chickenImage = icon.getImage(); 
} 

public Image getImage() 
{ 
    return chickenImage; 
} 

public void keyPressed(KeyEvent e) 
{ 

    int key = e.getKeyCode(); 

    if (key == KeyEvent.VK_LEFT) 
    { 
     dx_m = -0.5; 
    } 
    if (key == KeyEvent.VK_RIGHT) 
    { 
     dx_m = 0.5; 
    } 
    if (key == KeyEvent.VK_UP) 
    { 
     dy_m = 0.5; 
    } 
    if (key == KeyEvent.VK_DOWN) 
    { 
     dy_m = -0.5; 
    } 
} 

public void keyReleased(KeyEvent e) 
{ 
    int key = e.getKeyCode(); 

    if (key == KeyEvent.VK_LEFT) 
    { 
     dx_m = 0; 
    } 
    if (key == KeyEvent.VK_RIGHT) 
    { 
     dx_m = 0; 
    } 
    if (key == KeyEvent.VK_UP) 
    { 
     dy_m = 0; 
    } 
    if (key == KeyEvent.VK_DOWN) 
    { 
     dy_m = 0; 
    } 
} 

@Override 
public void move(long dt) 
{ 

    double right_wall = board.x1_world; 
    double up_wall = board.y1_world; 
    double down_wall = 0.0; 
    double left_wall = 0.0; 

    x += dx_m; 
    y += dy_m; 

    if (x >= right_wall) 
    { 
     x = right_wall;   
    } 
    if (y > up_wall) 
    { 
     y = up_wall; 
    } 
    if (x <= left_wall) 
    { 
     x = left_wall; 
    } 
    if (y < down_wall) 
    { 
     y = down_wall; 
    } 
} 

@Override 
public void render(Graphics2D g2d) 
{ 
    AffineTransform t = g2d.getTransform(); 
    final double foot_position_y = chickenHeight; 
    final double foot_position_x = chickenWidth/2; 

    double xx = board.convertToPixelX(x - foot_position_x); 
    double yy = board.convertToPixelY(y + foot_position_y); 
    g2d.translate(xx, yy); 
//  ratio for the actual size of the Image 
    double x_expected_pixels = chickenHeight * board.meter; 
    double y_expected_pixels = chickenWidth * board.meter; 

    double w = ((ToolkitImage) chickenImage).getWidth(); 
    double h = ((ToolkitImage) chickenImage).getHeight(); 

    double x_s = x_expected_pixels/w; 
    double y_s = y_expected_pixels/h; 
    g2d.scale(x_s, y_s); 
    g2d.drawImage(getImage(), (int) x, (int) y, this); 
    g2d.setTransform(t); 
} 

@Override 
public void moveAt(double distance_x, double distance_y) 
{ 
    this.x = (int) distance_x; 
    this.y = (int) distance_y; 
} 

public void setAngle(double angle) 
{ 
    this.angle = angle; 
} 

@Override 
public RectangleX getBounds() 
{ 
    return new RectangleX(x, y, chickenWidth, chickenHeight); 
} 

@Override 
public double getWidth() 
{ 
    return WIDTH; 
} 

@Override 
public double getHeight() 
{ 
    return HEIGHT; 
} 

@Override 
public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) 
{ 
    return true; 
} 

} 

,这是我的鸡类

public double meter; 
int y1_pixel; 

y1_pixel = getHeight(); 

public int convertToPixelX(double distance) 
{ 
    return (int) (distance * meter); 
} 

public int convertToPixelY(double y_world) 
{ 
    return (int) (y1_pixel - (y_world * meter)); 
} 

这是从我的板类的到来。

+0

我认为[这](http://stackoverflow.com/questions/7980051/how-to-make-a-random-position-whenever-i-start-running-the-program/7980205# 7980205)可能是你的答案。 – Andy

回答

2

您的渲染方法使用类的x和y坐标来确定每次绘制鸡的位置。解决您的问题的一个简单方法是在创建鸡实例时为x和y使用随机值。

另一种解决方案是创建另一个构造函数,它不取值为x或y,而是将它们设置为0和board.x1_world或board.y1_world之间的任何位置的默认值,具体取决于变量。

public Chicken(Board board, String name, double speed) 
{ 
    this(board, name, 
      (int)(Math.random() * (board.x1_world - chickenWidth)), 
      (int)(Math.random() * (board.y1_world - chickenHeight)), 
      speed); 
}