我正在努力用Java制作一个自上而下的射手克隆。一个小时后,我能够想出如何定位船的射弹,这是一个激光相对于船的精灵的方向。问题是,如果我移动船,当我移动船时,射弹相对于船的方向。正如您所看到的那样,这是一个问题,因为激光器应该独立移动,无论船舶何时被发射。
以下是提出问题的代码:
private Image ship;
private int ship_dx = 500;
private int ship_dy = 400;
private int ship_velocity = 5;
private boolean isLaser = false;
private static final int laser_DyOffSetOfBall = 48;
private static final int laser_DxOffSetOfBall = 23;
private Image laser;
private int laser_dx = ship_dx+laser_DxOffSetOfBall;
private int laser_dy = ship_dy-laser_DyOffSetOfBall;
private int laser_velocity= 10;
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(ship, ship_dx, ship_dy, this);
if(isLaser){
laser_dy -= laser_velocity;
laser_dx = ship_dx+laser_DxOffSetOfBall;
g.drawImage(laser,laser_dx,laser_dy,this);
if(laser_dy < 50)
{
isLaser = false;
laser_dy = ship_dy-laser_DyOffSetOfBall;
}
}
Toolkit.getDefaultToolkit().sync();
}
这是游戏!:
答案 0 :(得分:1)
错误在行laser_dy = ship_dy - ....
你想要独立于船只位置绘制射弹,所以不要使用ship_dy和ship_dy,而是将射弹startPos存放在单独的可变形状中,在船舶移动过程中不会改变;
类似
laserStartX = ship_dx;
laserStartY = ship_dy;
以后:
laser_dx = laserStartX + laserDxOffsetBall;
同样适用于laser_dy
答案 1 :(得分:1)
您只需在第一次绘制激光时设置激光的x位置,否则每次重绘时激光都会相对于船舶水平移动。为此,您可以添加另一个布尔值isFirst(用于激光的第一个绘制),当isLaser第一次变为true时设置为true,并且仅当isFirst为true时设置x位置。
boolean isFirst = true;
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(ship, ship_dx, ship_dy, this);
if(isLaser){
laser_dy -= laser_velocity;
if(isFirst){
laser_dx = ship_dx+laser_DxOffSetOfBall;
isFirst = false;
}
g.drawImage(laser,laser_dx,laser_dy,this);
if(laser_dy < 50)
{
isLaser = false;
laser_dy = ship_dy-laser_DyOffSetOfBall;
}
} else {
isFirst = true;
}
Toolkit.getDefaultToolkit().sync();
}