My preload is not sending assets to all scenes

Game scene loads everything fine. Second concurrently running scene needs all assets loaded in its own preload to appear. What am I missing?

let gameoverScene = new Phaser.Scene(
{ key: ‘GameOver’,
// WIDTH:100,
// HEIGHT:100,
active:true,
physics: {

   default: 'arcade',
    arcade: {gravity: {y: 1000}},
        debug: true,
        
    },
                                 });

gameoverScene.preload = function(){
// this is the line I want to delete this.load.image(‘prancingUnicorn’, ‘images/prancingUnicorn.png’);

};

gameoverScene.create = function(){

this.unicorn2=this.physics.add.sprite(20,30,‘prancingUnicorn’) ;
//this.unicorn2.body.allowGravity=false
this.cameras.main.setViewport(0,0,300,300);
};

gameoverScene.update = function(){

};

Don’t start the scenes concurrently if the second scene depends on assets loaded by the first.

Instead launch the second scene from the first scene, after it loads.

They should both be getting assets from the preload scene. Neither “Game” nor “GameOver” should need to load anything themselves.

Please post the full code.

//main.js
// set game configuration
let config = {
type: Phaser.AUTO,
width: 900,
height: 700,
scene: [preloadScene, titleScene, gameScene,gameoverScene],
pixelArt: false,

};

//create new game and send configuration
let game = new Phaser.Game(config)

//this is the other running scene, game.js
let gameScene = new Phaser.Scene(
{ key: ‘Game’,
physics: {
default: ‘arcade’,
arcade: {gravity: {y: 1000},
debug: true,
},

matter:{gravity:{y:.5}},
debug: true,
},

}

);

gameScene.init = function(){
this.numberOfBloods=0;
this.firstLuchador=true;
this.appleDropRate=71;
};
// create after preload
gameScene.create = function(){
//load matter physics bodies from JSON preload data
this.shapes = this.cache.json.get(‘matterShapes’);
//create sounds
this.chainsawStartSound = this.sound.add(‘chainsawStart’);
this.scream1Sound = this.sound.add(‘scream1’);
this.squishSound = this.sound.add(‘squish’);
this.cartBreakSound = this.sound.add(‘cartBreak’);
//scale game to window
this.resize=function(){
var canvas= document.querySelector(‘canvas’);
var windowWidth= window.innerWidth;
var windowHeight= window.innerHeight;
var windowRatio= windowWidth/windowHeight;
var gameRatio = config.width/config.height;
if (windowRatio < gameRatio){
canvas.style.width=windowWidth+‘px’;
canvas.style.height=(windowWidth/gameRatio)+‘px’;

   }else{
       canvas.style.width=(windowHeight*gameRatio) +'px';
       canvas.style.height=windowHeight+'px';
   }

};

window.addEventListener('resize', this.resize, false);
   
//setup needed variables
this.gameW = this.sys.game.config.width;
this.gameH = this.sys.game.config.height;
this.appleCount=0;

//create UI box
  this.uiBox = this.add.rectangle(0,this.gameH,this.gameW*2, 200, '#fff000');

    this.uiBox.depth=99;
    this.physics.add.existing(this.uiBox);
    this.uiBox.body.allowGravity=false;
    this.uiBox.body.immovable=true;
//create apples group
this.apples=this.physics.add.group({
    key: 'redApple',
    repeat:0,
});

//remove first member of group so no apples are in game at start
this.apples.children.entries[0].destroy(); 
//create luchador group and remove first member
this.luchadores = this.physics.add.group({
    key: 'luchador',
    repeat:0,
    
});
this.luchadores.children.entries[0].destroy();
//create game objects
this.nightSky=this.add.sprite(this.gameW/2,this.gameH,'nightSky');
this.hills1=this.add.sprite(0,20,'hills1');
this.hills1.setScale(3);
this.hills2=this.add.sprite(this.gameW/2-100,this.gameH/2,'hills2');
this.hills2.setScale(1.5);
this.nightSky.setScale(.6);
this.appleTree= this.physics.add.sprite(400,600,'appleTree');
this.appleTree.setScale(.3);
this.appleTree.depth=3;
this.appleTree.setInteractive();
this.appleTree.setOrigin(.5,.99 );
this.appleTree.shake=false;
this.appleTree.body.allowGravity=false;

//create cart
this.cart=this.physics.add.sprite(this.appleTree.x-68,this.appleTree.y-95, 'cart');
this.cart.depth=8;
this.cart.setScale(.15);
this.cart.body.allowGravity=false;
this.cart.appleCount=0;
//create attribute for later use to see if cart is in motion
this.cart.moving=false;

//display collected apples
this.appleText=this.add.text(0,0,‘Apples Collected: 0’);
this.appleText.setScale(2);

     //make tree shake on click
this.appleTree.on('pointerdown',  function(){

if(this.appleTree.shake==false){
    //drop apples randomly from tree shake    
    this.appleDrop=Phaser.Math.Between(0,100);
       if(this.appleDrop>=this.appleDropRate){
    this.apples.create(Phaser.Math.Between(this.appleTree.x-100,this.appleTree.x+100), Phaser.Math.Between(this.appleTree.y-500, this.appleTree.y-300), 'redApple')
};
    
        this.appleTree.shake=true;
  this.appleTree.moveTween=this.tweens.add({
               targets:this.appleTree,
                angle:Phaser.Math.Between(-85,85),
                duration:200,
                yoyo:true,
                delay:0,
                callbackScope:this,
                onComplete:function(){this.appleTree.shake=false}
  });

};
},this);

//check apple count and spawn luchador mask
this.luchadorMaskSpawn = this.time.addEvent({
    delay: 1500,
    repeat: -1,
    callback: function(){
        if(!this.luchadorMask&&(this.appleCount>=10)){
       this.luchadorMask=this.add.sprite(50, this.gameH-50,'luchadorMask');
       this.luchadorMask.setInteractive();
        this.luchadorMask.setScale(.1);
        this.luchadorMask.depth=101;
        //check if luchador is first, if so explain how to hire
        if(this.firstLuchador==true){
        this.teachLuchadorText=this.add.text(this.gameW/2-200,this.gameH/2,'Hire a luchador \n for ten apples.');
        this.teachLuchadorText.setScale(3);
        this.teachLuchadorText.depth=500;
        };
         //hire luchador
    this.luchadorMask.on('pointerdown',  function(){
   this.luchadores.create(this.appleTree.x, this.gameH/2, 'luchadores').setFrame(Phaser.Math.Between(0,3));
    this.appleCount=this.appleCount-10;
 
    
    
    
         },this);
        };
                     },
       
        
        
    callbackScope: this,
});

 //spawn Leatherface
this.leatherfaceSpawn = this.time.addEvent({
    delay: 60000,
    repeat: -1,
    callback: function(){
    this.chainsawStartSound = this.sound.add('chainsawStart');
    this.chainsawRevSound = this.sound.add('chainsawRev', {loop:true,});
    if(!this.leatherface||this.leatherface.active==false){
    this.chainsawStartSound.play();
    this.chainsawStartSound.on('ended', function(){this.chainsawRevSound.play();
        if(this.leatherface){
            this.leatherface.active=true;
            this.leatherface.x=92;
            this.leatherface.passes=0;
            this.leatherface.moveSpeed=-450;
            this.leatherface.body.setCollideWorldBounds(true);
        };
        if(!this.leatherface){
        this.leatherface = this.physics.add.sprite(92, this.gameH-250, 'leatherface');
        this.leatherface.depth=98;
        this.leatherface.setScale(.12);
        this.leatherface.moveSpeed=-450;
        this.leatherface.passes=0;
        this.leatherface.body.setCollideWorldBounds(true);
        this.leatherface.body.allowGravity=false;
        };  
        
                                                  }, this)
    };
        },
    callbackScope: this,
});

//create groups for for loops
this.bloods=this.add.group();
this.unicorns=this.add.group();
this.constraints=this.add.group();
this.ropes=this.add.group();

   //create apples group
this.apples=this.physics.add.group({
    key: 'redApple',
    repeat:0,
});

//remove first member of group so no apples are in game at start
this.apples.children.entries[0].destroy(); 

//place unicorn
this.unicorn=this.matter.add.sprite(this.appleTree.x,250,‘prancingUnicorn’);
this.unicorn.depth=6;
this.unicorn.setScale(.2);

this.ropeY=60;
    for(let i = 0; i< 10; i++){ 

this.ropes[i]=this.matter.add.sprite(this.appleTree.x,this.ropeY,‘rope’);
this.ropes[i].depth=5;
this.ropeY+=17;
if(i==0){
// constrain rope to tree point
this.constraints[i]= Phaser.Physics.Matter.Matter.Constraint.create({
pointA: {x:this.appleTree.x,y:250},
bodyB: this.ropes[i].body,
length:17,
stiffness:1,
});
this.matter.world.add(this.constraints[i]);

   };
    
   if(i>0){
       this.constraints[i]=Phaser.Physics.Matter.Matter.Constraint.create({
           bodyA:this.ropes[i-1].body,
           bodyB:this.ropes[i].body,
           length:17,
           stiffness:.2,
       })
       
      this.matter.world.add(this.constraints[i]);
   }; 
         
    };

 

this.rectangle=this.matter.add.rectangle(100,100,100,100,19)

this.rectangle.depth=100;

};
gameScene.update = function(){
console.log(this.rectangle.velocity.y)

this.appleText.setText('Apples Collected: '+this.appleCount);

 //check for full cart, make cart move off-screen and set frame to empty cart, return cart to center
if(Phaser.Math.Distance.Between(this.cart.x, this.cart.y, this.appleTree.x-68,this.appleTree.y)<=97&&Phaser.Math.Distance.Between(this.cart.x, this.cart.y, this.appleTree.x-68,this.appleTree.y)>=96&&this.cart.moving==true){this.cart.body.velocity.x=0;this.cart.moving=false};
if(this.cart.appleCount>4){this.cart.body.velocity.x=200;this.cart.moving=true};

if(this.cart.x>this.gameW+300){this.cart.x=-300;
                              this.cart.setFrame(0);
                              this.cart.appleCount=0;
                              this.cart.body.velocity.x=200;
                              this.cart.moving=true;
                              };

//arrange ropes to look more real
let ropes = this.ropes.getChildren();
let numRopes = ropes.length;
for(let i = 0; i<numRopes; i++){
    console.log(this.ropes[i])
    if (i>0){ropes[i].angle = ropes[i-1].angle}
    
};
   //position and scale luchador
    let luchadores = this.luchadores.getChildren();
    let numLuchadores = luchadores.length;
    for(let i = 0; i< numLuchadores; i++){

     luchadores[i].body.velocity.x=0;   
    luchadores[i].setScale(.1);
    luchadores[i].setCollideWorldBounds(true);
    this.physics.add.collider(luchadores[i], this.uiBox);
    if(this.teachLuchadorText){this.teachLuchadorText.destroy()};
        //move luchadores when no apples present
        if(!this.apples.children.entries[0]&& luchadores[i].moveTween==null){
            //this seems like a good place to put the wobble variable because we do not want it to be changed every cycle, just set when not chasing apples
            luchadores[i].rotationValue=1;
            //set value for tween X target in order to flip luchadores
            this.luchadorTweenValue=Phaser.Math.Between(0,this.gameW);
            if(this.luchadorTweenValue>luchadores[i].x){luchadores[i].flipX=true};
            if(this.luchadorTweenValue<luchadores[i].x){luchadores[i].flipX=false};
              luchadores[i].moveTween=this.tweens.add({
               targets:luchadores[i],
                x:this.luchadorTweenValue,
                duration:2500,
                yoyo:false,
                delay:0,
                callbackScope:this,
                onComplete:function(){if(luchadores[i]){luchadores[i].moveTween=null}},
                    });
        };
    //make luchadores wobble

        if(luchadores[i].rotationValue==1||luchadores[i].rotationValue== -1){luchadores[i].angle=luchadores[i].angle+luchadores[i].rotationValue};
      if(luchadores[i].angle>=15 || luchadores[i].angle<=-15){
        luchadores[i].rotationValue=luchadores[i].rotationValue*-1;
    };
        
                                             };

//scale apples and set depth
let redApples = this.apples.getChildren();
let numApples = redApples.length;
for(let i = 0; i< numApples; i++){
if(redApples[i].y>=800){redApples[i].destroy()};
redApples[i].setInteractive();
redApples[i].depth=99;
if(redApples[i].falling==null){
redApples[i].setScale(.03)
redApples[i].visible=true;
redApples[i].body.velocity.y=-800;
if(this.appleTree.angle<0){redApples[i].body.velocity.x=-300}
if(this.appleTree.angle>0){redApples[i].body.velocity.x=300}
};
if(redApples[i].y<(this.gameH/2)){
redApples[i].falling=true;};

    if(redApples[i].falling==true && !redApples[i].fallRate){
       redApples[i].fallRate=9.8;
    };
        redApples[i].body.velocity.y=redApples[i].body.velocity.y+redApples[i].fallRate;

redApples[i].fallRate=redApples[i].fallRate^2;
if(redApples[i].x<this.appleTree.x){
redApples[i].body.velocity.x=Phaser.Math.Between(-50, -300);
};

        if(redApples[i].x>this.appleTree.x){
    redApples[i].body.velocity.x=Phaser.Math.Between(50,300);
};
    redApples[i].on('pointerdown', function(){
    redApples[i].destroy();
    this.cart.appleCount++;
    this.cart.setFrame(this.cart.appleCount);
    this.appleCount++

}, this);
};
//luchador chases apples, new redapples variable needed because this exists within a for loop and you cannot redeclare a let within a let

    let redApples2 = this.apples.getChildren();
    let numApples2 = redApples2.length; 
    for(let q = 0; q< numApples; q++
    ){
    let luchadores2 = this.luchadores.getChildren();
    let numLuchadores2 = luchadores2.length;
    for (let i =0; i< numLuchadores2; i++){
    //stop luchador movement tween
    if(redApples2[q]){
        if(luchadores2[i].moveTween != null){
            luchadores2[i].moveTween.stop()
            luchadores2[i].moveTween=null;
        };
          };
    
    //move towards apple
    if((luchadores2[i])&&redApples2[q].x>=luchadores[i].x){luchadores2[i].body.velocity.x=300;
        luchadores2[i].flipX=true};
        
    if((luchadores2[i])&&redApples2[q].x<luchadores2[i].x){luchadores2[i].body.velocity.x=-300
        luchadores2[i].flipX=false};
    if((luchadores2[i])&&(luchadores2[i].y>=525)&&(redApples2[q].falling==true)){luchadores2[i].body.velocity.y=-500};  
    
             //luchador catches apple   
    if(this.luchadores.children.entries[0]){this.physics.add.collider(luchadores2[i], redApples[q], function(){
    redApples2[q].destroy();
    this.cart.appleCount++;
    this.cart.setFrame(this.cart.appleCount);
    this.appleCount++
    this.appleText.setText('Apples Collected: '+this.appleCount)

},null,this)
};

                     }; 
    };

//start

    let luchadores3 = this.luchadores.getChildren();
    let numLuchadores3 = luchadores3.length; 
    for(let i = 0; i< numLuchadores; i++){
           //collide leatherface with luchador
    if(this.luchadores.children.entries[0]&&this.leatherface){
    this.physics.add.overlap(luchadores3,this.leatherface,function(){
    this.scream1Sound.play();
    this.squishSound.play();
   
     let bloodNumber=Math.random()*3;
    
    if (bloodNumber <=1 && bloodNumber > 0){
     this.bloods.create()
    this.bloods[this.numberOfBloods]=this.physics.add.sprite(luchadores3[i].x, luchadores3[i].y, 'blood1')
    };


    if (bloodNumber<=2 && bloodNumber>1){
        this.bloods.create(); 
    this.bloods[this.numberOfBloods]=this.physics.add.sprite(luchadores3[i].x, luchadores3[i].y, 'blood2')
    };
    
    if (bloodNumber<=3 && bloodNumber>2){
        this.bloods.create();        
    this.bloods[this.numberOfBloods]=this.physics.add.sprite(luchadores3[i].x, luchadores3[i].y, 'blood3')
    };
    this.numberOfBloods++;
    luchadores3[i].destroy();
},null,this);
    }; 

};
//end

//make sky rotate

this.nightSky.angle=this.nightSky.angle+.03;
//make leatherface move
if(this.leatherface){

    this.physics.add.collider(this.cart,this.leatherface,function(){
    this.appleCount=this.appleCount-this.cart.appleCount;
    this.cart.appleCount=0;
    this.cart.x=3000;
    this.cartBreakSound.play();
},null,this);
     this.leatherface.moveTween=this.tweens.add({
               targets:this.leatherface,
                angle:Phaser.Math.Between(-20,20),
                duration:20,
                yoyo:true,
                delay:0,
                callbackScope:this,
              
  });
  
    }; 

    


//get rid of blood sprite
if(this.bloods[this.numberOfBloods]){
if(this.bloods[this.numberOfBloods].y>1000){this.bloods[this.numberOfBloods].destroy()};
};

//leatherface leaves scene
if(this.leatherface){
    this.leatherface.body.velocity.x=this.leatherface.moveSpeed;
    if(this.leatherface.x>810){
        this.leatherface.x=this.leatherface.x-10;
        this.leatherface.moveSpeed=this.leatherface.moveSpeed*-1;
        this.leatherface.passes++;
    };
    
    if(this.leatherface.x<91){
        this.leatherface.x=this.leatherface.x+10;
        this.leatherface.moveSpeed=this.leatherface.moveSpeed*-1;
        this.leatherface.passes++;

    };
    if(this.leatherface.body.velocity.x>0){this.leatherface.flipX=false};
    if(this.leatherface.body.velocity.x<0){this.leatherface.flipX=true};
   
if(this.leatherface.passes >=5){
this.leatherface.body.velocity.x=-450;
this.leatherface.setCollideWorldBounds(false);
this.leatherface.x=this.leatherface.x-20;
this.leatherface.moveSpeed=-450;
if(this.leatherface.x<-50){
    this.leatherface.x=-10000;
    this.leatherface.active=false;
    this.leatherface.body.velocity.x=0;
    this.chainsawRevSound.stop();
};
};

};

};

//and this is the preload
// create a new scene
let preloadScene = new Phaser.Scene(‘Preload’);

//init

// load assets
preloadScene.preload = function(){

this.load.image(‘redApple’, ‘images/redApple.png’);
this.load.image(‘yellowApple’, ‘images/yellowApple.png’);
this.load.image(‘greenApple’, ‘images/greenApple.png’);
this.load.image(‘appleTree’, ‘images/appleTree.png’);
this.load.image(‘luchadorMask’, ‘images/luchadorMask.png’);
this.load.image(‘nightSky’, ‘images/nightSky.jpg’);
this.load.image(‘hills1’, ‘images/hills1.png’);
this.load.image(‘hills2’, ‘images/hills2.png’);
this.load.image(‘leatherface’, ‘images/leatherface.png’);
this.load.audio(‘chainsawStart’, ‘sounds/chainsawStart.mp3’);
this.load.audio(‘chainsawRev’, ‘sounds/chainsawRev.wav’);
this.load.audio(‘scream1’, ‘sounds/scream1.wav’);
this.load.audio(‘squish’, ‘sounds/squish.wav’);
this.load.audio(‘cartBreak’, ‘sounds/cartBreak.wav’);
this.load.image(‘blood1’, ‘images/blood1.png’);
this.load.image(‘blood2’, ‘images/blood2.png’);
this.load.image(‘blood3’, ‘images/blood3.png’);
this.load.image(‘prancingUnicorn’, ‘images/prancingUnicorn.png’);
this.load.image(‘rope’, ‘images/smallRope.png’);
this.load.image(‘noose’, ‘images/noose.png’);
this.load.spritesheet(‘cart’, ‘images/cart.png’, {

 frameWidth: 1830,
frameHeight: 1278,
margin: 0,
spacing: 0,

});

this.load.spritesheet('luchadores', 'images/luchadores.png', {
 
 frameWidth: 1545,
frameHeight: 1500,
margin: 0,
spacing: 0,

});

//load unicorn bodies from JSON
this.load.json('matterShapes', 'data/matterShapes.json')

};

preloadScene.create=function(){
this.scene.start(‘Game’)
};

Game works fine. GameOver does not load the unicorn unless I hard code it into its own preload method.

GameOver has { active:true } so it will start immediately, but Preload hasn’t finished loading yet.

[-] Preload (loading)
[-] Game (init)
[*] GameOver (running)

How do I change that? I can’t put two lines of this.scene.start()

If the solution is in your reply, I’m not sure where to put it.

Do I give it a {loader:}?

Remove { active:true } from GameOver scene config.

Does your game reach GameOver scene from Game scene, I guess? If so you can just do

// Game
// Player died :(
this.scene.start('GameOver');

I’m just playing with scenes running at the same time right now. Eventually I want to add a UI to the bottom of the game that runs as its own scene.

Can I delay the activation of a scene?

OK, I found a solution. I used this.scene.launch('GameOver) I did not know about the launch command. Thanks again for weighing in on this!