java - 如何让我的图像出现在随机位置?

标签 java random collision

我有一个鸡图像,只有当我按下箭头键时才会移动,当我开始运行程序时,该图像总是出现在左下角。我的问题是,如何使图像出现在屏幕顶部或屏幕上的任何位置(左下角除外),并且当我按箭头键时图像仍然移动。我不太确定,但我认为这个问题来 self 的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));
}

这是来 self 的董事会类(class)。

最佳答案

您的渲染方法使用类的 x 和 y 坐标来确定每次绘制鸡的位置。解决问题的一个简单方法是在创建 Chicken 实例时对 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 );
}

关于java - 如何让我的图像出现在随机位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8004612/

相关文章:

java - 用 Java 表示和比较地理位置

c++ - 如何在不同线程中随机播种

random - 如何在 Julia 中生成一系列随机 float ?

python - 生成并要求输入随机生成的密码

javascript - 等距 3D 碰撞检测

javascript - 2d html5 Canvas 碰撞,howto

时间校正 Verlet 积分和太大的时间步长

java - Android runOnUiThread 执行顺序

java - 如何避免通用数组上的 @SuppressWarnings

java - OAuth2RestTemplate 将字符集添加到内容类型 header 中