2013-10-25 3 views
2

В настоящее время я создаю Java 2D-игру, в которой я получаю команды от пользователя, чтобы перемещать персонаж вверх, вниз, влево или вправо на определенное расстояние. В настоящее время я использую цикл for через пользовательские входы и передаю строку классу Player, которая проверяет, соответствует ли строка ввода пользователю одно из направлений перемещения символа. Когда все это выполняется, кажется, что игрок телепортирован в конечное местоположение. Есть ли способ для персонажа перемещать определенное количество пикселей до тех пор, пока он не достигнет целевого местоположения, чтобы он выглядел так, как будто игрок, естественно, перемещается к месту.Игра персонажа перемещается слишком быстро

Это функция movePlayer, которая используется для прохождения через JTextFields, которые содержат команды пользователя для перемещения плеера. strings из каждого текстового поля передается в другую функцию: inputListener.

public void movePlayer(){ 

    for (int i = 0; i < userTextInput.size(); i++) { 
     inputListener(userTextInput.get(i).getText()); 
    } 
} 

В inputListener проверяет, является ли strings, введенный пользователем совпадает с типом движения, и инициирует соответствующий метод для перемещения персонажа.

private void inputListener(String Input){ 

    if(Input.equals("up")){ 
     player.moveCharacterUp(); 

    }else if(Input.equals("down")){ 
     player.moveCharacterDown(); 

    }else if(Input.equals("left")){ 
     player.moveCharacterLeft(); 

    }else if(Input.equals("right")){ 
     player.moveCharacterRight(); 

    } 

} 

Это где x и y позиция символа устанавливается в соответствии с методом запуска из inputListener

public void moveCharacterUp(){ 
    y -= moveSpeed; 
} 

public void moveCharacterDown(){ 
    y += moveSpeed; 
} 

public void moveCharacterLeft(){ 
    x -= moveSpeed; 
} 

public void moveCharacterRight(){ 
    x += moveSpeed; 
} 

Метод запуска для Thread, который я использую.

public void run(){ 

    init(); 

    long start; 
    long elapsed; 
    long wait; 

    while(running){ 

     start = System.nanoTime(); 

     update(); 
     draw(); 
     drawToScreen(); 

     elapsed = System.nanoTime() - start; 
     wait = targetTime - elapsed/1000000; 

     if(wait < 0) wait = 5; 

     try{ 
      Thread.sleep(wait); 

     }catch(Exception e){ 
      e.printStackTrace(); 
     } 

    } 
    } 
+0

Облегченный подход может заключаться в использовании 'Thread.sleep (200);' или что-то подобное в вашем игровом цикле. –

+1

Это не изменит расстояние или скорость перемещения персонажа, оно лишь создаст небольшую паузу в потоке, что я могу себе представить, было бы очень раздражающе? –

ответ

1

так, как я делал это в прошлом, создавая targetX и targetY.
Затем я увеличиваю x и y до тех пор, пока они не равны targetX и targetY.

int x = 0; //Character's x position 
int y = 0; //Character's y position 
int targetX = 0; //Character's target x position 
int targetY = 0; //Character's target y position 
int moveSpeed = 2; //the speed at which the character moves 
int moveAmt = 20; //amount the character is set to move every time it is told to move 

void setTarget(int targetX, int targetY) //sets targetX and targetY, doesn't need to be called at all 
{ 
    this.targetX = targetX; 
    this.targetY = targetY; 
} 

void moveCharacter(int x, int y) //moves the character, doesn't need to be called at all 
{ 
    this.x = x; 
    this.y = y; 
} 

void updatePosition() //initiates/continues movement, should be called every frame 
{ 
    if(Input.equals("up")) { 
     setTarget(targetX, targetY - moveAmt); 

    } else if(Input.equals("down")) { 
     setTarget(targetX, targetX + moveAmt); 

    } else if(Input.equals("left")) { 
     setTarget(targetX - moveAmt, targetX); 

    } else if(Input.equals("right")) { 
     setTarget(targetX + moveAmt, targetX); 

    } 

    if(y > targetY) { 
     player.moveCharacter(x, y - moveSpeed); 

    } else if(y < targetY) { 
     player.moveCharacter(x, y + moveSpeed); 

    } else if(x > targetX) { 
     player.moveCharacter(x - moveSpeed, y); 

    } else if(x < targetX) { 
     player.moveCharacter(x + moveSpeed, y); 

    } 
} 
+0

следует настроить с помощью setTarget() следующим образом: setTarget (x + = moveSpeed, y + = moveSpeed)? – Human

+0

'setTarget()' устанавливает место, в которое игрок будет перемещаться, 'updatePosition()' должен вызываться каждый кадр, чтобы игрок двигался к цели, а 'moveCharacter()' вообще не нужно вызывать. Кроме того, 'moveSpeed', вероятно, необходимо скорректировать в соответствии с вашими потребностями. –

+0

Я думаю, вы неправильно поняли проблему. Я не перемещаю персонажа на основе ключевых событий в прессе.Я перемещаю персонажа на определенное количество пикселей, например, 20 пикселей для каждой команды, которую получает «updatePosition», которая может быть 'up',' down', 'left' или' right'. Даже когда я реализовал ваш код, персонаж действительно перемещался, но он мгновенно перемещался не, например, по 2 пиксела за раз, чтобы он отображался по мере его перемещения. – Human

0

Скорость устанавливается переменной movingSpeed. Вероятно, это значение больше, чем вы хотите, поэтому попробуйте изменить это.

+0

, если я изменил moveSpeed ​​на 20, например, чтобы переместить 20 пикселей вверх, персонаж сделает это, но он сделает это в одно мгновение и не медленно, как если бы человек удерживал клавишу. – Human

0

Ваша программа должна учитывать время. Это значение времени будет использоваться для масштабирования moveSpeed. Клавиша нажата, и вы выбираете текущее время. Когда вы собираетесь применить moveSpeed, вам нужно снова получить время и рассчитать разницу с предыдущим временем. Эта разница будет вашим масштабным фактором. Что-то вроде этого:

private void inputListener(String Input){ 
    lastTime = getTime(); 
} 

public void moveCharacterUp(){ 
    currTime = getTime(); 
    y -= moveSpeed * (currTime - lastTime) 
    lastTime = currTime; 
} 
Смежные вопросы