Business Outfitted Bob Bob isn't moving

HI EVERYONE,

I just start the Business Outfitted Bob exercice and i can’t figure out why Bob isn’t moving on the step 13.

If someone can explain to me where I make a mistake i will be very greatfull for that.

Thanks in advance.

1 Like

Hi Mati,

What is step 13?

1 Like

Hi javaace,

In the step 13, we have to move bob with the arrow to see how it work.

1 Like

I can’t see an error given what you’ve provided. Could you copy paste the code from the whole file and format it using the “</>” button in the comment editor here?

1 Like

I’m not sure for what you are asking but i can provide you my code if it’s what you mean.

// Add a variable to keep count of Bob's earnings
let score = 0;
// Add a variable to multiply money
const moneyMultiplier = 100;
// Add a variable to control speed of Bob sprite
const speed = 0;


// Values used to keep track of where money and paper appear
const gameState = {
  numCoordinates: {},
};
let randomCoord;

class GameScene extends Phaser.Scene {
  constructor() {
    super({ key: 'GameScene' });
  }

  preload() {
    this.load.image('bob-front', 'https://content.codecademy.com/courses/learn-phaser/BOB/Bob%20front.png');
    this.load.image('bob-back', 'https://content.codecademy.com/courses/learn-phaser/BOB/Bob%20back.png');
    this.load.image('bob-side', 'https://content.codecademy.com/courses/learn-phaser/BOB/Bob%20side.png');
    this.load.image('money', 'https://content.codecademy.com/courses/learn-phaser/BOB/Money.png');
    this.load.image('paper', 'https://content.codecademy.com/courses/learn-phaser/BOB/Paperwork.png');
  }

  create() {
    // Display text showing how much cash Bob earned
    let scoreText = this.add.text(140, 610, `Earnings: $${score}`, { fontSize: '25px', fill: '#fff' });

    // Create the Bob sprite and set boundaries for it
    gameState.player = this.physics.add.sprite(240, 500, 'bob-front').setScale(.8);
    this.physics.world.setBounds(0, 0, 480, 600);  // Slightly above score
    gameState.player.setCollideWorldBounds(true);
    gameState.player.body.collideWorldBounds = true;

    // Create money sprite in random spots on canvas
    randomCoord = assignCoords();
    gameState.money = this.physics.add.sprite(randomCoord.x, randomCoord.y, 'money').setScale(.5);

    // Create paper sprite group
    gameState.enemies = this.physics.add.group();

    // Collision detection between Bob and money sprite
    this.physics.add.overlap(gameState.player, gameState.money, () => {
      // Hide and deactivate the money sprite after Bob collides with it
      gameState.money.disableBody();
      // Move money somewhere else on the canvas
      delete gameState.numCoordinates[`x${gameState.money.x}y${gameState.money.y}`];
      randomCoord = assignCoords();
      // Place the money sprite somewhere new, then show and activate it
      gameState.money.enableBody(true, randomCoord.x, randomCoord.y);
      // Increase the score randomly between 100 and 1000
      score += (Math.round(Math.random() * 10) * moneyMultiplier);
      // Update cash total text
      scoreText.setText(`Earnings: \$${score}`);
      // Place paper sprite on canvas randomly
      randomCoord = assignCoords();
      gameState.enemies.create(randomCoord.x, randomCoord.y, 'paper').setScale(.6);
    });

    // Collision detection between Bob and paper sprites
    this.physics.add.collider(gameState.player, gameState.enemies, () => this.endGame());

    // Helper function to return an object containing evenly spaced x and y coordinates:
    function generateRandomCoords() {
      const randomX = Math.floor(Math.random() * 5) * 75 + 25
      const randomY = Math.floor(Math.random() * 5) * 75 + 25
      return { x: randomX, y: randomY }
    }

    // Helper function that returns one set of coordinates not in gameState.numCoordinates
    function assignCoords() {
      let assignedCoord = generateRandomCoords();

      // If the coordinates are already in gameState.numCoordinates, then other set of coordinates are generated until there is one not in use
      while (gameState.numCoordinates[`x${assignedCoord.x}y${assignedCoord.y}`]) {
        assignedCoord = generateRandomCoords()
      }

      gameState.numCoordinates[`x${assignedCoord.x}y${assignedCoord.y}`] = true

      return assignedCoord;
    }
  }

  update() {
    // Arrow keys that will move Bob in 4 directions
    const cursors = this.input.keyboard.createCursorKeys();
    // Add variables that store if a specific arrow key is being pressed
    const rightArrow = cursors.right.isDown;
    const leftArrow = cursors.left.isDown;
    const upArrow = cursors.up.isDown;
    const downArrow = cursors.down.isDown;
    // Add code to check whether any of the arrow keys were pressed, move Bob
    if (rightArrow === true) {
      moveBobRight();
    } else if (leftArrow === true) {
      moveBobLeft();
    } else if (upArrow === true) {
      moveBobUp();
    } else if (downArrow === true) {
      moveBobDown();
    }
    // Add variables that store the x and y coordinates of the Bob sprite
    const bobXCoord = gameState.player.x;
    const bobYCoord = gameState.player.y;
    // Add code to check collision between Bob and edges of the canvas of the game
    if (bobXCoord <= 32 || bobXCoord >= 448) {
      this.endGame();
    }
    if (bobYCoord <= 32 || bobYCoord >= 568) {
      this.endGame();
    }





    // Helper functions to move Bob in 4 directions
    function moveBobRight() {
      gameState.player.flipX = false;
      gameState.player.setTexture('bob-side');
      gameState.player.setVelocityX(150 * speed);
      gameState.player.setVelocityY(0);
    }

    function moveBobLeft() {
      // NOTE: By default Bob looks to the right so we flip the image if moving left
      gameState.player.flipX = true;
      gameState.player.setTexture('bob-side');
      gameState.player.setVelocityX(-150 * speed);
      gameState.player.setVelocityY(0);
    }

    function moveBobUp() {
      gameState.player.flipX = false;
      gameState.player.setTexture('bob-back');
      gameState.player.setVelocityX(0);
      gameState.player.setVelocityY(-150 * speed);
    }

    function moveBobDown() {
      gameState.player.flipX = false;
      gameState.player.setTexture('bob-front');
      gameState.player.setVelocityX(0);
      gameState.player.setVelocityY(150 * speed);
    }
  }

  // Class function that ends current Game and transitions to End Scene
  endGame() {
    // Stop sprites moving
    this.physics.pause();
    // Transition to end scene w/fade
    this.cameras.main.fade(800, 0, 0, 0, false, function (camera, progress) {
      if (progress > .5) {
        this.scene.stop('GameScene');
        this.scene.start('EndScene');
      }
    });
  }
}
1 Like

Bob is turning but not moving. It suggests that the appropriate helper functions are being executed as evidenced by the turn.

The reason Bob isn’t moving is the third declaration at the top of your code:

const speed = 0;

In the helper functions, the velocity is being set to values involving multiplication with speed. Since multiplying any number by zero results in 0, so Bob doesn’t move.

Change the declaration to:

const speed = 1;

Now, Bob should move.

Funny, how a single number can make such a difference on whether the code works or not.

Also, the importance of sharing all of the code, because the bug may arise from a mistake in an unexpected part of the code.

2 Likes

Yes, this is what I meant. In the original snippet of code you provided, there was no error. By providing the entirety, we were able to find the error.

2 Likes

Thank for your answer. I feel a bit stupid but i can move forward thank to you.

Thank for your help !!!

1 Like