Sprint 4: Main Player Character - UQdeco2800/2021-ext-studio-2 GitHub Wiki

Contents

Refining the Main Player Character

Fixing the Main Player Character Size

We have fixed the MPC size according to the size of the game area, type and positioning of enemies and obstacles.


        PhysicsUtils.setScaledCollider(player, 0.6f, 0.3f);
        player.getComponent(TextureRenderComponent.class).scaleEntity();
        player.setScale(2.5f,2.5f);
        player.getComponent(ColliderComponent.class).setDensity(1.5f);

        return player;

Making walking the default starting MPC behaviour

The default starting movement of the MPC is move walking instead of standing still at the start of the game.

public void create() {
        loadAssets();
       ...
        MPCConfig.updateValues();

        player = spawnPlayer();
        player.getEvents().trigger("startMPCAnimation");
        ...
    }

Integration of new animations for the new map

Adding the new hurt and burn animations on the new map, to the PlayerFactory

/* Burning animation with buffs */
        mpcAnimator.addAnimation("main_player_burn_dizzy", 0.1f, Animation.PlayMode.LOOP);
        mpcAnimator.addAnimation("main_player_burn_health-down", 0.1f, Animation.PlayMode.LOOP);
        mpcAnimator.addAnimation("main_player_burn_health-limit-up", 0.1f, Animation.PlayMode.LOOP);
        mpcAnimator.addAnimation("main_player_burn_health-up", 0.1f, Animation.PlayMode.LOOP);
        mpcAnimator.addAnimation("main_player_burn_hungry", 0.1f, Animation.PlayMode.LOOP);
        mpcAnimator.addAnimation("main_player_burn_poisoned", 0.1f, Animation.PlayMode.LOOP);
        mpcAnimator.addAnimation("main_player_burn_recovered", 0.1f, Animation.PlayMode.LOOP);
        mpcAnimator.addAnimation("main_player_burn_speed-down", 0.1f, Animation.PlayMode.LOOP);
        mpcAnimator.addAnimation("main_player_burn_thirsty", 0.1f, Animation.PlayMode.LOOP);

        /* Hurt animation with buffs */
        mpcAnimator.addAnimation("main_player_hurt_dizzy", 0.1f, Animation.PlayMode.LOOP);
        mpcAnimator.addAnimation("main_player_hurt_health-down", 0.1f, Animation.PlayMode.LOOP);
        mpcAnimator.addAnimation("main_player_hurt_health-limit-up", 0.1f, Animation.PlayMode.LOOP);
        mpcAnimator.addAnimation("main_player_hurt_health-up", 0.1f, Animation.PlayMode.LOOP);
        mpcAnimator.addAnimation("main_player_hurt_hungry", 0.1f, Animation.PlayMode.LOOP);
        mpcAnimator.addAnimation("main_player_hurt_poisoned", 0.1f, Animation.PlayMode.LOOP);
        mpcAnimator.addAnimation("main_player_hurt_recovered", 0.1f, Animation.PlayMode.LOOP);
        mpcAnimator.addAnimation("main_player_hurt_speed-down", 0.1f, Animation.PlayMode.LOOP);
        mpcAnimator.addAnimation("main_player_hurt_thirsty", 0.1f, Animation.PlayMode.LOOP);

Method to handle the burning animations in the new map


/**
     * When the monitored event is triggered, play the mpc burning animation.
     */
  void magmaCollision(Fixture me, Fixture other) {

      if (hitboxComponent.getFixture() != me) {
          // Not triggered by hitbox, ignore
          return;
      }

      if (!PhysicsLayer.contains(PhysicsLayer.PLAYER, other.getFilterData().categoryBits) && !PhysicsLayer.contains(PhysicsLayer.WEAPON, other.getFilterData().categoryBits)) {
          // Doesn't match our target layer, ignore
          return;
      }
        entity.getEvents().trigger("burn");
      if (count == 0) { // Avoid an entity from repeatedly triggering an attack
          count++;
          logger.debug(COLLISION_LOGGER_INFO, entity.toString());
          this.entity.getEvents().trigger("burn");
          if (PhysicsLayer.contains(PhysicsLayer.WEAPON, other.getFilterData().categoryBits)) {
              this.entity.setRemoveCollision();
          }
      }


    }

Refactoring the PlayerAnimationController

Refactored the code from using switch statements to dynamically concatenating the current running animation and the required buff animation.

...
 /**
     *  Activate the hungry animation debuff
     */
    private void animateHungry() {
        animationName = animator.getCurrentAnimation();
        preAnimationCleanUp();
        if(animationName != null) {
            animator.startAnimation(animationName + "_hungry");
        } else {
            animator.startAnimation("main_player_walk_hungry");
        }
    }
    /**
     *  Activate the poison animation debuff
     */
    private void animatePoison() {
        animationName = animator.getCurrentAnimation();
        preAnimationCleanUp();
        if(animationName != null) {
            animator.startAnimation(animationName + "_poisoned");
        } else {
            animator.startAnimation("main_player_walk_poisoned");
        }
    }
  ...

Texture Atlases

All the animation atlases for the 4 attires:

mpcAnimation.atlas

mpcAnimation_2.atlas

mpcAnimation_4.atlas

mpcAnimation_6.atlas

Example texture atlas:

Testing

Sprint 4 Testing

We've added animation atlas tests for the new burn and hurt animations - PlayerAnimationAtlasTest.java


        testAnimator.addAnimation("main_player_right", 1f);
        assertTrue(testAnimator.hasAnimation("main_player_right"));

        testAnimator.addAnimation("main_player_hurt", 1f);
        assertTrue(testAnimator.hasAnimation("main_player_hurt"));

        testAnimator.addAnimation("main_player_burn", 1f);
        assertTrue(testAnimator.hasAnimation("main_player_burn"));

        assertNotNull(atlas.findRegion("main_player_right"));
        assertTrue(testAnimator.hasAnimation("main_player_right"));

        assertNotNull(atlas.findRegion("main_player_hurt"));
        assertTrue(testAnimator.hasAnimation("main_player_hurt"));

        assertNotNull(atlas.findRegion("main_player_burn"));
        assertTrue(testAnimator.hasAnimation("main_player_burn"));



We've also included new unit tests to verify the triggering of the new animations - PlayerAnimationRenderTest.java


 @Test
    void shouldTriggerBurnMovement() {
        player.getEvents().trigger("burn");
        verify(animator).startAnimation("main_player_burn");
    }

    @Test
    void shouldTriggerHurtMovement() {
        player.getEvents().trigger("hurt");
        verify(animator).startAnimation("main_player_hurt");
    }

    @Test
    void shouldTriggerWalkRightMovement() {
        player.getEvents().trigger("stopAnimations");
        verify(animator).startAnimation("main_player_walk");
    }


UML Diagrams

magmaCollision()

animateBurn()

Relevant Files

UnlockedAttiresScreen.java

UnlockedAttiresDisplay.java

PlayerConfig.java

MPCConfig.java

PlayerFactory.java

PlayerActions.java

PlayerAnimationController.java

ItemComponent.java

mpcAnimation.atlas

mpcAnimation_2.atlas

mpcAnimation_4.atlas

mpcAnimation_6.atlas

mpcAnimation.png

mpcAnimation_2.png

mpcAnimation_4.png

mpcAnimation_6.png

PlayerAnimationAtlasTest

PlayerAnimationRenderTest.java