我正在创建一个 sscce,但是这里发布的代码太多了,所以我将发布部分,希望你能关注!
所以,我有这个类叫做Ship
,在类中有这个:
块 1:
keyboard.keyPress("SPACE", new Runnable(){
@Override
public void run(){
Laser laser = new Laser(
new Sprite("/media/images/laser.png"),
sscce.Ship.this.room);
sscce.Ship.this.room.addGameObjectAt(
laser,
sscce.Ship.this.getX() + (sscce.Ship.this.getWidth() / 2) - 3,
sscce.Ship.this.getY());
}
});
当Space按键被按下时,它会创建一个Laser
对象,然后我们将它添加到游戏中,该对象存储在游戏中,ArrayList
然后在我的主游戏循环中绘制到屏幕上,该循环通过ArrayList
.
Laser
是一个非常简单的类,它看起来像这样:
块 2:
package JGame.GameObject;
import JGame.Room.Room;
public class Laser extends GameObject{
public Laser(Sprite sprite, Room room){
super(sprite, room);
move.moveToY(0 - this.getHeight(), 5, new Runnable(){
@Override
public void run(){
Laser.this.destroy.destroyGameObject();
}
});
}
}
所以 Chunk 1 创建 Chunk 2 然后将其添加到数组列表中。这一切都很好,花花公子!
块 3:
public void moveToY(int y, int speed, Runnable complete){
this.obj.moveEndY = y;
this.obj.moveAmountY = speed;
this.complete = complete;
this.obj.needsToMoveY = true;
}
这会向新创建的Laser
. 然后我们垂直移动对象(由块 2 定义并在主游戏循环中执行)。
下一部分是破坏游戏,我所说的休息是指一切都停止(事件监听器、移动等)。
从块 2 我说“当 moveToY 到达目的地时运行可运行代码”,可运行代码说要使用destroyGameObject()
. destory 看起来像这样,并在所有游戏对象构造函数(等)中Laser
初始化Ship
。
块 4:
package JGame.Actions;
import JGame.GameObject.GameObject;
import JGame.Room.Room;
public class DestroyAction extends Action{
GameObject obj;
Room room;
public DestroyAction(Room room, GameObject obj){
this.room = room;
this.obj = obj;
}
public void destroyGameObject(){
room.removeGameObject(this.obj);
}
}
块 4 只是告诉房间“嘿,我们需要从列表中删除这个对象”
块 5:
public class Room extends JPanel implements Runnable{
ArrayList<GameObject> gameObjects = new ArrayList<>();
public void run(){
try{
while(true){
// Do Event Listeners
// Move objects along Y axis
for(GameObject go : gameObjects){
if(go.needsToMoveY){
int objY = go.getY();
if(objY > go.moveEndY){
go.setY(objY - go.moveAmountY);
}else if(objY < go.moveEndY){
go.setY(objY + go.moveAmountY);
}else{
go.needsToMoveY = false;
// Executes Runnable parameter from moveToY()
go.move.actionComplete();
}
}
}
this.repaint();
Thread.sleep(roomSpeed);
}
}catch(Exception e){
}
}
public void removeGameObject(GameObject go){
gameObjects.remove(go);
System.gc();
}
}
所以,最后在块 5 中,这是主循环,很多代码已被删除,但这会测试它是否应该移动,如果完成,运行通过 moveToY() 作为 Runnable 传入的 actionComplete() . 好吧,这个 Runnable 说当它到达它的位置时删除对象。当它在 Runnable 1 时间内运行代码时,一切都会停止。运动停止;因此,如果发射了 2 个以上的激光,它们应该向上移动,但它们会停在它们的位置并且不会移动。键盘按钮停止工作,因此移动箭头Ship
不再响应,因此您可以向上/向下/向左/向右导航船,它只是位于第一次触发 Runnable 的最后一个位置。
那么... 为什么一切都停止了?我只想删除 Runnable 中的对象。