Skip to content
This repository has been archived by the owner on Jul 24, 2020. It is now read-only.

Sélecteurs

Xavier Van de Woestyne edited this page Oct 26, 2019 · 4 revisions

Il arrive parfois que l'on désire appliquer une action sur certains évènements en particulier mais à la volée. Par exemple j'aimerais que si je clique sur l'évènement 1 ou l'évènement 2, il saute sur place.

Il est évidemment possible de le réaliser avec des conditions, cependant, toutes les commandes qui effectuent une action sur un évènement peuvent, plutôt que prendre leur ID (et donc n'être appliqué que sur un seul évènement), prendre une construction un peu particulière qui est un sélecteur.

Prenons par exemple la commande : mouse_click_event?(events)

Renvoie true si la souris clique un évènement du sélecteur passé en argument

Nom Type Description
events Selectors Selecteur d'évènements

Cette commande renvoie true si au moment de son appel, la souris clique sur un évènement passé en argument. Donc cette expression est tout à fait valide : mouse_click_event?(1) et renverra true si la souris clique sur l'évènement 1. (false sinon).

Admettons maintenant que je veuilles effectuer la même action, donc savoir, si je clique sur l'évènement 1, 2 et 3? Vous me direz que c'est facile et qu'il suffit que je me serve d'un OR (oui, cette commande renvoie bien une valeur booléenne, soit true ou false), cependant, reconnaissez que ce n'est pas très efficace? Pour ce faire, il est possible de passer à l'argument events, qui attend un sélecteur, bien plus qu'un simple entier. (Oui l'entier est le sélecteur le plus primitif).

Composer un sélecteur simple

Au delà du simple entier pour référencer un évènement, nous avons le sélecteur "Produit". Qui permet de sélectionner une liste d'évènements: get_events(id1, id2, etc.). On peut lui donner une infinité d'ID d'évènements et il ne prendra que ceux existant. Dès lors, pour reprendre l'exemple précédent, soit effectuer la même action pour les évènements 1, 2 et 3, et ajoutons le héros (qui est toujours référencé par l'ID 0), nous pourrions nous servir de ce sélecteur : get_events(1,2,3,0), ce qui donnerait : mouse_click_event?(get_events(1,2,3,0)).

Générer un sélecteur

Le sélecteur simple oblige de connaitre tous les ID's. Il est possible d'utiliser de générer un sélecteur de cette manière : get_events{|id| générateur}. Par exemple, pour générer un sélecteurs possédant tous les évènements dont l'ID est superieur à 10 : events{|id| id > 10}. Il est possible de lier la condition du générateur avec les opérateurs logiques par exemple get_events{|id| id > 15 and id < 100} fournira le sélecteur des évènements dont l'id est strictement superieur à 15 et strictement inférieur à 100.

Utilisation des commandes RME

Il est évident, comme un générateur connait l'ID d'un évènement de faire preuve de plus d'originalité en utilisant directement, dans le générateur, des commandes RME. Par exemple : get_events{|id| event_x(id) > 14 and event_y(id) > player_y}, qui produira le sélecteur des évènements dont la position en X est superieur à 14 et qui se trouvent en dessous du héros.

Combinaisons d'un sélecteur simple et d'un générateur

Il est possible de sélectionner et de générer, par exemple : get_events(1,2,3){|id| event_x(id) > 15}, qui produira un sélecteur contenant les évènement 1, 2 et 3 mais aussi tous les évènements dont la coordonnées X est superieur à 15.

Sélecteur universel

Il est aussi possible, très simplement, de créer un sélecteur qui comprend l'intégralité des évènements et du héros. Une manière d'écrire ce sélecteur serait : get_events{|id| id >= 0} par exemple, pour dire "prend tous les évènements dont l'ID est positif". Cependant, il existe un sélecteur plus simple : all_events ou (en fonction de votre préférence) get_events(:all_events). J'ai une petite préférence pour la première version.

Selecteurs pour un seul évènement

Il existe deux sélecteurs qui renvoient un seul évènement trouvé dans la liste des évènements. Il s'agit de once_event{|id| generateur} qui renverra le premier ID d'évènement correspondant au générateur et once_random_event{|id| generateur} qui renverra un ID aléatoire d'un évènement correspondant au générateur. Pour les deux commandes, si aucun évènement ne correspond au sélecteur, elles renvoient nil.

Exclure des évènements

Parfois, les générateurs prennent un peu trop d'évènements à notre goût et nous aimerions pouvoir en retirer quelques un. Pour ça on peut se servir de not. Par exemple, all_events.not(0) renverra un sélecteur comprenant tous les évènements sauf le héros. Comme pour le sélecteur simple, on peut passer à not une infinité d'identifiant. Par exemple : get_events{|id| id%2 == 0}.not(2, 4, 16, 38) est un sélecteur qui sélectionnera tous les évènements dont les ID's sont paires sauf les évènements 2, 4, 16 et 38.
La fonction not peut aussi exclure avec un générateur d'exclusion. Par exemple all_events.not{|id| event_x(id) < player_x} est un sélecteur qui prendra tous les évènements sauf ceux situés à la gauche du héros.
Et comme pour les générateurs simple, il est possible de combiner l'énumération et le générateur. Par exemple : all_events.not(0){|id| id > 13}. (Je ne pense pas que je doive vous expliquer ce dernier sélecteur ! Si oui, je vous invite à relire toute cette page).

Ne fonctionnent pas sur les sélecteurs uniques !

Astuce pratique

En général, il arrive que les sélecteurs deviennent gros, je n'hésite donc pas à les stocker dans des variables. Par exemple :

# Un sélecteur pour tous les évènements se trouvant 
# sur le même axe vertical que le héros et dont 
# l'identifiant est impair
V[1] = get_events{ |id|
   (event_y(id) == player_y) and (id%2 != 0)
}.not(0)

Autres sélecteurs

Il existe d'autres sélecteurs ayant exactement la même sémantique que ceux des événements :

  • `get_pictures` (ou `all_pictures` pour toutes les images)
    
Clone this wiki locally