我在编程的第二年,只知道Java。但是对于我的班级,我们必须创建一个垂直的横向滚动条。我的设置是我有一个用于敌舰的 ArrayList 和一个用于玩家火箭的 ArrayList。我使用 render(Graphics2D g) 方法在玩家飞船上的精确位置绘制了 2 枚火箭,并使用相同的方法绘制了敌方飞船。火箭 ArrayList 由
arsenal.add(r);
arsenal.add(r2);
其中 r 和 r2 是带有参数 (x,y,w,h) 的火箭,arsenal 是火箭数组列表。我将它们设置在非常特定的位置,在宇宙飞船的不同末端。在 update() 方法中,我有这个方法:
if (arsenal.size() < 0){
arsenal.add(new Rocket(p.currentX(), p.getHalfY(),30,30));
arsenal.add(new Rocket(p.getHalfX(), p.getHalfY(), 30, 30));
}
这是为了确保当 arraylist 变空时,火箭被重新添加并重新绘制到与飞船末端相对应的坐标。火箭消失的唯一方法是它们离开屏幕或与敌人相撞。我已将此代码放入以检查:
for(int x = army.size()-1; x >= 0; x--){
if (army.get(x).getR().y > 1024){
army.remove(x);
}
if(p.intersects(army.get(x).getR())){
army.remove(x);
p.changeH(10);
}
for (int q = arsenal.size()-1; q>=0;q++){
if (arsenal.get(q).intersects(army.get(x).getR())){
score+=20;
army.remove(x);
arsenal.remove(q);
}
}
}
整个方法遍历敌舰数组列表“军队”并检查 (1) 敌舰是否超过设定高度,(2) 玩家舰船是否与敌舰相撞,以及 (3) 火箭是否军械库中的阵营已经与敌军相撞。所有碰撞都是使用矩形完成的。p.changeH(10); 命令是降低玩家生命值10,得分+=20;就是提高分数。对于所有这些检查,我确保敌舰将自己从阵列列表中移除,因此变得未绘制,然后如果火箭离开屏幕或发生碰撞,它们也会将自己从阵列列表中移除并假设自己取消绘制。我想要做的最后一件事值得一提的是,敌对势力变得由以下人员组成:
if (frameCount % 100 == 0){
Random r = new Random();
int randX = r.nextInt(width - 10);
army.add(new EnemyShip(randX, -200 , 47, 47, enemyP1));
}
它接受参数 (x,y,w,h,Image) 并首先在屏幕外绘制,使其看起来像一个横向滚动条。x 变量是随机的,因此船只不会全部出现在同一个地方。frameCount 每次更新都会增加 1,并且 update() 方法每秒被调用 60 次。
在对我的项目进行了这么大的介绍之后,我的问题是每当我运行游戏时,游戏会在几秒钟后停止,并且 eclipse 在代码中给了我一个错误:
if (arsenal.get(q).intersects(army.get(x).getR())){
我无法弄清楚问题所在。任何帮助是极大的赞赏。如果需要更多游戏代码,请告诉我!谢谢!
编辑:
GameScreen.update(GameScreen.java:108)
带我去排队:
if (arsenal.get(q).intersects(army.get(x).getR())){
这是循环的一部分:
for (int q = arsenal.size()-1; q>=0;q++){
if (arsenal.get(q).intersects(army.get(x).getR())){
score+=20;
army.remove(x);
arsenal.remove(q);
}
}
在构造函数中是我放置命令的地方
arsenal.add(r);
arsenal.add(r2);
这会将它们添加到数组列表中。在 render(Graphics2D g) 方法中,我使用以下方法绘制它们:
for (Rocket r :arsenal){
r.draw(g);
}
在火箭构造函数中,p.currentX() 是玩家当前的 x 坐标,而 p.getHalfY() 和 p.getHalfX() 是不言自明的。它们被编码使得火箭 r 出现在一侧,火箭 r2 出现在另一侧。我还创建了两个布尔变量 rMove 和 r2move。这些有助于火箭的平稳移动,并告诉它何时移动:
if (!r2move){
r2.setP(p.getR().x + 40, currentY + 12);
}
if(!rMove){
r.setP(p.currentX() - 10, currentY + 12);
}
setP(x,y) 将火箭的位置设置为原始位置。我已经和我的老师谈过了,他说我有点同时使用数组列表和单独的对象,但是我不明白这个问题。如果您需要更多相关代码,请告诉我。这行代码还告诉火箭何时移动,即触发空格键的时间:
if (rMove && r2move){
for (Rocket p:arsenal){
p.move();
}
}
if(r.getR().y < 0){
rMove = false;
space = false;
}
if (r2.getR().y < 0){
r2move = false;
space = false;
}