/******************************************************************************* * Copyright 2015 See AUTHORS file. * <p/> * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * <p/> * http://www.apache.org/licenses/LICENSE-2.0 * <p/> * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package com.mygdx.game.objects.dog; import com.badlogic.gdx.ai.utils.ArithmeticUtils; import com.badlogic.gdx.graphics.g3d.utils.AnimationController.AnimationDesc; import com.badlogic.gdx.math.MathUtils; import com.mygdx.game.GameScreen; import com.mygdx.game.objects.DogCharacter; import com.mygdx.game.utilities.Constants; /** * A one shot animation task that makes the dog spin around until it's facing its owner. * * @author davebaol */ public class SpinAroundToFaceHumanTask extends SpinAroundTask { private static final float ORIENTATION_TOLERANCE = 8 * MathUtils.degreesToRadians; // 8 degrees tolerance private float targetOrientation; private boolean facingHuman; public SpinAroundToFaceHumanTask () { } @Override public AnimationDesc startAnimation(DogCharacter dog) { AnimationDesc animationDesc = super.startAnimation(dog); if (dog.currentTaskAnimation == getTaskAnimation()) { // Calculate target orientation to make the dog face human targetOrientation = ArithmeticUtils.wrapAngleAroundZero(dog.human.getOrientation() + Constants.PI); } return animationDesc; } @Override public void start() { // Init the flag indicating whether the task has to succeed facingHuman = false; super.start(); } @Override public Status execute () { if (facingHuman) { return Status.SUCCEEDED; } DogCharacter dog = getObject(); updateAnimation(dog); if (dog.currentTaskAnimation == getTaskAnimation()) { // Get current model orientation float currentDogOrientation = dog.getBoneOrientation(DogCharacter.DogArmature.FRONT_SPINE.id); // Calculate the difference between current and target orientation float orientationDiff = ArithmeticUtils.wrapAngleAroundZero(currentDogOrientation - targetOrientation); // Is dog facing human with enough precision? if (MathUtils.isZero(orientationDiff, ORIENTATION_TOLERANCE)) { // Make the task succeed on the next frame facingHuman = true; // Bark GameScreen.screen.sounds.bark.play(); // Finish the animation truncateAnimationCleanly(dog, currentDogOrientation); } } return Status.RUNNING; } @Override protected boolean mustTruncateAnimationCleanly() { return !facingHuman; } }