0

所以我是java入门,我的技能有限,我们的老师要我们做一个屏幕保护程序。我的目标是 2 有多个热气球物体同时在屏幕上弹跳,当它们撞到墙上时,它们会随机改变方向。我让一个气球随机弹跳,只是它有时会假发并且仍然离开屏幕,但我认为这个问题出在我的数学中。
我需要帮助的问题是,当我向小程序添加第二个图像时,两个图像似乎是链接的,它们移动完全相同,当一个改变方向时另一个改变方向,唯一不同的是起始坐标,我如何制作它们彼此分开?这是我的代码。

***
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(); 
            }
        }   
    }
}
4

2 回答 2

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 解决问题的响应。

于 2013-04-17T17:51:15.800 回答
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);
于 2013-04-17T17:48:25.120 回答