问题描述
我正在开发一款小型太空射击游戏。这是学习JAVA的一种有趣的方式,我想确保自己做的正确。 该对象(飞船)在运行时(激光)正在生成其他对象。 (船->激光器)。
我已经这样实现了:
- 对象飞船绘制在屏幕上。当检测到触摸时,它将创建Laser类的 new 实例,然后将其添加到GameScreen类内部的静态LinkedList激光器中。
- GameScreen对象负责绘制和更新屏幕上的所有激光,飞船和效果。
自我解释。但是现在:
- detectCollision()被调用,所有与舰船相交的激光器都从LinkedList激光器中删除。
- 在游戏结束时(用户退出),我遍历存储在GameScreen.lasers链接列表中的Laser类的所有实例,并将它们全部设置为 null。还将列表设置为空。
这是释放分配的内存的正确方法吗?
激光创建:
abstract class Ship {
if (canShoot()) {
Laser laser = new Laser(new Rectangle(x,y,width,height)); // bounds
GameScreen.playerLasers.add(laser);
}}
激光处置:
public class GameScreen {
private void dispose() {
for (Laser laser : playerLasers) {
laser.bounds = null;
laser = null;
}
playerLasers = null;
}}
GameScreen类crashDetection():
public class GameScreen {
private void detectCollision() {
ListIterator<Laser> itr = playerLasers.listIterator();
while (itr.hasNext()){
Laser laser = itr.next();
if (laser.bounds.overlaps(ship.bounds)){
ship.health -= laser.damage;
laser.bounds = null;
laser = null;
itr.remove();
}}}}
解决方法
不是。
Java是垃圾回收系统。您不能“取消分配”。将东西设置为null不会使东西释放。
Java将自动清理所需的内容,而您无需执行任何操作即可实现该目的。您唯一需要担心的是编程逻辑。例如,在这种情况下,您确实需要进行itr.remove();
调用-这不是要释放Laser对象,而是要从游戏逻辑中删除lasershot。因此,删除空的分配行,最终得到:
if (laser.bounds.overlaps(ship.bounds)){
ship.health -= laser.damage;
itr.remove();
}