Téléporte ton joueur

pour Lucas (Rosny-sous-bois)

Alors comme ça tu veux balader ton joueur d'un endroit à l'autre de ton niveau. Il existe deux façons de faire : soit ton joueur est téléporté sur une case au hasard dans ton niveau, soit sur une case que tu aura choisie. Les deux méthodes sont décrites ci-dessous, choisis celle que tu préfère.

Téléporter le joueur aléatoirement sur la carte

Cette petite fonction placera le joueur à un endroit aléatoire sur la carte. Pour cela elle va sélectionner chaque case libre dans ton niveau, puis choisir l'une d'entre-elles pour y placer ton joueur. Colle-la dans ton script item.js.

function teleport(){ // téléporte le joeur à un emplacement aléatoire let l = []; let s = createVector(rooms.length,rooms[0].length); for( let x = 0 ; x < s.x ; x ++ ) { for( let y = 0 ; y < s.y ; y ++ ) { let b = (playerPos[1].x != x || playerPos[1].y != y) ; if ( b && pathCheck(x,y,true, true) && !itemCheck(x,y) ) { let v = createVector(x,y) ; append( l , v ); } } } if ( l.length > 0 ) { let d = int( random( 0 , l.length ) ); let v = createVector( l[d].x , l[d].y ); playerPos = [ v , v ] ; vGrid = viewGrid( v.x , v.y , playerR[0] ); } fx[5].play(); }

Maintenant il va nous falloir modifier la fonction pick() dans le script item.js. Pour cela il te suffit de remplacer pickItem( thisItem ) par teleport() devant la condition correspondant à l'objet qui téléportera le joueur.

function pick(thisItem){

  // interaction du joueur avec les objets

  // ici l'objet 1 téléporte le joueur
  
  let objet = thisItem.type ;

  if ( objet == 0 ) treasure( thisItem ) ;

  if ( objet == 1 ) pickItem( thisItem ) ;

  if ( objet == 1 ) teleport() ;
  
  if ( objet == 2 ) pickItem( thisItem ) ;
  if ( objet == 3 ) pickItem( thisItem ) ;
  
}

Téléporter le joueur à un endroit spécifique sur la carte

Pour pouvoir définir un endroit spécifique où faire atterrir ton joueur, tu dois savoir comment modifier ton niveau. Si tu sais déjà le faire alors passons à la suite.

Pour commencer, tu dois choisir l'emplacement en question sur la carte dans la fonction playerLevel() du script level.js en choisissant un nombre que tu n'as pas déjà utilisé. Tu peux placer plusieurs emplacements, la fonction sélectionnera un aléatoirement quand le joueur se téléportera. Ici j'ai choisi 9.

function levelEditor() {
  
  // cette fonction initialise les couloirs et les éléments du niveau
              
  let grid = [ 
                
    [ 7 , 1 , 1 , 1 , 1 , 1 , 1 , 8 ], 
    [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ], 
    [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ], 
    [ 1 , 2 , 1 , 3 , 1 ,9, 1 , 1 ], 
    [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ], 
    [ 1 , 1 ,9, 1 , 1 ,9, 1 , 1 ], 
    [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ], 
    [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ], 
                
  ];
              
  /*
              
    0 = mur
    1 = passage
    2 = ennemi 1
    3 = ennemi 2
    4 = objet 1
    5 = objet 2
    6 = objet 3
    7 = départ
    8 = trésor
    
    9 = cible téléport
              
  */
              
  return grid ;
            
}

Ensuite, dans le script room.js trouve la classe room et rajoutes-y cette nouvelle variable.

class room {
  
  constructor(){
    
    // ici sont déclarés les variables de chaque salle
    
    this.path = true;
    this.x = 0; 
    this.y = 0;
    this.walls = [];
    
    this.teleport = 0 ;
    
  }
  
}

Puis, dans le script level.js trouve la fonction placeItem() et rajoutes y cette ligne, en remplaçant bien le 9 par le nombre que tu auras choisi.

function placeItem( n , x , y ){
  
  // place les éléments
  
  let p = createVector(x,y);
  let b = isFloating;
  
  if (n==0) rooms[x][y].path=false; // passages
  if (n==1) rooms[x][y].path=true; // passages
  if (n==2) append( enemys, new enemy( p , 0 , b[0] ) ) ; // ennemi 1
  if (n==3) append( enemys, new enemy( p , 1 , b[1] ) ) ; // ennemi 2
  if (n==4) append( items, new item ( p , 1 ) ) ; // objet 1
  if (n==5) append( items, new item ( p , 2 ) ) ; // objet 2
  if (n==6) append( items, new item ( p , 3 ) ) ; // objet 3
  if (n==7) playerPos=[ p , p ]; // départ
  if (n==8) append( items ,  new item ( p , 0 ) ); // trésor

  if (n==9) rooms[x][y].teleport = 1 ;
  
}

Libre à toi de créer d'autres téléporteurs en modifiant le 1 et le 9 sur la ligne par d'autres numéros, par exemple :

if (n== 10 ) rooms[x][y].teleport = 2 ; // téléporteur 2

Enfin, colle dans le script item.js la fonction teleport(), ou remplace-la si tu l'as déjà créé.

function teleport(t){ let l = []; let s = createVector(rooms.length,rooms[0].length); for ( let x = 0 ; x < s.x ; x++ ) { for ( let y = 0 ; y < s.y ; y ++ ) { let b = (playerPos[1].x != x || playerPos[1].y != y); if ( b && pathCheck(x,y,true, true) && rooms[x][y].teleport == t ){ let v = createVector(x,y) ; append( l , v ); } } } if ( l.length > 0 ) { let d = int(random(0,l.length)); let v = createVector(l[d].x,l[d].y); playerPos[0] = v; playerPos[1] = v; } fx[5].play(); }

Pour finir, il va nous falloir modifier la fonction pick() dans le script item.js. Après la condition qui correspond à l'objet que tu auras choisi pour téléporter, remplace pickItem(thisItem); par la fonction teleport(1); en remplaçant le 1 par un autre téléporteur si nécessaire. Dans cet exemple j'ai choisi l'objet 1 pour le téléporteur 1.

function pick(thisItem){

  // interaction du joueur avec les objets

  // ici l'objet 1 téléporte le joueur
  
  let objet = thisItem.type ;

  if ( objet == 0 ) treasure( thisItem ) ;

  if ( objet == 1 ) pickItem( thisItem ) ;

  if ( objet == 1 ) teleport( 1 ) ;
  
  if ( objet == 2 ) pickItem( thisItem ) ;
  if ( objet == 3 ) pickItem( thisItem ) ;
  
}