所以我介绍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();
}
}
}
}
答案 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);