UltimaForum

Skrypty [VX] - Lustrzane powierzchnie

Angius - Pią 08 Lip, 2011 16:33
Temat postu: Lustrzane powierzchnie
Lustrzane Powierzchnie

Opis:
Skrypt pozwala nam utworzyć obszary które będą odbijały bohatera, czy zdarzenie. Jedynym mankamentem może być to, że obszary nie sprawdzają się przy skomplikowanych kształtach zbiorników wodnych...
Info:
Autor: Sephirothtds
Tłumaczenie: Angius
Skrypt:
Spoiler:

Kod:
#==============================================================================
# ** TDS Sprite Reflect
# Version: 1.7
#------------------------------------------------------------------------------
# Ten skrypt odbija grafikę zdarzeń/bohaterów w określonych obszarach
#==============================================================================
# Instrukcje:
#
# Stwórz obszary mapy i nazwij je "Reflect".
#
# Dla eventów możemy użyć poniższych tagów w ich nazwie.
#
#                 Reflect
#
# Każdy event z "Reflect" w nazwie będzie się odbijał w ustawionych obszarach
#
#             /OFFSET[#]
#
#  [#] = Wartość przesunięcia.
#
#  Przykład:
#   /OFFSET[10]
#
# Offset zmienia położenie Y odbicia w pikselach. (Jak daleko
# odbicie będzie od źródła - grafiki odbijającej się)
#
# $game_player.reflect_offset = #
#
#  # = Przesunięcie odbicia gracza.
#
# Tak samo jak /OFFSET[#], ale dla bohaterów.
#==============================================================================
#=======================================================================
#                               POTĘŻNA KONFIGURACJA!
#=======================================================================
#                      Nie zgubcie się w tym gąszczu opcji!
  #--------------------------------------------------------------------------
  # * Efekt falowania wody?
  #--------------------------------------------------------------------------
  WATER_WAVE_EFFECT = true
#=======================================================================
#                        KONIEC POTĘŻNEJ KONFIGURACJI!
#=======================================================================
#==============================================================================
# ** Sprite_Character
#------------------------------------------------------------------------------
#  This sprite is used to display characters. It observes a instance of the
# Game_Character class and automatically changes sprite conditions.
#==============================================================================

class Sprite_Reflect < Sprite_Base
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :character
  #--------------------------------------------------------------------------
  # * Object Initialization
  #     viewport  : viewport
  #     character : character (Game_Character)
  #     offset    : offset value from the characters starting point.
  #--------------------------------------------------------------------------
  def initialize(viewport = nil, character = nil, offset = nil)
    super(viewport)
    self.visible = false
    @character = character
    @player_offset = $game_player.reflect_offset   
    @offset = (@character.is_a?(Game_Player) ? @player_offset : offset)
    sprite_setup   
    update
  end
  #--------------------------------------------------------------------------
  # * Sprite Setup
  #--------------------------------------------------------------------------
  def sprite_setup
    self.bitmap = Cache.character(@character.character_name)           
     self.angle = 180
     self.mirror = true   
     self.opacity = 120       
     sign = @character.character_name[/^[\!\$]./]
      if sign != nil and sign.include?('$')
       @cw = bitmap.width / 3
       @ch = bitmap.height / 4
      else
       @cw = bitmap.width / 12
       @ch = bitmap.height / 8
     end             
  end
 
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    super   
     index = @character.character_index
     pattern = @character.pattern < 3 ? @character.pattern : 1
     sx = (index % 4 * 3 + pattern) * @cw
     sy = (index / 4 * 4 + (@character.direction - 2) / 2) * @ch           
     self.src_rect.set(sx, sy, @cw, @ch)     
     
     if @character.is_a?(Game_Player)
        self.ox = @cw / 2       
        self.oy = 8 + @ch + $game_player.reflect_offset       
      else       
        self.ox = @cw / 2               
        self.oy = 8 + @ch + @offset
     end

     self.x = @character.screen_x
     self.y = @character.screen_y
     self.z = @character.screen_z

    if WATER_WAVE_EFFECT == true   
      self.wave_amp = 1
      self.wave_length = 1
      self.wave_speed = 3
    end     
  end
end


#==============================================================================
# ** Spriteset_Map
#------------------------------------------------------------------------------
#  This class brings together map screen sprites, tilemaps, etc. It's used
# within the Scene_Map class.
#==============================================================================

class Spriteset_Map
  #--------------------------------------------------------------------------
  # * Create Character Sprite
  #--------------------------------------------------------------------------
  alias tds_sprite_reflection_create_characters create_characters
  def create_characters
    tds_sprite_reflection_create_characters   
    @character_sprites = []
    @event_reflection_sprite = []
    @reflecting_events = []
    for i in $game_map.events.keys.sort
      sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
      @character_sprites.push(sprite)
    end
    for vehicle in $game_map.vehicles
      sprite = Sprite_Character.new(@viewport1, vehicle)
      @character_sprites.push(sprite)
    end
    @character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
    for i in $game_map.events.keys.sort   
    @event_name_offset = $game_map.events[i].name   
    @event_name_offset[ /\/OFFSET\[(.*?)\]/ ]
    sprite = Sprite_Reflect.new(@viewport1, $game_map.events[i], $1 != nil ? $1.to_i : 0)     
    if $game_map.events[i].name.include?("Reflect")   
      @event_reflection_sprite.push(sprite)     
      @reflecting_events.push($game_map.events[i])
      end
    end
    @reflection_sprite = Sprite_Reflect.new(@viewport1, $game_player, 0)           
  end
 
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  alias tds_sprite_reflection_update update 
  def update
    tds_sprite_reflection_update   
    if $game_player.current_area_name == "Reflect"
     if $game_player.moving? == false
       @reflection_sprite.visible = true         
     end
    else         
     @reflection_sprite.visible = false                 
    end
   
    for i in 0...@reflecting_events.size
     if @reflecting_events[i].current_area_name == "Reflect"
      if @reflecting_events[i].moving? == false
         @event_reflection_sprite[i].visible = true         
       end
     else
       @event_reflection_sprite[i].visible = false       
     end     
    end
 
    if @reflection_sprite.visible == true         
      @reflection_sprite.update
    end
   
    for i in 0...@event_reflection_sprite.size
      if @event_reflection_sprite[i].visible == true
        @event_reflection_sprite[i].update           
      end
    end
  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

  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor   :reflect_offset              # Character Reflection Offset 
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  alias tds_sprite_reflection_initialize initialize
  def initialize
    tds_sprite_reflection_initialize   
    @reflect_offset = 0
  end
 
  #--------------------------------------------------------------------------
  # * Determine if in Area
  #     area : Area data (RPG::Area)
  #--------------------------------------------------------------------------
  def in_area?(area)
    return false if area == nil
    return false if $game_map.map_id != area.map_id
    return false if @x < area.rect.x
    return false if @y < area.rect.y
    return false if @x >= area.rect.x + area.rect.width
    return false if @y >= area.rect.y + area.rect.height
    return true
  end 
  #--------------------------------------------------------------------------
  # * Current Area Name
  #--------------------------------------------------------------------------
  def current_area_name
    # Checks the areas in the maps
    for area in $data_areas.values
      # If the character is currently on an area
      if in_area?(area) == true
        # Give the value of the name of the area to the return variable
        return_area_name = area.name
        # Break loop
        break
      end   
    end   
    return return_area_name
  end
end

#==============================================================================
# ** Game_Event
#------------------------------------------------------------------------------
#  This class deals with events. It handles functions including event page
# switching via condition determinants, and running parallel process events.
# It's used within the Game_Map class.
#==============================================================================

class Game_Event < Game_Character
 
  #--------------------------------------------------------------------------
  # * Clear Starting Flag
  #--------------------------------------------------------------------------
  def name
    return @event.name
  end
end


Screen:

Użycie:
Opisane w nagłówku skryptu. Znajduje się tam też potężna konfiguracja.

filiotef - Pią 08 Lip, 2011 23:24

Extra skrypt ;-)
Aruka21 - Pią 15 Lip, 2011 12:05

Jestem nowy i mam pytanie, a mianowicie jak tworzyć te obszary na mapie ?
Jeśli jest to możliwe to proszę jeszcze dodatkowo krótkie demko.

Pozdrawiam Aruka21

Angius - Pią 15 Lip, 2011 14:57

PPM na mapie z listy po lewej i "stwórz obszar". A potem przeciągasz na mapce wyświetlonej w okienku tworząc prostokąty.
Aruka21 - Pon 18 Lip, 2011 08:40

Dzięki wielkie Angius,
Zeno3939 - Wto 30 Sie, 2011 14:43

Siemka . Mam pytanko co do skryptu . Dodałem go nad main , narysowałem na mapie zbiornik wodny i klikając prawym na nazwę mapy stworzyłem obszar nazwany Reflcet . Włączyłem grę , podchodzę do jeziorka a tu nic , żadnego odbicia . Wie ktoś dlaczego tak się dzieje ?
Angius - Wto 30 Sie, 2011 15:06

Powiem szczerze, że mnie też coś nie pyka :/
Zeno3939 - Wto 30 Sie, 2011 15:42

to jakim cudem zrobiłeś screena ? :mrgreen: skrypt jest mi trochę potrzebny bo zamierzam zrobić coś na styl gry gothic tyle że w 2D , i chciałem jak najbardziej urealnić świat gry ( w tym zmienić grafikę [ całkowicie ! { buhahahahahahahahahahaha :mrgreen: }]) .
Angius - Wto 30 Sie, 2011 15:44

Screen pochodził z oryginalnego tematu. Do tej pory myślałem, że o wina Twierdzówki, że mi nie działał, ale skoro nie działa też innym...
Zeno3939 - Wto 30 Sie, 2011 16:49

Gdyby komuś działał ten skrypt to proszę o pomoc . A teraz idę beczeć :-P ;-(
Ayene - Sro 31 Sie, 2011 10:46


Zeno3939 - Sro 31 Sie, 2011 11:30

a teraz pytanie : Jak ty to robisz że jesteś tak za@@bista ? :D wielkie dzięki :)
MrBoomGood - Sro 31 Sie, 2011 13:55

Zeno3939 napisał/a:
a teraz pytanie : Jak ty to robisz że jesteś tak za@@bista ? :D wielkie dzięki :)


A teraz pytanie: Jak ty to robisz, że tak bardzo się podlizujesz?

Zeno3939 - Sro 31 Sie, 2011 15:23

Wiesz talent :mrgreen: .
Ha wykombinowałem jak pogodzić odbicia lustrzane ze skryptem wyświetlania się nazw zdarzeń . To bardzo proste . Po prostu trzeba zmienić tą linijkę :
Cytat:
if $game_map.events[i].name.include?("Revlect")

na tą linijkę :
Cytat:
if $game_map.events[i].name.include?("[FS]")

Taki trik dla osób które chcą to połączyć :) Niestety raczej nie ma takiego rozwiazania dla oddalenia odbicia :(

bartek2940 - Pon 05 Wrz, 2011 22:39

Nie, żebym się czepiał ale mi skrypt działał od początku bez żadnych poprawek.
Ogółem jest super i git, ale przy skomplikowanych kształtach są problemy z wielką ilością obszarów. Ja na ten przykład miałem na jednej mapie z miastem (tak 40x40) 17 obszarów, w czym niekture po jednej/dwóch kratkach.

sled - Pią 30 Wrz, 2011 00:58

Ja mam pytanie - otóż wszystko działa jak należy lecz nie wiem co zrobić by uzyskać odbicie w innym "kafelku". Z tego co kombinowałem zauważyłem że można to zmienić w skrypcie lecz nie mam pojęcia jak ustawić by odbicie występowało np w pierwszym górnym kafelku A1. Co dziwniejsze - skrypt napisany w pierwszym poście działa (i to bez pomocy skryptu Ayene!) i odbija przykładowo ten pierwszy kafelek lecz ma błędy po przeteleportowaniu postaci (tworzy odbicia eventów oraz postaci na mapie które podążają za nami występując ciągle w równych odległościach mimo iż nie powinni się odbijać (brak w nazwie reflect)).
Byłbym naprawdę bardzo wdzięczny za jakąkolwiek pomoc ;-)


Powered by phpBB modified by Przemo © 2003 phpBB Group