Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество
Главная
    Статьи
        Пример шутера
            Создание 3D шутер ч3

Создание 3D шутер ч3

Опубликованно: 14.09.2015, 23:52
Последняя редакция, AdiDOS: 07.05.2017 8:55

В прошлой статье мы смогли привязать анимацию перезарядки а также звук перезарядки и по моему прицел ,  чтоб наша игры была более реалистичной я решил в этом уроке сделать анимацию выстрелов с нашего оружия , а также привязать звук выстрелов и обработку нажатия мыши.

Да и потому что наш код растет и размещать его не очень актуально с точки зрения читабельности , я буду описывать новые функции и изменения частично.

Исходники и все ресурсы вы сможете скачать ниже.

ИЗМЕНЕНИЯ

Добавлен код анимации в методе update принцип примерно такой при включается переменная enableShoots и в этом методе плавно автомат начинает двигаться таким образом имитируется отдача при стрельбе.

 /**
 * Функция расчета и масштабирования оружия с камерой и анимации
 */
 public void update(){
   //Перемещение оружия по координатам камеры
   Vector3f vectorDifference = new Vector3f(cam.getLocation().subtract(weapon.getWorldTranslation()));
   this.setLocalTranslation(vectorDifference.addLocal(this.getLocalTranslation()));
   Quaternion worldDiff = new Quaternion(cam.getRotation().mult(this.getWorldRotation().inverse()));
   this.setLocalRotation(worldDiff.multLocal(this.getLocalRotation()));
   //Обработка анимации выстрелов
   if (enableShoots) {
     counterAnim++;
   if (counterAnim == lenghtShotsAnim)
     animMove.x -= speedShotsAnim;
   if (counterAnim == (lenghtShotsAnim*2))
     animMove.x += speedShotsAnim;
   if (counterAnim > (lenghtShotsAnim*2)+1)
     counterAnim = 0;
   }
   //Позиционирование оружия
   this.move(cam.getDirection().mult(move.x+animMove.x));
   this.move(cam.getUp().mult(move.y+animMove.y));
   this.move(cam.getLeft().mult(move.z+animMove.z));
   this.rotate(rotate.x,rotate.y, rotate.z);
 }

В методе initKeys добавлен обработчик событий при нажатии левой кнопки мыши .


/**
* Функция инициализация кнопок
*/
public void initKeys(){
  inputManager.addMapping("reload", new KeyTrigger(KeyInput.KEY_R));
  inputManager.addListener(this,"reload");
  inputManager.addMapping("mouseleft", new MouseButtonTrigger(MouseInput.BUTTON_LEFT));
  inputManager.addListener(this, "mouseleft");
}

Добавлена функция загрузки звука выстрелов все аналогично звука перезарядки , кроме вызова функции повторного воспроизведения setLooping(true).

/**
 * Функция загрузки звука выстрелов <br>
 * @param rootPath Путь к корневому каталогу
 * @param name Имя Файла
 * @param locatorClass Локатор
 */
 public void loadAudioShoots(String rootPath, String name, Class<? extends AssetLocator> locatorClass){
   assetManager.registerLocator(rootPath, locatorClass);
   shoots = new AudioNode(assetManager, name);
   shoots.setLooping(true);
 }

Добавлен обработчик события левой мыши для выстрелов , если вы заметили при нажатии мыши в коде так же проверяется переменная animComplete, это нужно для того что бы в момент перезарядки нельзя было стрелять .

 @Override
 public void onAction(String name, boolean isPressed, float tpf) {
 //Обработка событий по нажатию кнопки R
 if (animComplete && isPressed && name.equals("reload")){
   channel.setAnim("1");
   channel.setLoopMode(LoopMode.DontLoop);
   reload.play();
   shoots.stop();
 }
 //Обработка событий левой кнопки мыши
 if (animComplete && name.equals("mouseleft")){
   enableShoots = true;
   shoots.play();
 }
 //Если кнопка отжата сбрасываем все
 if (!isPressed){
   enableShoots = false;
   animMove.zero();
   counterAnim = 0;
   shoots.stop();
  }
 }

Эти методы нужны для установки и чтения параметров анимации выстрела , переменная speedShotsAnim определяет скорость анимации но если ее сильно завысить то хорошего ничего не будет , как я говорил при выстреле автомат двигается так вот с помощью переменной  lenghtShotsAnim  можно устанавливать длину движения.


/**
*
* @return Возвращает значение скорости анимации перезарядки
*/
public float getSpeedShotsAnim() {
  return speedShotsAnim;
}
/**
*
* @param speedShotsAnim Установка скорости перезарядки по умолчанию 0.02
*/
public void setSpeedShotsAnim(float speedShotsAnim) {
  this.speedShotsAnim = speedShotsAnim;
}
/**
*
* @return Возвращает значение дальности анимации перезарядки
*/
public int getLenghtShotsAnim() {
  return lenghtShotsAnim;
}
/**
*
* @param lenghtShotsAnim Установка дальности перемещения анимации перезарядки
* по умолчанию 5
*/
public void setLenghtShotsAnim(int lenghtShotsAnim) {
  this.lenghtShotsAnim = lenghtShotsAnim;
} 

1

Конечно анимация не столь профессиональная но моя задача научить , ну я думаю в следующем уроке сделаем что нибудь по круче.

Исходники  , звук.

Спасибо за внимание!!!

Добавить комментарий

jMonkeyEngine.ru © 2017. Все права сохранены.