Système de détection du héros
Auteur : Laugilus
Ce système permet à des évènements de repérer le héros de deux manières différentes. Les évènement ont donc deux champs de vision :
- Un circulaire
- Un ovale
Il est possible de spécifier l'intégralité des paramètres pour les champs de vision. Le système permet éventuellement d'activer un interrupteur local (A, B, C ou D, au choix
) de l'évènement concerné lorsque le héros est repéré par l'évènement.
Il est également possible de faire plusieurs évènements qui repèrent le héros sur la même map.
Utilisation :Dans un évènement (n'importe lequel, ça peut être ou non celui qui doit posséder le champ de vision), dans une page en processus parallèle, mettre :
- Citation :
- Script : @d = Detection.new(X)
Remplacez X par l'id/le numéro de l'évènement qui doit posséder le champ de vision.
Selon ce que vous souhaitez, il y a ensuite plusieurs utilisations :
Champ de vision en cercle- En activant un interrupteur :A la suite, faites :
- Citation :
- Script : @d.circle(Rayon, 'B')
- Remplacez Rayon par le rayon du champ de vision.
- Ceci activera l'interrupteur local B de l'évènement qui possède le champ de vision lorsque l'évènement verra le héros, dès que le héros entre dans le champ de vision circulaire.
Exemple :
- Citation :
- Script : @d.circle(5, 'A')
- Sans activer d'interrupteur :A la suite, faites une condition, et mettez comme paramètre script. Ensuite, tapez ceci dans la condition :
- Citation :
- @d.circle(Rayon)
Remplacez Rayon par le rayon du champ de vision.
Champ de vision ovale- En activant un interrupteur :A la suite, faites :
- Citation :
- Script : @d.ellipse(Longueur, Largeur, 'C')
- Remplacez Longueur et Largeur par la longueur et la largeur du champ de vision.
- Ceci activera l'interrupteur local C de l'évènement qui possède le champ de vision lorsque l'évènement verra le héros, dès que le héros entre dans le champ de vision ovale.
- Sans activer d'interrupteur :A la suite, faites une condition, et mettez comme paramètre script. Ensuite, tapez ceci dans la condition :
- Citation :
- @d.ellipse(Longueur, Largeur)
Remplacez Longueur et Largeur par la longueur et la largeur du champ de vision.
Exemple : Champ de vision circulaire sans activer d'interrupteurScript :Insérez un nouveau script au dessus de Main, et nommez-le : Laugilus_eSt_SadiquE. Attention, respectez bien les majuscules, sinon ça ne marchera pas !
- Code:
-
#===============================================================================
# Système de détection du héros
#-------------------------------------------------------------------------------
# Auteur : Laugilus
# Version : 0.1
# Date : 11/07/2008
#-------------------------------------------------------------------------------
class Detection
def initialize(event_id)
@event_id = event_id
end
def distance(racine=true)
if racine
return (($game_player.x - $game_map.events[@event_id].x)**2 + ($game_player.y - $game_map.events[@event_id].y)**2).to_f**0.5
else
return ($game_player.x - $game_map.events[@event_id].x)**2 + ($game_player.y - $game_map.events[@event_id].y)**2
end
end
def circle(r, switch=nil)
r *= r
if distance(false) <= r
unless switch.nil?
key = [$game_map.map_id, @event_id, switch]
$game_self_switches[key] = true
$game_map.events[@event_id].refresh
end
return true
end
end
def ellipse(longueur, largeur, switch=nil)
@x_event = $game_map.events[@event_id].x
@y_event = $game_map.events[@event_id].y
@x = $game_player.x
@y = $game_player.y
longueur = longueur.to_f/2
largeur = largeur.to_f/2
distance_foyers = (longueur**2-largeur**2).to_f**0.5
@direction = $game_map.events[@event_id].direction
if @direction == 2
@x_foyer = @x_event
@y_foyer = @y_event + distance_foyers*2
elsif @direction == 8
@x_foyer = @x_event
@y_foyer = @y_event - distance_foyers*2
elsif @direction == 4
@x_foyer = @x_event - distance_foyers*2
@y_foyer = @y_event
elsif @direction == 6
@x_foyer = @x_event + distance_foyers*2
@y_foyer = @y_event
end
@equation = (((largeur**2 + distance_foyers**2).to_f**0.5)*2).round
@distance_heros_foyers = distance(true) + ((@x_foyer-@x)**2 + (@y_foyer-@y)**2).to_f**0.5
@distance_heros_foyers = @distance_heros_foyers.round
if @distance_heros_foyers <= @equation
unless switch.nil?
key = [$game_map.map_id, @event_id, switch]
$game_self_switches[key] = true
$game_map.events[@event_id].refresh
end
return true
end
end
end
PS : Si vous utilisez ce système, merci de me mettre dans vos crédits.