如何使两个相同的图像彼此分开?

时间:2013-04-17 17:44:56

标签: java

所以我介绍java并且我的技能有限,我们的老师希望我们制作屏幕保护程序。我的目标是2让多个热气球对象同时在屏幕周围反弹,当他们撞到墙壁时,他们会随机改变方向。我有一个气球随机弹跳,除了它有时会退出并仍然离开屏幕,我认为这个问题在我的数学中。 我需要帮助的问题是,当我向applet添加第二个图像时,两个图像看起来都是链接的,它们移动完全相同,当一个图像改变方向时另一个唯一不同的是起始坐标,我该如何制作它们彼此分开? 继承我的代码。

***
import acm.program.*;
import acm.graphics.*;
import java.awt.Color;

public class HotAirBalloons extends GraphicsProgram
{

    private static final int APPLET_WIDTH = 800;
    private static final int APPLET_HEIGHT = 600;
    private int speedX = 1;
    private int speedY = 1;

    public void init()
    {
        setSize(APPLET_WIDTH,APPLET_HEIGHT);
        setBackground(new Color(100,210,255));
    }

    public void moveRandomDirection()
    {
        double direction = Math.random() * 2.0 * Math.PI;
        double speed = 3.0;
        speedX = (int) (speed * Math.cos(direction));
        speedY = (int) (speed * Math.sin(direction));
    }

    public void run()
    {

        GImage img1 = new GImage("balloon.jpg");
        add(img1, 0, 0);
        GImage img2 = new GImage("balloon.jpg");
        add(img2, 200, 200);

        while(true)
        {
            pause(15);
            img1.move(speedX, speedY);
            img2.move(speedX, speedY);

            if (img1.getX() > APPLET_WIDTH - 50)
            {
                moveRandomDirection(); 
            }

            if (img1.getX() < 1)
            {
                moveRandomDirection(); 
            }

            if (img1.getY() +85 > APPLET_HEIGHT)
            {
                moveRandomDirection(); 
            }
            if (img1.getY() < 1)
            {
                moveRandomDirection(); 
            }
            if (img2.getX() > APPLET_WIDTH - 50)
            {
                moveRandomDirection(); 
            }

            if (img2.getX() < 1)
            {
                moveRandomDirection(); 
            }

            if (img2.getY() +85 > APPLET_HEIGHT)
            {
                moveRandomDirection(); 
            }
            if (img2.getY() < 1)
            {
                moveRandomDirection(); 
            }
        }   
    }
}

2 个答案:

答案 0 :(得分:2)

这应该有效:

import acm.program.*;
import acm.graphics.*;
import java.awt.Color;
import java.awt.Point;

public class HotAirBalloons extends GraphicsProgram
{
    private int speed1 = new Point(1, 1);
    private int speed2 = new Point(1, 1);

    public Point moveRandomDirection()
        {
            double direction = Math.random() * 2.0 * Math.PI;
            double speed = 3.0;
            return new Point((int) (speed * Math.cos(direction)), (int) (speed * Math.sin(direction)));
        }

    public void run()
    {

        GImage img1 = new GImage("balloon.jpg");
        add(img1, 0, 0);
        GImage img2 = new GImage("balloon.jpg");
        add(img2, 200, 200);

        while(true)
        {
            pause(15);
            img1.move(speed1.x, speed1.y);
            img2.move(speed2.x, speed2.y);



            if (img1.getX() > APPLET_WIDTH - 50 || img1.getX() < 1)
            {
                speed1 = moveRandowmDirection();
            }

            if (img1.getY() +85 > APPLET_HEIGHT || img1.getY() < 1)
            {
                speed1 = moveRandomDirection(); 
            }

            if (img2.getX() > APPLET_WIDTH - 50 || img2.getX() < 1)
            {
                speed2 = moveRandomDirection(); 
            }

            if (img2.getY() +85 > APPLET_HEIGHT || img2.getY() < 1)
            {
                speed2 = moveRandomDirection(); 
            }
        }   
    }
}

编辑:这修复了“链接”行为,当图像与边缘发生碰撞时,我投票反对Rob Watts对修复问题的回应。

答案 1 :(得分:1)

您对两个气球使用相同的speedX和speedY变量。给他们自己的速度变量。

此外,气球“有时会摆脱”的原因是,当您选择随机方向时,您没有指定它不能朝向您试图让它们离开的方向

为了解决这个问题,我建议你为每个气球创建一个moveRandomDirection方法,一个值的传递表示它们击中了哪个边缘。然后将它们可以移动的方向限制为任何其他方向。

试试这个:

public void moveBalloonOneInRandomDirection(int whichEdge)
{
    double direction = 0;
    switch(whichEdge) {
    case(0): // Top edge
        direction = Math.random() * Math.PI + ONLY_ALLOW_DOWN_VAL;
    case(1): // Left edge
        direction = Math.random() * Math.PI + ONLY_ALLOW_RIGHT_VAL;
    case(2): // Bottom edge
        direction = Math.random() * Math.PI + ONLY_ALLOW_UP_VAL;
    case(3): // Right edge
        direction = Math.random() * Math.PI + ONLY_ALLOW_LEFT_VAL;
    }
    double direction = Math.random() * 2.0 * Math.PI;
    double speed = 3.0;
    speedX1 = (int) (speed * Math.cos(direction));
    speedY1 = (int) (speed * Math.sin(direction));
}

然后在你的if语句中,你会有这样的东西:

if (img1.getX() > APPLET_WIDTH - 50) // Right edge
{
    moveBalloonOneInRandomDirection(3);
}

您可能也应该使用常量,这样您就可以使用

代替“幻数”
private static final int RIGHT_EDGE = 3;
...
moveBalloonOneInRandomDirection(RIGHT_EDGE);