Ogłoszenie 

Uwaga! To forum jest w trybie offline.
Wszelką pomoc uzyskasz pod adresem
forum.ultimateam.pl


Administracja Forum


Poprzedni temat «» Następny temat
[Jet] Fog of War
Autor Wiadomość
pro14ab 




Preferowany:
RPG Maker VX

Pomógł: 5 razy
Dołączył: 20 Maj 2011
Posty: 32
Wysłany: Sob 12 Lis, 2011 14:05
[Jet] Fog of War
Opis : Ogranicza widoczności .
Autor: Jet10985
Kompatybilność: VX
Instrukcja: Wklej skrypt nad Main

Screen
Spoiler:


Skrypt
Spoiler:

Kod:
#===============================================================================
# Fog Of War
# Przez Jet10985 (Jet)
#===============================================================================
# Skrypt ten stworzył Fog Of War efekt, co oznacza części mapy
# jako "widoczny", "zbadać" i "niezbadane". Szczegóły niżej.
# Skrypt ten posiada: 4 opcji dostosowywania.
#===============================================================================
# Overwritten Methods:
# None
#-------------------------------------------------------------------------------
# Aliased methods:
# Spriteset_Map: update, initialize, dispose
# Game_Temp: initialize
# Game_System: initialize
# Game_Character: transparent
#===============================================================================
=begin
Fog Of War Explanation:

With the Fog Of War, there are 3 parts of a map, "visible", "explored" and
"unexplored".
Visible parts you can see everything as one normally would.
Explored you see the generall area, like tiles and maybe events.
Unexplored is pure lack space, which nothing can be seen.

Areas are marked as "explored" as soon as it becomes "visible" by the player.
--------------------------------------------------------------------------------
Depending on the value of EVENT_TRANSPARENCY in the configuration below, this
comment will have a specific event do the opposite:

IGNORE FOW

So, if EVENT_TRANSPARENCY is true, then the event WILL NOT become invisible,
but if EVENT_TRANSPARENCY is false, then it WILL become invisible.
--------------------------------------------------------------------------------
To change the player's range of site, use this in an event "Script..." command:

change_fow_range(new_fow_range)

replace new_fow_range with a number, like 4.
=end

module JetFOW
 
  # This is how far the player's Fog Of War visible range is by default.
  PLAYER_DEFAULT_RANGE = 4
 
  # This is the switch id of the switch which when turned off, will turn off
  # the Fog Of War effect.
  FOG_OFF_SWITCH = 99
 
  # Should events outside the player's "visible" range become invisible?
  EVENT_TRANSPARENCY = true
 
  # Do you want to pre-cache map's fogs while the player is playing?
  PRE_CACHE_MAPS = true
 
end

#===============================================================================
# NIE edytuj dalej, chyba że wiesz, co robić
#===============================================================================
class Game_Temp
 
  attr_accessor :map_fog_sprites
 
  alias jet6754_initialize initialize unless $@
  def initialize(*args, &block)
    @map_fog_sprites = {}
    jet6754_initialize(*args, &block)
  end
end

class Game_System
 
  attr_accessor :exposed_tiles, :player_fow_range
 
  alias jet2834_initialize initialize unless $@
  def initialize(*args, &block)
    @exposed_tiles = {}
    @player_fow_range = JetFOW::PLAYER_DEFAULT_RANGE
    jet2834_initialize(*args, &block)
  end
end

class Game_Interpreter
 
  def change_fow_range(t)
    $game_system.player_fow_range = t
  end
end

class Spriteset_Map
 
  alias jet1245_initialize initialize unless $@
  def initialize(*args, &block)
    create_fog_of_war
    Thread.new {
      @pre_cached ||= false
      precache_fogs_of_war if JetFOW::PRE_CACHE_MAPS && !@pre_cached
    }
    jet1245_initialize(*args, &block)
  end
 
  alias jet8677_update update unless $@
  def update(*args, &block)
    update_fog_of_war
    jet8677_update(*args, &block)
  end
 
  alias jet8677_dispose dispose unless $@
  def dispose(*args, &block)
    dispose_fog_of_war
    jet8677_dispose(*args, &block)
  end
 
  def precache_fogs_of_war
    @pre_cached = true
    f = load_data("Data/MapInfos.rvdata")
    (f.keys - $game_temp.map_fog_sprites.keys).each {|a|
      $game_temp.map_fog_sprites[a] = {}
      map = load_data(sprintf("Data/Map%03d.rvdata", a))
      width, height = map.width, map.height
      viewport = Viewport.new(0, 0, width * 32, height * 32)
      width.times {|i|
        height.times {|i2|
          bit = Bitmap.new(32, 32)
          bit.fill_rect(bit.rect, Color.new(0, 0, 0))
          sprite = Sprite.new(viewport)
          sprite.bitmap = bit
          viewport.z = 9999
          sprite.visible = false
          $game_temp.map_fog_sprites[a][[i, i2]] = sprite
        }
      }
    }
    GC.start
  end
 
  def create_fog_of_war(*args, &block)
    if $game_temp.map_fog_sprites[$game_map.map_id].nil?
      @making_fow = true
      $game_temp.map_fog_sprites[$game_map.map_id] = {}
      width, height = $game_map.width, $game_map.height
      viewport = Viewport.new(0, 0, width * 32, height * 32)
      width.times {|i|
        height.times {|i2|
          bit = Bitmap.new(32, 32)
          bit.fill_rect(bit.rect, Color.new(0, 0, 0))
          sprite = Sprite.new(viewport)
          sprite.bitmap = bit
          viewport.z = 9999
          $game_temp.map_fog_sprites[$game_map.map_id][[i, i2]] = sprite
        }
      }
      @making_fow = false
    end
    if $game_system.exposed_tiles[$game_map.map_id].nil?
      $game_system.exposed_tiles[$game_map.map_id] = []
    end
    $game_system.exposed_tiles[$game_map.map_id].each {|a|
      $game_temp.map_fog_sprites[$game_map.map_id][a].opacity = 128
    }
  end
 
  def update_fog_of_war(*args, &block)
    @did_first_move ||= false
    @did_fow_first ||= false
    @fow_invis ||= false
    if $game_switches[JetFOW::FOG_OFF_SWITCH] && !@fow_invis
      $game_temp.map_fog_sprites[$game_map.map_id].each {|a, b|
        b.visible = false unless !b.visible
        @fow_invis = true
      }
      return
    else
      @fow_invis = false
    end
    if (!$game_player.stopping? && !@did_first_move) || !@did_fow_first
      @did_first_move = true
      @did_fow_first = true unless @did_fow_first || @making_fow
      $game_temp.map_fog_sprites[$game_map.map_id].each {|a, b|
        b.visible = true unless b.visible
        b.x = a[0] * 32 - ($game_map.display_x + 255) / 256 * 32
        b.y = a[1] * 32 - ($game_map.display_y + 255) / 256 * 32
        x = ($game_player.x - a[0]).abs
        y = ($game_player.y - a[1]).abs
        dist = x + y
        if dist <= $game_system.player_fow_range
          b.opacity = 0 unless b.opacity == 0
          if !$game_system.exposed_tiles[$game_map.map_id].include?(a)
            $game_system.exposed_tiles[$game_map.map_id].push(a)
          end
        elsif $game_system.exposed_tiles[$game_map.map_id].include?(a)
          b.opacity = 128 unless b.opacity == 128
        else
          b.opacity = 255 unless b.opacity == 255
        end
      }
    end
    if $game_player.stopping? && @did_first_move
      @did_first_move = false
    end
  end
 
  def dispose_fog_of_war(*args, &block)
    $game_temp.map_fog_sprites[$game_map.map_id].each {|a, b|
      b.visible = false unless !b.visible
    }
  end
end

class Game_Character
 
  alias jet4567_transparent transparent unless $@
  def transparent(*args, &block)
    if !$game_switches[JetFOW::FOG_OFF_SWITCH] && !within_range_fow?
      if JetFOW::EVENT_TRANSPARENCY
        return true unless self.is_a?(Game_Event) && ignore_fow_comment?
      end
    end
    return jet4567_transparent(*args, &block)
  end
 
  def within_range_fow?(*args, &block)
    a, b = $game_player, self
    return true if b == a
    if ((b.x - a.x).abs + (b.y - a.y).abs) <= $game_system.player_fow_range
      return true
    end
    return false
  end
end

class Game_Event
 
  def ignore_fow_comment?(*args, &block)
    return false if @list.nil? or @list.size <= 0
    for item in @list
      if item.code == 108 or item.code == 408
        if item.parameters[0].match(/IGNORE[ ]*FOW/i)
          return true
        end
      end
    end
    return false
  end
end


Demo:Raczej nie trzeba .
________________________
Chcesz wygrać grę wejdzie i zarejestruj się na start dostaniesz 5p.

Kliknij Pajacyka
 
 
Tjef 




Preferowany:
RPG Maker VX

Pomógł: 12 razy
Dołączył: 21 Wrz 2010
Posty: 163
Skąd: Wolsztyn
Wysłany: Sob 12 Lis, 2011 15:42
Tego mi brakowało :-) Coś jak w Divine Divinity 1. :-P
Wielkie dzięki :mrgreen:

EDIT:
Już mam błąd z linijką 18 :(
Kod:
 =begin

Sprawdze, może to wina innego skryptu?
________________________
SAGA TS ( ThiefStory )
Rozdział I: Same Game http://www.ultimateam.pl/viewtopic.php?t=4978
Rozdział II: Terror http://www.ultimateam.pl/...p?p=64366#64366
Pozostałe rozdziały mogą nawet nie wyjść :P
Lista elity: http://i.imgur.com/Li9fU.jpg
 
 
Michu_1999 




Preferowany:
RPG Maker VX

Dołączył: 02 Paź 2010
Posty: 43
Wysłany: Sob 12 Lis, 2011 16:23
Tjef chyba wina innego skryptu, bo u mnie chodzi.Szkoda, że całe nie jest przetłumaczone.
 
 
tracersgta 




Preferowany:
RPG Maker VX

Pomógł: 45 razy
Dołączył: 10 Sty 2011
Posty: 612
Skąd: mam wiedzieć?
Wysłany: Sob 12 Lis, 2011 16:29
Usuń wszystkie spacje przed =begin
________________________
I'm a tiger! I roar. I hunt, I climb, I eat, I wash, I sleep!

Gość, jeżeli pomogłem daj "Pomógł" ;-)
 
 
 
Tjef 




Preferowany:
RPG Maker VX

Pomógł: 12 razy
Dołączył: 21 Wrz 2010
Posty: 163
Skąd: Wolsztyn
Wysłany: Sob 12 Lis, 2011 18:04
@trejser, tak zrobiłem, ale teraz wszystko mam na zielono :-(
Znowu takie proste problemy z mojej strony :/
________________________
SAGA TS ( ThiefStory )
Rozdział I: Same Game http://www.ultimateam.pl/viewtopic.php?t=4978
Rozdział II: Terror http://www.ultimateam.pl/...p?p=64366#64366
Pozostałe rozdziały mogą nawet nie wyjść :P
Lista elity: http://i.imgur.com/Li9fU.jpg
 
 
tracersgta 




Preferowany:
RPG Maker VX

Pomógł: 45 razy
Dołączył: 10 Sty 2011
Posty: 612
Skąd: mam wiedzieć?
Wysłany: Nie 13 Lis, 2011 07:42
Wiem, tak ma być! Teraz poszukaj
Kod:
=end
i przed tym też usuń spacje...

Po tym zabiegu wszystko będzie normalne, i błędu nie powinno wywalać...
________________________
I'm a tiger! I roar. I hunt, I climb, I eat, I wash, I sleep!

Gość, jeżeli pomogłem daj "Pomógł" ;-)
 
 
 
Tjef 




Preferowany:
RPG Maker VX

Pomógł: 12 razy
Dołączył: 21 Wrz 2010
Posty: 163
Skąd: Wolsztyn
Wysłany: Nie 13 Lis, 2011 10:22
Działa! Dzięki, trejser :-)
________________________
SAGA TS ( ThiefStory )
Rozdział I: Same Game http://www.ultimateam.pl/viewtopic.php?t=4978
Rozdział II: Terror http://www.ultimateam.pl/...p?p=64366#64366
Pozostałe rozdziały mogą nawet nie wyjść :P
Lista elity: http://i.imgur.com/Li9fU.jpg
 
 
tracersgta 




Preferowany:
RPG Maker VX

Pomógł: 45 razy
Dołączył: 10 Sty 2011
Posty: 612
Skąd: mam wiedzieć?
Wysłany: Nie 13 Lis, 2011 10:46
"Trejser" zawsze pomoże ;-)
________________________
I'm a tiger! I roar. I hunt, I climb, I eat, I wash, I sleep!

Gość, jeżeli pomogłem daj "Pomógł" ;-)
 
 
 
Yashimo 




Preferowany:
RPG Maker VX

Dołączył: 02 Lis 2011
Posty: 1
Wysłany: Nie 13 Lis, 2011 12:13
Fajny skrypt, a dałoby się zrobić tak żeby mgła wojny była tylko w poszczególnych pomieszczeniach? I żeby wiadomość była wyświetlana nad nią? a nie jak dotychczas jest zasłaniana.
 
 
MrBoomGood 




Preferowany:
RPG Maker VX

Pomógł: 3 razy
Dołączył: 07 Kwi 2011
Posty: 292
Skąd: Katowice
Wysłany: Nie 13 Lis, 2011 12:46
Jest! W końcu ktoś to znalazł, tego szukałem :) Wielkie, wielkie dzięki!!!!
 
 
 
PaayJer 




Preferowany:
RPG Maker VX

Pomógł: 1 raz
Dołączył: 08 Paź 2011
Posty: 86
Wysłany: Nie 13 Lis, 2011 13:30
@Yashimo
Kod:
# This is the switch id of the switch which when turned off, will turn off
  # the Fog Of War effect.
  FOG_OFF_SWITCH = 99

Po przetłumaczeniu przycisk, który wybierzesz (przykładowo tu 99) będzie wyłączał efekt
tej mgły. Wystarczy po wejściu na mapkę np. jaskinię zdarzenie z tym przełącznikiem na ON
a po wyjściu np. las na off :)
________________________
Tutki od PJ!!!
[Kurs 1] Kliknij tutaj!
[Kurs 2] Kliknij tutaj!
[Kurs 3] Kliknij tutaj!
[Kurs 4] Kliknij tutaj!
 
 
Finwe 




Preferowany:
RPG Maker VXAce

Pomógł: 34 razy
Dołączył: 30 Lip 2011
Posty: 322
Skąd: Rzeszów
Wysłany: Pią 18 Lis, 2011 18:26
Użyłbym, ale są zbyt duże lagi, i wywala grę po chwili. Szkoda, bo fajny, do RTS-ówek by się przydał.
 
 
 
tracersgta 




Preferowany:
RPG Maker VX

Pomógł: 45 razy
Dołączył: 10 Sty 2011
Posty: 612
Skąd: mam wiedzieć?
Wysłany: Pią 18 Lis, 2011 19:17
Użyj anty-laga... Jeżeli masz ABS-a to się nie dziw...
________________________
I'm a tiger! I roar. I hunt, I climb, I eat, I wash, I sleep!

Gość, jeżeli pomogłem daj "Pomógł" ;-)
 
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group | Template Klam by Ayene