在他写的paint方法里面,有一个if的判断,如果shot.isLive=true 就执行画子弹,如果是false就把子弹从Vector里面拿走。我的想法是如果子弹要被拿除,应该是子弹接触到坦克的时候,执行这段代码,所以我就跳转到hitTank方法里面,方法中写有如果击中坦克,那么执行s.islive=false。我的疑惑是,这里的s.islive和最上面的shot.islive不是一个东西啊,那程序是怎么执行paint方法里面的if判断的呢?
引用 皆我百晓生 小程序回复内容作答:
程序执行paint方法里面的if判断是根据每个子弹对象的isLive
属性来确定是否执行画子弹的操作。在hitTank
方法中,当子弹击中坦克时,会将shot
对象的isLive
属性设置为false
,之后在循环中遍历enemyTank
的shots
列表,如果子弹的isLive
属性为true
,则执行画子弹的操作,否则移除该子弹。
所以,虽然s.isLive
和shot.isLive
不是同一个变量,但通过在hitTank
方法中修改s.isLive
的值,可以影响到paint
方法中的if判断,从而决定是否画出子弹。
顺便吐槽下两个细节问题:
应该是的islive,都是从列表中获取的,但是paint方没看到 啊
paint应该是每一帧都会执行的,因为子弹过一会儿就会移动一下,子弹被拿除有2个点,1是碰到坦克,1是超出距离或者超出屏幕。s和shot是一个东西,只是你下面这张图的子弹为什么挂在空坦克上,我看不明白。具体得看看这个数据存的方式
该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
根据您提供的截图,我们可以看到paint方法中的if判断语句是通过访问名为"shot"的变量来确定是否要画子弹或移除子弹。而在hitTank方法中,当子弹击中坦克时,设置了变量"s.isLive"为false。
根据您的描述,"shot.isLive"和"s.isLive"不是同一个变量,这可能是由于在代码其他部分定义了多个相关的变量。为了确定具体情况,建议您检查代码的其他部分,特别是在paint方法之外的地方,查找是否存在名为"shot"的变量。
如果"shot"变量确实在其他地方定义,并且与"s.isLive"变量没有关联,那么在hitTank方法中修改"s.isLive"的值不会直接影响到paint方法中的if判断。在这种情况下,您可能需要进一步修改代码,以确保在子弹击中坦克时正确地设置"shot.isLive"的值,以便在paint方法中进行适当的判断和处理。
请注意,由于我无法直接查看完整的代码,以上只是根据您提供的信息给出的一般建议。如需更准确的帮助,请提供更多相关代码或详细说明。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
存在两个不同的变量 s.isLive 和 shot.isLive,它们分别用于表示子弹的生存状态。程序中的 paint 方法中的 if 判断使用的是 shot.isLive,而 hitTank 方法中的 s.isLive 用于表示坦克的生存状态。
这两个变量是不同的,因为它们分别用于不同的对象:shot 表示子弹对象,s 表示坦克对象。在游戏中,通常会有多个子弹和多辆坦克,每个子弹和坦克都有自己的生存状态。
在 paint 方法中的 if 判断,用于检查是否要绘制子弹,是基于 shot.isLive 的值来做出的决定。如果 shot.isLive 为 true,则会执行绘制子弹的代码;如果 shot.isLive 为 false,则会将子弹从向量中移除,因此 paint 方法中的 if 与子弹的生存状态相关。
在 hitTank 方法中,s.isLive 用于表示被击中的坦克的生存状态。当坦克被击中时,将 s.isLive 设置为 false,表示该坦克已经被摧毁。这是坦克的状态,与子弹的生存状态是不同的。
跟踪代码走一遍,要有全局的审视代码各个变量
从列表获取的把
非零基础自学Java (老师:韩顺平) 第18章 坦克大战【2】 18.2 坦克大战 0.4
可以参考下
结合GPT给出回答如下请题主参考
在韩顺平java坦克大战的代码中,可以在 Bullet 类中添加一个 hitTank(Tank tank)
方法来检查子弹是否击中坦克,然后在 GameClient 的 repaint()
方法中调用该方法来判断子弹是否击中。
具体的代码实现如下:
首先在 Bullet 类中添加一个 hitTank()
方法,其中传入的参数为要判断的坦克对象:
public boolean hitTank(Tank tank) {
if (this.isLive && this.getRect().intersects(tank.getRect()) && tank.isLive()) {
this.isLive = false; // 子弹消失
tank.setLive(false); // 坦克消失
return true;
}
return false;
}
然后在 GameClient 的 repaint()
方法中添加以下代码:
for (int i = 0; i < bullets.size(); i++) {
Bullet b = bullets.get(i);
if (!b.isLive()) {
bullets.remove(b);
} else {
b.draw(g); // 画子弹
// 遍历所有坦克,检查子弹是否击中坦克
for (int j = 0; j < tanks.size(); j++) {
Tank t = tanks.get(j);
if (b.hitTank(t)) { // 判断子弹是否击中坦克
// 如果击中,从 Vector 中移除坦克和子弹
tanks.remove(t);
bullets.remove(b);
break;
}
}
}
}
其中 b.hitTank(t)
调用了 Bullet 类中的 hitTank()
方法来检查子弹是否击中坦克,如果击中,则从 Vector 中移除坦克和子弹。