# Parte 4 - Jugabilidad

## Eventos

Los eventos nos permiten activar funciones basados en un suceso o un contador de tiempo.\
Nosotros vamos a crear una nave enemiga dado determinado tiempo, y queremos darle una posición al azar en el eje x, para eso vamos a la escena y en `create()` agregamos este código

```javascript
create(){
...
  this.time.addEvent({
    // The time between the event trigger
    delay: 1000, 
    callback: function() {
      // it will spawn at Y: 0 (top), and a random X value based
      // on screen width
      var enemy = new RedShip(
        this,
        Phaser.Math.Between(0, this.game.config.width),
        0
      );
      this.enemies.add(enemy);
      enemy.move();
    },
    callbackScope: this,
    loop: true
  });
...
}
```

## Colisiones

Existen dos tipos de colisiones, `collision` y `overlap`. Vamos a usar `overlap` porque no queremos que nuestros objetos reboten sino que mueran al sobreponerse.

En este caso vamos a crear dos grupos de colisiones, entre el jugador y una nave enemiga del grupo de naves enemigas que creamos antes. Osea que esto también aplicara a cualquier nave nueva que se cree.\
Y entre las naves enemigas y el grupo de disparos que crea el jugador.

Todo esto lo colocamos al final del metodo `create()` de nuestra escena.

```javascript
create(){
...
//Setting collisions
this.physics.add.overlap(this.enemies, this.player, (enemy, player) => {
  player.onDestroy();
});

this.physics.add.overlap(this.enemies, this.playerLasers, (enemy, laser) => {
  enemy.destroy();
  laser.destroy();
});
}
```

Por ultimo. Ya chequeamos que los objetos se destruyan al chocar, y tenemos un método armado que heredan todos nuestros objetos `checkOutOfBonds()`

En el método `update()` de nuestra escena, vamos a agregar dos funciones que se encarguen de verificar si algún objeto del grupo de disparos o enemigos se ha ido fuera del nivel.

```javascript
this.playerLasers.getChildren().forEach(element => {
  element.checkOutOfBonds()
});
this.enemies.getChildren().forEach(element => {
  element.checkOutOfBonds()
});
```
