Gestion des directions des PNJ's

Voir le sujet précédent Voir le sujet suivant Aller en bas

Gestion des directions des PNJ's

Message par Kolom le Lun 9 Jan - 15:44

Description
Cet utilitaire permet de gerer les directions des évènements. Ainsi que leur attribuer un champs de vision annecdotique.
Par Molok et Fabien

Installation
Copier / coller le script au dessus de main

Utilisation
Ce script se décompose en plusieurs fonctions

1.see? 10
: retourne true si le PNJ 10 est dans le champs de vision du PNJ 1 (utiliser 0 pour le heros)
10.seen_by? 1
: retourne true si le PNJ 10 est dans le champs de vision du PNJ1
1.look_at 10
: Tourne un PNJ (1) en direction d'un autre (10).
[1, 2, 3, 4].look_at 10
: Tourne un groupe PNJ (1, 2, 3, 4) en direction d'un autre (10).
(1..9).look_at 10
: Tourne un groupe PNJ (de 1 à 9) en direction d'un PNJ (10).
$game_events[10].scope.ray = 10
: Change le rayon de vision du PNJ 10 de 10 cases
$game_player.scope.ray = 3
: Change le rayon de vision du heros de 3 cases

Look_at peut être utilisé dans des dialogues, par exemple si des PNJs indiquent un autre PNJ dans leur conversation.
Les champs de visions sont simples ils correspondent à un demi cercle en devant le héros. Ils sont limité (par soucis de facilité de paramétrage).

Petit exemple
Cette petite vidéo a été réalisée en 3 minutes (uhu le mapping).
http://vimeo.com/34785442

Code:
#==============================================================================
# Look At Me Now
# Par Fabien & Molok
#==============================================================================

# API
#==============================================================================
# ** Fixnum
#------------------------------------------------------------------------------
# The class for fixed-length integers that fit into the machine's pointer, which is usually
# 31 bits long. If the result of an operation is out of Fixnum range, it is automatically
# extended into a Bignum.
#==============================================================================

class Fixnum
  #--------------------------------------------------------------------------
  # * self see other event
  #--------------------------------------------------------------------------
  def see?(other_event)
    ((self == 0) ? $game_player : $game_map.events[self]).see?(other_event)
  end
  #--------------------------------------------------------------------------
  # * self is in other scope
  #--------------------------------------------------------------------------
  def seen_by?(other_event)
    ((self == 0) ? $game_player : $game_map.events[self]).seen_by?(other_event)
  end
  #--------------------------------------------------------------------------
  # * Events collection look at one event
  #--------------------------------------------------------------------------
  def look_at(x_id,y=nil)
    [self].look_at(x_id, y)
  end
end

#==============================================================================
# ** View_Scope
#------------------------------------------------------------------------------
#  Define a simple ViewScope
#==============================================================================

class View_Scope
  #--------------------------------------------------------------------------
  # * Instances variables
  #--------------------------------------------------------------------------
  attr_accessor :x, :y, :dir, :ray
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(ray = 2)
    @x = @y = 0
    @ray = 3
    @dir = 2
  end
  #--------------------------------------------------------------------------
  # * x, y scoped ?
  #--------------------------------------------------------------------------
  def in?(x, y)
    if @dir == 2
      return false if y < @y
    elsif @dir == 4
      return false if x > @x
    elsif @dir == 6
      return false if x < @x
    elsif @dir == 8
      return false if y > @y
    end
    collide = ((x - @x)**2) + ((y - @y)**2)
    return !(collide > (@ray**2))
  end
end
#==============================================================================
# ** Game_Character
#------------------------------------------------------------------------------
#  This class deals with characters. It's used as a superclass of the
# Game_Player and Game_Event classes.
#==============================================================================

class Game_Character
  #--------------------------------------------------------------------------
  # * Alias
  #--------------------------------------------------------------------------
  alias scope_update update
  alias scope_initialize initialize
  #--------------------------------------------------------------------------
  # * Instances variables
  #--------------------------------------------------------------------------
  attr_accessor :scope
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    scope_initialize
    @scope = View_Scope.new
  end
  #--------------------------------------------------------------------------
  # * self is in other scope
  #--------------------------------------------------------------------------
  def seen_by?(other_event)
    return (other_event == 0 ? $game_player : $game_map.events[other_event]).scope.in?(@x, @y)
  end
  #--------------------------------------------------------------------------
  # * self see other event
  #--------------------------------------------------------------------------
  def see?(other_event)
    ev = (other_event == 0) ? $game_player : $game_map.events[other_event]
    return @scope.in?(ev.x, ev.y)
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    @scope.dir = @direction
    @scope.x = @x
    @scope.y = @y
    scope_update
  end
  #--------------------------------------------------------------------------
  # * Turn toward Event
  #--------------------------------------------------------------------------
  def turn_toward(x, y)
    sx = @x - x
    sy = @y - y
    return if sx == 0 and sy == 0
    if sx.abs > sy.abs
      sx > 0 ? turn_left : turn_right   
    else
      sy > 0 ? turn_up : turn_down
    end
  end
end

#==============================================================================
# ** Array
#------------------------------------------------------------------------------
#  The array class. The elements of an array are arbitrary Ruby objects.
#==============================================================================

class Array
  #--------------------------------------------------------------------------
  # * Events collection look at one event
  #--------------------------------------------------------------------------
  def look_at(x_id,y=nil)
    if y == nil
      ev=(x_id==0 ? $game_player : $game_map.events[x_id])
      x,y=ev.x,ev.y
    else
    x,y=x_id,y
    end
    self.each do |event|
      (event==0 ? $game_player : $game_map.events[event]).turn_toward(x,y)
    end
  end
end

#==============================================================================
# ** Range
#------------------------------------------------------------------------------
#  The range object class
#==============================================================================

class Range
  #--------------------------------------------------------------------------
  # * Events collection look at one event
  #--------------------------------------------------------------------------
  def look_at(x_id,y=nil)
    ((self).to_a).look_at(x_id, y)
  end
end

Kolom
Poulet trizo Lv.3
Poulet trizo Lv.3

Messages : 16

Fiche
Palmarès: 1
Spécialité: Script
Avertissements: Aucun

Voir le profil de l'utilisateur http://funkywork.blogspot.com/

Revenir en haut Aller en bas

Re: Gestion des directions des PNJ's

Message par elm6 le Lun 9 Jan - 18:04

Très cool! Ça facilite énormément les phases d'infiltration, ou même permet de gérer facilement le comportement d'ennemis visibles sur la map!

Un script très utile donc, merci Molok (et Fabien)!

_________________

« Parce que certains mystères ne demandent pas à être compris, ils ont pour seul désir d’être vécus. » - Oskar Fleisjr, Chroniques de Liève.

elm6
Justicier Lv.Zero
Justicier Lv.Zero

Messages : 2547
Age : 25

Fiche
Palmarès: 2
Spécialité: Ecriture, making
Avertissements: Aucun

Voir le profil de l'utilisateur http://imagin.jeunforum.com/portal.htm

Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum