Java 步行和射击不能斜行
Hy,我管理输入游戏有问题 我会在8个方向上执行所有8个移动+拍摄,现在我可以在8个方向上移动,但在8个方向上固定拍摄,并在北、南、东、西和东北移动和拍摄 我有5个volatile布尔值(如果没有volatile,问题不会改变) 当键绑定时按箭头键时设置为真,否则设置为假Java 步行和射击不能斜行,java,Java,Hy,我管理输入游戏有问题 我会在8个方向上执行所有8个移动+拍摄,现在我可以在8个方向上移动,但在8个方向上固定拍摄,并在北、南、东、西和东北移动和拍摄 我有5个volatile布尔值(如果没有volatile,问题不会改变) 当键绑定时按箭头键时设置为真,否则设置为假 private void setKeyBindings() { InputMap inMap = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); Act
private void setKeyBindings() {
InputMap inMap = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
ActionMap actMap = getActionMap();
inMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, false), "UP" + "pressed");
inMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, true), "UP" + "released");
actMap.put( "UP" + "pressed", new AbstractAction() {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
//directionMap.put(direction, true);
north=true;
}
});
actMap.put("UP" + "released", new AbstractAction() {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
//directionMap.put(direction, false);
north=false;
}
});
inMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, false), "DOWN" + "pressed");
inMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, true), "DOWN" + "released");
actMap.put( "DOWN" + "pressed", new AbstractAction() {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
//directionMap.put(direction, true);
south=true;
}
});
actMap.put("DOWN" + "released", new AbstractAction() {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
//directionMap.put(direction, false);
south=false;
}
});
inMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0, false), "LEFT" + "pressed");
inMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0, true), "LEFT" + "released");
actMap.put( "LEFT" + "pressed", new AbstractAction() {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
//directionMap.put(direction, true);
west=true;
}
});
actMap.put("LEFT" + "released", new AbstractAction() {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
//directionMap.put(direction, false);
west=false;
}
});
inMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, false), "RIGHT" + "pressed");
inMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, true), "RIGHT" + "released");
actMap.put( "RIGHT" + "pressed", new AbstractAction() {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
//directionMap.put(direction, true);
east=true;
}
});
actMap.put("RIGHT" + "released", new AbstractAction() {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
//directionMap.put(direction, false);
east=false;
}
});
inMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0, false), "SPACE" + "pressed");
inMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0, true), "SPACE" + "released");
actMap.put( "SPACE" + "pressed", new AbstractAction() {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
//directionMap.put(direction, true);
shoot=true;
}
});
actMap.put("SPACE" + "released", new AbstractAction() {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
//directionMap.put(direction, false);
shoot=false;
}
});
inMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_X, 0, false), "SUCCESSIVA" + "pressed");
actMap.put( "SUCCESSIVA" + "pressed", new AbstractAction() {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
//directionMap.put(direction, true);
mondo.player.selectArmaSuccessiva();
}
});
inMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_Z, 0, false), "PRECEDENTE" + "pressed");
actMap.put( "PRECEDENTE" + "pressed", new AbstractAction() {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
//directionMap.put(direction, true);
mondo.player.selectArmaPrecedente();
}
});
}
在线程中控制布尔变量也实现对角运动
if(shoot){
System.out.println("SHOOT");
if(mondo.player.selectArm!=-1)
mondo.proiettili.add(mondo.player.spara());
}
if(north && west && !south && !east){
System.out.println("NORD OVEST");
mondo.player.direction=(PuntiCardinali.NORTH_WEST);
}
if(north && east && !south && !west){
System.out.println("NORD EST");
mondo.player.direction=(PuntiCardinali.NORTH_EAST);
}
if(south && east && !north && !west){
System.out.println("SUD EST");
mondo.player.direction=(PuntiCardinali.SOUTH_EAST);
}
if(south && west && !north && !east){
System.out.println("SUD OVEST");
mondo.player.direction=(PuntiCardinali.SOUTH_WEST);
}
if(north && !west && !east && !south){
System.out.println("NORD");
mondo.player.direction=(PuntiCardinali.NORTH);
}
if(south && !west && !east && !north){
System.out.println("SUD ");
mondo.player.direction=(PuntiCardinali.SOUTH);
}
if(east && !north && !south && !west){
System.out.println("EST");
mondo.player.direction=(PuntiCardinali.EAST);
}
if(west && !north && !south && !east){
System.out.println("OVEST");
mondo.player.direction=(PuntiCardinali.WEST);
}
if(!north && !south && !east && !west)
mondo.player.direction=(PuntiCardinali.STOP);
当我只移动它时,它工作得很好,
但当我拍摄时,它只适用于北部、南部、东部、西部和东北部。
为什么只有东北部?
如果我停止方向,让玩家朝向任何对角线,然后射门,
这就好像当我移动对角线投篮时出错了你需要在投篮前设置球员方向吗?比如,在所有
mondo.player.direction
的实例之后添加射击命令?当你移动时,比如说,西南方向,它在哪里射击?我更想问的是:你的玩家是如何射击的?这只是他所面对的方向吗?如果不是,你能这样做吗?玩家有方向和方向,所以如果方向是停止方向,有8个基点中的一个,如果方向是基点方向是丑陋的,我认为我在输入中有一个错误,因为打印(“拍摄”)当我按下空格+向上箭头+向左箭头时不是吗谢谢你的回答你需要在拍摄前设置玩家方向吗?比如,在所有mondo.player.direction
的实例之后添加射击命令?当你移动时,比如说,西南方向,它在哪里射击?我更想问的是:你的玩家是如何射击的?这只是他所面对的方向吗?如果不是,你能这样做吗?玩家有方向和方向,所以如果方向是停止方向,有8个基点中的一个,如果方向是基点方向是丑陋的,我想我在输入中有一个错误,因为打印(“拍摄”)不是当我按空格+向上箭头+向左箭头时谢谢回复
if(shoot){
System.out.println("SHOOT");
if(mondo.player.selectArm!=-1)
mondo.proiettili.add(mondo.player.spara());
}
if(north && west && !south && !east){
System.out.println("NORD OVEST");
mondo.player.direction=(PuntiCardinali.NORTH_WEST);
}
if(north && east && !south && !west){
System.out.println("NORD EST");
mondo.player.direction=(PuntiCardinali.NORTH_EAST);
}
if(south && east && !north && !west){
System.out.println("SUD EST");
mondo.player.direction=(PuntiCardinali.SOUTH_EAST);
}
if(south && west && !north && !east){
System.out.println("SUD OVEST");
mondo.player.direction=(PuntiCardinali.SOUTH_WEST);
}
if(north && !west && !east && !south){
System.out.println("NORD");
mondo.player.direction=(PuntiCardinali.NORTH);
}
if(south && !west && !east && !north){
System.out.println("SUD ");
mondo.player.direction=(PuntiCardinali.SOUTH);
}
if(east && !north && !south && !west){
System.out.println("EST");
mondo.player.direction=(PuntiCardinali.EAST);
}
if(west && !north && !south && !east){
System.out.println("OVEST");
mondo.player.direction=(PuntiCardinali.WEST);
}
if(!north && !south && !east && !west)
mondo.player.direction=(PuntiCardinali.STOP);