探索Java编程中的天体模拟:从基础到引力实现
立即解锁
发布时间: 2025-08-18 01:46:28 订阅数: 4 

Greenfoot Java编程入门:游戏与模拟
### 探索Java编程中的天体模拟:从基础到引力实现
#### 1. 现有Body类
在编程实践中,`Body` 类是一个重要的存在。它继承自 `SmoothMover` 类,这意味着它可以使用 `SmoothMover` 类提供的一些方法。当我们将一个 `Body` 对象放入世界中时,可以通过对象的菜单交互式地调用某些继承的方法,但也有一些方法在当前阶段无法调用。
`Body` 类有两个构造函数,这是方法重载的一个例子。一个构造函数没有任何参数,也被称为默认构造函数;另一个构造函数有四个参数,允许我们创建具有自定义大小、质量、速度和颜色的天体。
```plaintext
// 示例代码,展示构造函数
// 默认构造函数
public Body() {
this(20, 300, new Vector(90, 1.0), defaultColor);
}
// 带四个参数的构造函数
public Body(int size, int mass, Vector velocity, Color color) {
// 初始化代码
}
```
默认构造函数让我们可以轻松地交互式创建天体,而无需指定所有细节。第二个构造函数则在 `Space` 类中用于创建太阳、行星和卫星等。
在构造函数中,`this` 关键字有两种用法。一种是在默认构造函数中调用另一个构造函数,如 `this(20, 300, new Vector(90, 1.0), defaultColor);`;另一种是用于区分同名的参数和实例字段,例如 `this.mass = mass;`。如果去掉 `this.`,写成 `mass = mass;`,代码虽然可以编译和执行,但实际上并没有将参数值赋给实例字段。
在类的顶部,有两个使用 `static final` 关键字声明的常量,分别是重力值和天体的默认颜色。常量的值不能改变,使用 `static` 关键字可以让所有该类的对象共享这个常量,避免每个对象都有一份副本。
```plaintext
// 示例代码,声明常量
private static final double GRAVITY = 0.001;
private static final Color defaultColor = new Color(248, 160, 86);
```
#### 2. 首次扩展:创建运动
现在,我们要让天体动起来。由于 `Body` 类继承自 `SmoothMover` 类,它可以使用 `move()` 方法。我们可以在 `Body` 类的 `act` 方法中添加对 `move()` 方法的调用。
```plaintext
// 示例代码,在act方法中调用move方法
public void act() {
move();
}
```
通过测试可以发现,天体默认会沿直线运动,因为运动的速度和方向由它们的速度向量决定,目前没有任何因素改变这个向量,所以运动是恒定的。
#### 3. Color类
在 `Body` 类和 `Space` 类的代码中,我们遇到了 `Color` 类。`Body` 类的第二个构造函数需要一个 `Color` 类型的参数,而在 `Space` 类中,我们可以使用 `new Color(248, 160, 86)` 这样的表达式来创建 `Color` 对象。
`Color` 类的构造函数有三个参数,分别代表红色、绿色和蓝色的分量,通过这三个基色的组合可以描述计算机屏幕上的任何颜色。
```plaintext
// 示例代码,创建Color对象
Color myColor = new Color(248, 160, 86);
```
如果要使用 `Color` 类,需要导入 `java.awt.Color` 包。如果忘记导入,会出现编译错误。
```plaintext
// 示例代码,导入Color类
import java.awt.Color;
```
#### 4. 添加引力
接下来,我们要为这个场景添加引力。当空间中有多个天体时,它们之间的引力应该会改变每个天体的运动。
首先,我们来看 `Body` 类的当前 `act` 方法,虽然目前代码中只有对 `move` 方法的调用,但注释提示我们在移动之前应该
0
0
复制全文


