2

我对 Java 还有些陌生,我对应该如何使用对象感到很困惑。我知道

object object = new object();

但这些必须手动访问。

说我想创建一个粒子效果。屏幕中央出现小白点,并以随机角度缓慢移动到屏幕边缘。当他们靠近时,他们走得更快。最后,如果它们超出视图区域,它们将被移除。

如果我想对对象执行此操作,我需要能够:

  • 自动制作对象
  • 从每个对象(它们的 X 和 Y 坐标)收集数据,以便可以渲染它们
  • 让对象每帧更新一次,以便提高速度
  • 当它们超出范围时销毁对象。

我将如何自动制造/销毁对象,并从所有对象中获取数据,而与存在多少对象无关?现在,我的游戏(嗯,我只用 Java 制作过 1 个)仅限于使用数组和一种元胞自动机,但这不适用于更大的游戏。

这可能以前被问过,或者可能有关于这个的教程,但我设法找到的只是手动制作对象。我可能正在寻找错误的东西,如果是这种情况,请见谅。

4

3 回答 3

2

在java中你不会破坏对象。有垃圾收集器,它会销毁未使用的对象。将空值分配给保存对象的变量就足够了。

您可以通过 System.gc() 手动调用垃圾收集器。

于 2012-09-21T13:03:28.950 回答
0

创建对象

我不确定“自动创建对象”是什么意思,但这就是构造函数的用途。当您定义构造函数时,您可以在其中添加各种实现和初始化细节,这些细节将完全按照您希望的方式创建变量。请参阅“为您的类提供构造函数”。所以说你有道理...

public Point(int x, int y) {
    this.xPos = x;
    this.yPos = y;
    this.color = Color.BLUE;
    this.size = Constants.DEFAULT_POINT_SIZE;
    // ... etc.
}

从对象收集数据

在这些类中获取和设置信息将通过 getter 和 setter(也称为accessors 和 mutators)来实现。

public int getX() {
    return x;
}

public void setX(int x) {
    this.xPos = x;
}

要从存在的所有对象中收集数据,无论有多少,只需将它们全部添加到List某种对象中即可。您甚至可以将它们添加到private static ArrayList<T>您的构造函数中并ArrayList<T>静态访问您的信息,而无需程序的另一部分“知道”有多少。

增量 GUI 更改

有几种方法可以实现逐帧更改,但我更喜欢使用 aTimer和 an ActionListener。这允许您设置帧速率,并在public void actionPerformed(ActionEvent)方法中执行您需要的操作。这对于初学者来说有些复杂,因此您可能需要做大量的阅读和测试。请参阅“如何编写动作侦听器”“如何使用 Swing 计时器”来帮助您入门。

销毁对象

Java 中没有析构函数,就像 C++ 之类的语言中那样。相反,有一个垃圾收集器会定期(偶尔)运行,它会销毁它认为不再有指向它们的引用的所有对象。因此,如果您希望垃圾收集器在对象超出范围时拾取它们,只需将对它们的所有引用分配给null。虽然这不会立即销毁对象,但它确保垃圾收集器在下一次运行时将它们“标记”。

如前所述,System.gc()是一种“调用”垃圾收集器的方法。但是,您不应该假设调用它会强制垃圾收集器运行。在 API 中,它说这个调用“建议”系统应该运行垃圾收集器。最终,它是不可靠的,垃圾收集通常超出了您的控制范围。

API

调用 gc 方法表明 Java 虚拟机花费精力回收未使用的对象,以使它们当前占用的内存可用于快速重用。当控制从方法调用返回时,Java 虚拟机已尽最大努力从所有丢弃的对象中回收空间。

此外,作为一个侧面的选择,请确保在创建对象时将类名大写。:)

Object object = new Object();

对于 OP 的特定目的:如果您担心“绘制所有存在的东西”的游戏环境(因此您想立即销毁对象以确保游戏正确运行),请考虑使用ListorSet并使用你想画的东西,然后在它们离开屏幕时将它们移除。


参考:

于 2012-09-21T13:19:07.943 回答
0

自动制作对象

答:您总是需要new newInstance在 java 中创建对象。这将基于算法。只是举个例子。您可以有一个二维数组来保存对象,并且基于 X、Y 位置,您可以将对象放入该数组中并使用 Random 类来生成 X、Y 位置。

例如

    //Initialize pallete
    Point [][] pallete = Point int [800][600];
    //Generate Objects

    Random random = new Random();
    int x = random.nextInt(800);
    int y = random. nextInt(600);

    Point point = new Point(x,y);

    //Put inside Pallete

    pallete[point.x][point.y] = point;

从每个对象(它们的 X 和 Y 坐标)收集数据,以便可以渲染它们

答:如上所示,为您想要的对象声明属性,就像我为 Point [x, y] 声明的那样

让对象每帧更新一次,以便提高速度

答:使用循环或定时器等提高生成速度。

当它们超出范围时销毁对象。

回答:只需将其初始化为 null,它就会被 GC 处理。如果您遇到 OutOfMemory 问题,那么有几种方法可以解决它,但除非有需要,否则您不应该专注于此。

 point = null;//This is it.
于 2012-09-21T13:21:09.393 回答