Sign in to follow this  
arknoid

Group and foreach

Recommended Posts

Hi , 

I m  new user of phaser and i develop a retro shoot them up for the  GameOFF jam .

i  have a problem in  my  game state  :

  enemyTween: function(){

    this.enemyPool.forEachAlive(function(enemy){
      enemyTween = this.game.add.tween(enemy)
    })

 

TypeError: this.game is undefined
[En savoir plus]

 

why i cant acces to game and other event into function of group?

 

(sorry for my bad english)

Share this post


Link to post
Share on other sites

I'm not sure how `enemyPool` or the `forEachAlive` function works but often this sort of thing is a scoping issue (although the error you've reported is slightly wrong for a scope issue).

The problem is that JS is sometimes a little unexpected for scoping and so any time you use a class or object you have to work with `this`, which is a common cause of issue.

In your case I think that (maybe) you should just scope the callback function, you have some options here:

this.enemyPool.forEachAlive(function(enemy){
  enemyTween = this.game.add.tween(enemy)
}, this)

Notice the following `this` after the function declaration, usually the `forEachAlive` function can accepts another parameter that defines scope.

You can also do this explicitly by calling `bind` yourself:

this.enemyPool.forEachAlive(function(enemy){
  enemyTween = this.game.add.tween(enemy)
}.bind(this))

`bind` sets the `this` of a function.

You have another potential issue though:

enemyTween: function(){
 this.enemyPool.forEachAlive(function(enemy){
   enemyTween = this.game.add.tween(enemy)
 })
}

You're overwriting `enemyTween`, hard to tell without seeing the rest of the code but its probably bad.

Share this post


Link to post
Share on other sites
 
Thank you very much, it works well with "this". desolate if I ask stupid questions but I started with javascript and phaser, furthermore I find that the documentation lacks concrete example and detail.
 
I will soon have new questions to ask you but for the moment I try to unraveled myself
 
 

Share this post


Link to post
Share on other sites
2 hours ago, arknoid said:

desolate if I ask stupid questions

Deffo not a stupid question, JS scoping can be a little misleading, or, surprising, particularly if you come with any knowledge from real classical languages.

There is another option using arrow functions:

.forEach(item => {
  // do something
})

However, some libraries will try to scope your function (using .bind usually) so it won't always work as expected. Also also, arrow function scoping is even more confusing.

Share this post


Link to post
Share on other sites

I have a problem again, I want to setup group in create event and call number of  each later (with timer)

setupEnemies:function(){
    this.asteroidPool = this.add.group();
    this.bigAsteroidPool = this.add.group();
    this.tiePool = this.add.group();
    this.interceptorPool = this.add.group();
    this.enemyPool = this.add.group();
    this.enemyPool.enableBody = true;
    this.enemyPool.physicsBodyType = Phaser.Physics.ARCADE;
  },
addEnemies: function(nbrTie,nbrAsteroid,nbrBigAsteroid,nbrInterceptor) {

    /***************************************************************************
     * Asteroid
     *
     ***************************************************************************/

    this.asteroidPool.createMultiple(nbrAsteroid, 'asteroid');
    this.asteroidPool.createMultiple(nbrAsteroid, 'asteroid2');
    this.asteroidPool.createMultiple(nbrAsteroid, 'asteroid3');
    this.asteroidPool.forEach(function(child) {
      child.name = "asteroid"
      child.animations.add('idle', [0]);
      child.animations.add('hit', [0, 1, 0, 1], 20, false);
      child.events.onAnimationComplete.add(function(e) {
        e.play('idle');
      }, this);
      child.name = "asteroid";
    });
    /***************************************************************************
     * bigAsteroid
     *
     ***************************************************************************/

    this.bigAsteroidPool.createMultiple(nbrBigAsteroid, 'bigAsteroid');
    this.bigAsteroidPool.forEach(function(child) {
      child.name = "bigAsteroid"
      child.animations.add('idle', [0]);
      child.animations.add('hit', [0, 1, 0, 1], 20, false);
      child.events.onAnimationComplete.add(function(e) {
        e.play('idle');
      }, this);
    });
    /***************************************************************************
     * tie
     *
     ***************************************************************************/

    this.tiePool.createMultiple(nbrTie, 'tie');
    this.tiePool.forEach(function(child) {
      child.name = "tie"
      child.animations.add('idle', [0, 1, 2, 3], 20, true);
      child.animations.add('hit', [0, 4, 0, 4], 20, false); //quand c'est finie retour sur idle
      child.events.onAnimationComplete.add(function(e) {
        e.play('idle');
      }, this);
    });
    /***************************************************************************
     * interceptor
     *
     ***************************************************************************/

    this.interceptorPool.createMultiple(nbrInterceptor, 'interceptor');
    this.interceptorPool.forEach(function(child) {
      child.name = "interceptor";
      child.animations.add('idle', [0, 1, 2], 20, true);
      child.animations.add('hit', [0, 3, 0, 3], 20, false); //quand c'est finie retour sur idle
      child.events.onAnimationComplete.add(function(e) {
        e.play('idle');
      }, this);
    });

    this.enemyPool.addMultiple(this.asteroidPool);
    this.enemyPool.addMultiple(this.tiePool);
    this.enemyPool.addMultiple(this.interceptorPool);
    this.enemyPool.addMultiple(this.bigAsteroidPool);
    this.enemyPool.setAll('anchor.x', 0.5);
    this.enemyPool.setAll('anchor.y', 0.5);
    this.enemyPool.setAll('outOfBoundsKill', true);
    this.enemyPool.setAll('checkWorldBounds', true);
  },

Create: function() {
    /************************************************************************************************
     *Initialize
     *
     ************************************************************************************************/
    this.setupBackground(); //Initialize Background (A completter)
    this.setupScaleMode(); //Initialize Sclaling and no blur
    this.setupEnemiesShot();
    this.setupEnemies(); //Initialize Enemies
    this.setupPlayerShot(); //Initialize Player Shot
    this.setupExplode(); //Initialize Explosion effets
    this.setupText(); //Initialize Text Screen
    this.setupPlayer(); //Initialize Player
    this.setupScore(); //Initialize text score
    this.setupLives(); //Initialize text lives
    this.addEnemies(1,10,2,1);

But nothing ...

Full source code here :

https://gitlab.com/Arknoid/The-lost-jedi/tree/Olivier

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.