2017-12-05 4 views
0

최근에 JavaFX를 사용하기 시작했으며 WASD 키로 플레이어를 제어하여 작은 게임을 만들고 있습니다. 처음에 나는 x좌표를 keyPress에서 조정하여 플레이어를 움직일 수 있었지만 움직임이 매우 거친 것을 발견했습니다. 이제 키를 눌렀다가 놓을 때 일을 변경하고 & 시작 타임 라인을 사용하기 시작했습니다.JavaFX 원활한 이동 및 타임 라인

코드 :

Timeline timelineW = new Timeline(); 
Timeline timelineA = new Timeline(); 
Timeline timelineS = new Timeline(); 
Timeline timelineD = new Timeline(); 

public void createTimeLineW() { 
    timelineW.setCycleCount(Timeline.INDEFINITE); 
    final KeyValue kv = new KeyValue(player.yProperty(), -Integer.MAX_VALUE); 
    final KeyFrame kf = new KeyFrame(Duration.hours(3000), kv); 
    timelineW.getKeyFrames().add(kf); 
} 

public void createTimeLineA() { 
    timelineA.setCycleCount(Timeline.INDEFINITE); 
    final KeyValue kv = new KeyValue(player.xProperty(), -Integer.MAX_VALUE); 
    final KeyFrame kf = new KeyFrame(Duration.hours(3000), kv); 
    timelineA.getKeyFrames().add(kf); 
} 

public void createTimeLineS() { 
    timelineS.setCycleCount(Timeline.INDEFINITE); 
    final KeyValue kv = new KeyValue(player.yProperty(), Integer.MAX_VALUE); 
    final KeyFrame kf = new KeyFrame(Duration.hours(3000), kv); 
    timelineS.getKeyFrames().add(kf); 
} 

public void createTimeLineD() { 
    timelineD.setCycleCount(Timeline.INDEFINITE); 
    final KeyValue kv = new KeyValue(player.xProperty(), Integer.MAX_VALUE); 
    final KeyFrame kf = new KeyFrame(Duration.hours(3000), kv); 
    timelineD.getKeyFrames().add(kf); 
} 

이것은 현재 운동의베이스이다. 따라서 W를 누르면 imageView 플레이어는 timelineW.play()를 가져오고 W를 릴리스하면 timelineW.stop()이 나타납니다. 그리고 다른 키들처럼. 이 변경을 한 전체적인 이유는 움직임이 더 부드럽기는하지만 아직 몇 가지 버그가 있기 때문입니다. 이것으로도 운동을 할 수 있습니까? 아니면 대안을 조사해야합니까?

감사합니다. 사이클 카운트 하나입니다 기본에서 남아있는 것을

/** Distance player moves in one "step." */ 
private static final int movementDistance = 10; 

/** Time it takes to move one "step." */ 
private static final Duration movementTime = Duration.seconds(0.5); 

private Timeline xMovement; 

private void checkMovementKeys() { 
    // ... 

    if (xMovement == null) { 
     xMovement = new Timeline(); 
    } 

    if (rightMovementKeyPressed) { 
     xMovement.getKeyFrames().setAll(
      new KeyFrame(movementTime, 
       new KeyValue(player.xProperty(), 
        player.getX() + movementDistance))); 
     xMovement.playFromStart(); 
    } 
    if (leftMovementKeyPressed) { 
     xMovement.getKeyFrames().setAll(
      new KeyFrame(movementTime, 
       new KeyValue(player.xProperty(), 
        player.getX() - movementDistance))); 
     xMovement.playFromStart(); 
    } 

    // ... 
} 

주의 사항 :

답변

0

일반적으로 주기적으로 키를 확인하고 이동 타임 라인을 재설정 할 수 있습니다.