Imagin
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
-55%
Le deal à ne pas rater :
Coffret d’outils – STANLEY – STMT0-74101 – 38 pièces – ...
21.99 € 49.04 €
Voir le deal

Gestion des directions des PNJ's

2 participants

Aller en bas

Gestion des directions des PNJ's Empty Gestion des directions des PNJ's

Message par Kolom 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

http://funkywork.blogspot.com/

Revenir en haut Aller en bas

Gestion des directions des PNJ's Empty Re: Gestion des directions des PNJ's

Message par elm6 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)!
elm6
elm6
Justicier Lv.Zero
Justicier Lv.Zero

Messages : 2547
Age : 33

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

http://imagin.jeunforum.com/portal.htm

Revenir en haut Aller en bas

Revenir en haut


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