我还是Java的新手,我对如何使用对象感到困惑。我知道
object object = new object();
但必须手动访问这些内容。
说我想创造一个粒子效果。小白点出现在屏幕的中心,并以随机的角度慢慢移动到屏幕的边缘。当他们接近时,他们走得更快。最后,如果它们离开视图区域,它们将被删除。
如果我想用对象做这个,我需要能够:
如何自动制作/销毁对象,并从所有对象中获取数据,而不管有多少对象存在? 现在,我的游戏(好吧,我只用Java做过1次)仅限于使用阵列和一种细胞自动机,但这对大型游戏不起作用。
这可能之前已经被问过,或者可能有关于此的教程,但我设法找到的只是手动制作对象。我可能正在寻找错误的东西,对不起,如果是这样的话。
答案 0 :(得分:3)
在java中你不会破坏对象。有垃圾收集器,它会破坏未使用的对象。将null值赋给保存对象的变量就足够了。
您可以通过System.gc()手动调用垃圾收集器。
答案 1 :(得分:0)
我不确定“自动创建对象”是什么意思,但这就是构造函数的用途。定义构造函数时,可以在其中添加各种实现和初始化详细信息,这些详细信息将创建您的变量,使其完全按照您希望的方式创建。见"Providing Constructors for your classes"。所以说你有一点......
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 and mutators)获取和设置这些类中的信息。
public int getX() {
return x;
}
public void setX(int x) {
this.xPos = x;
}
要从现有的所有对象中收集数据,而不管有多少,只需将它们全部添加到某种List
即可。您甚至可以将它们添加到构造函数中的private static ArrayList<T>
并静态访问ArrayList<T>
以获取您的信息,而程序的其他部分则无需“知道”有多少。
有几种方法可以实现逐帧更改,但我更喜欢使用Timer
和ActionListener
。这允许您设置帧速率,并使用public void actionPerformed(ActionEvent)
方法执行所需的操作。对于初学者来说这有点复杂,所以你可能不得不做一些好的阅读和测试。请参阅"How to Write an Action Listener"和"How to Use Swing Timers"以帮助您入门。
Java中没有像C ++这样的语言中的析构函数。相反,有一个garbage collector周期性地(偶尔地)运行,它会破坏它认为不再有指向它们的引用的所有对象。因此,如果您希望垃圾收集器在超出范围时拾取对象,只需将对它们的所有引用分配给 null 。虽然这不会立即破坏对象,但它确保垃圾收集器在下次运行时“标记”它们。
如前所述,System.gc()
是一种“调用”垃圾收集器的方法。但是,您不应该假设调用它将强制垃圾收集器运行。在API中,它表示此调用“建议”系统应该运行垃圾收集器。最终,它不可靠,垃圾收集通常超出了您的控制范围。
来自the API:
调用gc方法表明Java虚拟机花费了大量精力来回收未使用的对象,以使其当前占用的内存可用于快速重用。当控制从方法调用返回时,Java虚拟机已尽最大努力从所有丢弃的对象中回收空间。
此外,作为侧边选择,请确保在创建对象时将类名称大写。 :)
Object object = new Object();
对于OP的特定目的:如果您担心游戏环境中“正在绘制存在的所有内容”(并且您希望立即销毁对象 为了确保游戏正常运行,请考虑使用List
或Set
并将其填充到您想要绘制的内容中,然后在它们离开屏幕时将其删除。
<强>参考文献:强>
答案 2 :(得分:0)
自动制作对象
答案:您始终需要new
newInstance
才能在java中创建对象。这将基于算法。举个例子。您可以使用二维数组来保存对象,并且可以根据X,Y位置将对象放在该数组中,并使用Random类生成X,Y位置。
e.g。
//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.