2015-12-11 56 views
1

所以我有一個Java swing應用程序,其中有一個太空船獲取旋轉角度,然後在該方向加速(在其軸上旋轉並移動到前端船是)。我遇到麻煩的事情是,當它指向與之前方向相反的方向時,使船減速。Java「小行星」像遊戲 - 減速船

What Happens and what I need to fix

如果你看一下圖片,你會看到,當我嘗試通過在完全相反的方向轉動,以彌補我的速度,速度增加了,什麼我需要做的就是有一個如果船舶正在補償其先前的速度,則可以降低速度。

例1:

import java.util.Set; 

/** 
* Created by griffin on 12/7/2015. 
*/ 
public class Example1 extends JPanel { 

public enum Input { 
    ROTATE_LEFT, 
    ROTATE_RIGHT, 
    UP, 
    DOWN 
} 

private final int B_WIDTH = 640; 
private final int B_HEIGHT = 480; 
private Set<Input> inputs; 

Ship player = new Ship(320, 240); 

public Example1() { 
    initExample1(); 
} 

private void initExample1() { 
    inputs = new HashSet<>(25); 
    setFocusable(true); 
    setBackground(Color.BLACK); 
    setPreferredSize(new Dimension(B_WIDTH, B_HEIGHT)); 

    addKeyBinding("rotate-left", KeyEvent.VK_A, Input.ROTATE_LEFT); 
    addKeyBinding("rotate-right", KeyEvent.VK_D, Input.ROTATE_RIGHT); 
    addKeyBinding("up", KeyEvent.VK_W, Input.UP); 
    addKeyBinding("down", KeyEvent.VK_S, Input.DOWN); 

    Timer timer = new Timer(40, new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent actionEvent) { 
      if (inputs.contains(Input.ROTATE_LEFT)) { 
       player.angle -= 5; 
      } 

      if (inputs.contains(Input.UP)) { 

       player.thrust = true; 
       player.moveForwards(); 
      } 
      else 
       player.moveForwards(); 

      if (inputs.contains(Input.ROTATE_RIGHT)) { 
       player.angle += 5; 
      } 

      player.checkAngle(); 
      player.screenWrap(); 

      repaint(); 
     } 
    }); 
    timer.start(); 
} 


public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D) g; 
    g2d.setColor(Color.WHITE); 
    g2d.drawString("Speed " + (int) player.speed, 15, 15); 
    AffineTransform old = AffineTransform.getTranslateInstance(player.x, player.y); 
    old.rotate(Math.toRadians(player.angle), player.getWidth()/2, player.getHeight()/2); 
    g2d.setTransform(old); 
    g2d.drawImage(player.ship, 0, 0, this); 

    Toolkit.getDefaultToolkit().sync(); 
} 

private void addKeyBinding(String name, int keyCode, Input input) { 
    InputMap inputMap = getInputMap(WHEN_IN_FOCUSED_WINDOW); 
    ActionMap actionMap = getActionMap(); 

    inputMap.put(KeyStroke.getKeyStroke(keyCode, 0, false), name + ".pressed"); 
    actionMap.put(name + ".pressed", new InputAction(input, true)); 

    inputMap.put(KeyStroke.getKeyStroke(keyCode, 0, true), name + ".released"); 
    actionMap.put(name + ".released", new InputAction(input, false)); 
} 

private class InputAction extends AbstractAction { 

    private Input input; 
    private boolean pressed; 

    public InputAction(Input input, boolean pressed) { 
     this.input = input; 
     this.pressed = pressed; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (pressed) { 
      inputs.add(input); 
     } else { 
      inputs.remove(input); 
     } 
    } 
} 
} 

船舶:

import javax.imageio.ImageIO; 
import java.awt.image.BufferedImage; 
import java.io.File; 

/** 
* Created by griffin on 12/7/2015. 
*/ 
public class Ship { 
float directionX, directionY; 
boolean thrust = false; 
int x, y; 
float speed = 1; 
int angle = 0, vAngle = 0; 

BufferedImage ship; 
private String path = "rocketc.png"; 

public Ship(int x, int y) { 
    this.x = x; 
    this.y = y; 
    getImage(); 
} 

private void getImage() { 
    try { 
     ship = ImageIO.read(new File(path)); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public int getWidth() { 
    return ship.getWidth(); 
} 

public int getHeight() { 
    return ship.getHeight(); 
} 

public void moveForwards() { 

    directionX = (float) (Math.cos(Math.toRadians(vAngle))) * speed; 
    directionY = (float) (Math.sin(Math.toRadians(vAngle))) * speed; 

    if (thrust) { 
     speed++; 

     vAngle = angle; 
     thrust = false; 
    } 

    x -= directionX; 
    y -= directionY; 

} 

    public void checkAngle() { 

     if (angle > 360) { 
      angle = 0; 
     } 
     if (angle < 0) { 
      angle = 360; 
     } 
    } 


    public void screenWrap() { 
     if (x > 640) { 
      x = 0; 
     } 

     if (x < 0) { 
      x = 640; 
     } 

     if (y > 480) { 
      y = 0; 
     } 

     if (y < 0) { 
      y = 480; 
     } 
    } 
} 
+0

好的,玩家的方向應該影響玩家速度的增量。也就是說,如果他們在推力的相反方向轉動180度,那麼您需要降低速度,而不是增加速度。如果他們轉過90度,那麼你需要在一個方向上降低速度,同時增加新方向的速度......並且我的頭部內爆的位置是 – MadProgrammer

+0

是的,這很難弄清楚。我碰到了牆壁,我不確定如何解決這個問題... – galmquist

+0

你需要深入研究一些基本的(?)物理......因此我的頭部崩潰的原因 – MadProgrammer

回答

1

你可能已經想通了這一點現在,但你沒有設置player.thrustfalse當你當了檢查鍵被按下。

if (inputs.contains(Input.UP)) { 
    player.thrust = true; 
    player.moveForwards(); 
} 
else{ 
    player.thrust = false; // added this line 
    player.moveForwards(); 
} 

另外,如果你想拖動(即,如果沒有按向上鍵減速),在Ship.moveForwards()可以減小speed

if (thrust) { 
    speed++; 

    vAngle = angle; 
    thrust = false; 
} 
else{ // added this block 
    speed--; 
} 

你可以用遞增撥弄/通過遞減speed不同的值可以得到不同的加速度/阻力。