UltimaForum

Skrypty [XP] - View Range

Yoroiookami - Nie 06 Cze, 2010 09:25
Temat postu: View Range
Postanowiłem umieścić ten skrypt, żeby nie trzeba było się męczyć z szukaniem tego przez dwie godziny, tak jak ja musiałem.

Skrypt stworzony przez Near Fantastica; pozwala zdarzeniom, na wyśledzenie gracza i pogoń, lub zaatakowanie go.

Tutaj oryginał
Spoiler:

Kod:
#==============================================================================
#   Veiw Range Script
#------------------------------------------------------------------------------
#    By: Near Fantastica
#    Date: 25/11/04
#==============================================================================

class View_Range
#--------------------------------------------------------------------------
# ● Range system works by sereching the area of a circle for the Player's xy
#    The Veiw is set in each event and is the radius of the circle
#    The Eaquation used is (Px-EX)^2 + (Py-Ey)^2 = radius^2
#    If the Radius is less than or equal to the View the Player is inside the circle
#--------------------------------------------------------------------------
  attr_accessor :event_num
  attr_accessor :view_range
  #--------------------------------------------------------------------------
  # ● Initialization
  #--------------------------------------------------------------------------
  def initialize(event_num,veiw_range,els)
    @event_num = event_num
    @event_locial_switch = els
    @view_range = veiw_range
    @playerx = $game_player.x
    @playery = $game_player.y
    @eventx = $game_map.events[@event_num].x
    @eventy = $game_map.events[@event_num].y
    @event_direction = $game_map.events[@event_num].direction
  end
  #--------------------------------------------------------------------------
  # ● check = View_Range.new(EventID, Veiw Range, Local Switch)
  #    check.enemies_view
  #--------------------------------------------------------------------------
  def event_view
    @playerx-=@eventx
    @playerx*=@playerx
    @playery-=@eventy
    @playery*=@playery
    @playerx+=@playery
    @view_range*=@view_range
    if @playerx <= @view_range
      key=[$game_map.map_id, @event_num, @event_locial_switch]
      $game_self_switches[key] = true
    end
  end
  #--------------------------------------------------------------------------
  # &#9679; check = View_Range.new(EventID, Veiw Range, Local Switch)
  #    check.enemies_view
  #--------------------------------------------------------------------------
  def enemies_view   
    if @event_direction == 2
      if @playery >= @eventy
        @playerx-=@eventx
        @playerx*=@playerx
        @playery-=@eventy
        @playery*=@playery
        @playerx+=@playery
        @view_range*=@view_range
        if @playerx <= @view_range
          key=[$game_map.map_id, @event_num, @event_locial_switch]
          $game_self_switches[key] = true
          $game_system.timer = 420
          $game_system.timer_working = true
          $game_map.need_refresh = true
        end
      end
    end
    if @event_direction == 4
      if @playerx <= @eventx
        @playerx-=@eventx
        @playerx*=@playerx
        @playery-=@eventy
        @playery*=@playery
        @playerx+=@playery
        @view_range*=@view_range
        if @playerx <= @view_range
          key=[$game_map.map_id, @event_num, @event_locial_switch]
          $game_self_switches[key] = true
          $game_system.timer = 420
          $game_system.timer_working = true
          $game_map.need_refresh = true
        end
      end
    end
    if @event_direction == 6
      if @playerx >= @eventx
        @playerx-=@eventx
        @playerx*=@playerx
        @playery-=@eventy
        @playery*=@playery
        @playerx+=@playery
        @view_range*=@view_range
        if @playerx <= @view_range
          key=[$game_map.map_id, @event_num, @event_locial_switch]
          $game_self_switches[key] = true
          $game_system.timer = 420
          $game_system.timer_working = true
          $game_map.need_refresh = true
        end
      end
    end
    if @event_direction == 8
      if @playery <= @eventy
        @playerx-=@eventx
        @playerx*=@playerx
        @playery-=@eventy
        @playery*=@playery
        @playerx+=@playery
        @view_range*=@view_range
        if @playerx <= @view_range
          key=[$game_map.map_id, @event_num, @event_locial_switch]
          $game_self_switches[key] = true
          $game_system.timer = 420
          $game_system.timer_working = true
          $game_map.need_refresh = true
        end
      end
    end
  end
end



Tutaj przetłumaczona wersja [Raczej niewiele zmienia]
Spoiler:

Kod:
#==============================================================================
#   Skrypt Widzenia na Odległość
#------------------------------------------------------------------------------
#    Stworzona przez: Near Fantastica
#    Data: 25/11/04
#==============================================================================

class View_Range
#--------------------------------------------------------------------------
# &#9679; Ranga systemowa działa przez przeszukanie kolistego terenu dla xy Gracza.
#    "Widok" jest w każdym zdarzeniu i ma zasięg koła.
#    Użyte równianie to (Px-EX)^2 + (Py-Ey)^2 = zasięg^2
#   Jeżeli zasięg jest mniejszy, lub równy widokowi, gracz jest w środku koła.
#--------------------------------------------------------------------------
  attr_accessor :event_num
  attr_accessor :view_range
  #--------------------------------------------------------------------------
  # &#9679; Initialization
  #--------------------------------------------------------------------------
  def initialize(event_num,veiw_range,els)
    @event_num = event_num
    @event_locial_switch = els
    @view_range = veiw_range
    @playerx = $game_player.x
    @playery = $game_player.y
    @eventx = $game_map.events[@event_num].x
    @eventy = $game_map.events[@event_num].y
    @event_direction = $game_map.events[@event_num].direction
  end
  #--------------------------------------------------------------------------
  # &#9679; check = View_Range.new(EventID, Veiw Range, Local Switch)
  #    check.enemies_view
  #--------------------------------------------------------------------------
  def event_view
    @playerx-=@eventx
    @playerx*=@playerx
    @playery-=@eventy
    @playery*=@playery
    @playerx+=@playery
    @view_range*=@view_range
    if @playerx <= @view_range
      key=[$game_map.map_id, @event_num, @event_locial_switch]
      $game_self_switches[key] = true
    end
  end
  #--------------------------------------------------------------------------
  # &#9679; check = View_Range.new(EventID, Veiw Range, Local Switch)
  #    check.enemies_view
  #--------------------------------------------------------------------------
  def enemies_view   
    if @event_direction == 2
      if @playery >= @eventy
        @playerx-=@eventx
        @playerx*=@playerx
        @playery-=@eventy
        @playery*=@playery
        @playerx+=@playery
        @view_range*=@view_range
        if @playerx <= @view_range
          key=[$game_map.map_id, @event_num, @event_locial_switch]
          $game_self_switches[key] = true
          $game_system.timer = 420
          $game_system.timer_working = true
          $game_map.need_refresh = true
        end
      end
    end
    if @event_direction == 4
      if @playerx <= @eventx
        @playerx-=@eventx
        @playerx*=@playerx
        @playery-=@eventy
        @playery*=@playery
        @playerx+=@playery
        @view_range*=@view_range
        if @playerx <= @view_range
          key=[$game_map.map_id, @event_num, @event_locial_switch]
          $game_self_switches[key] = true
          $game_system.timer = 420
          $game_system.timer_working = true
          $game_map.need_refresh = true
        end
      end
    end
    if @event_direction == 6
      if @playerx >= @eventx
        @playerx-=@eventx
        @playerx*=@playerx
        @playery-=@eventy
        @playery*=@playery
        @playerx+=@playery
        @view_range*=@view_range
        if @playerx <= @view_range
          key=[$game_map.map_id, @event_num, @event_locial_switch]
          $game_self_switches[key] = true
          $game_system.timer = 420
          $game_system.timer_working = true
          $game_map.need_refresh = true
        end
      end
    end
    if @event_direction == 8
      if @playery <= @eventy
        @playerx-=@eventx
        @playerx*=@playerx
        @playery-=@eventy
        @playery*=@playery
        @playerx+=@playery
        @view_range*=@view_range
        if @playerx <= @view_range
          key=[$game_map.map_id, @event_num, @event_locial_switch]
          $game_self_switches[key] = true
          $game_system.timer = 420
          $game_system.timer_working = true
          $game_map.need_refresh = true
        end
      end
    end
  end
end


Nie tłumaczyłem części, które wydawały się podejrzane, nie chciałem zniszczyć skryptu.

Do zdarzenia które ma mieć "Widzenia na odległość" musimy dać Wywołaj Skrypt(Script Check) i wpisać:
Spoiler:

check = View_Range.new(1,3,"A")
check.enemies_view



(1,3,"A") - nie korzystałem jeszcze ze skryptu, ale liczby 1,3 to najprawdopodobniej zasięg widzenia, a co do "A", to nie jestem pewien.

*EDIT:
(1,3,"A") gdzie 1 to ID stwora na mapie który ma mieć View Range.
3 to zasięg widzenia, a A to przełącznik na który zdarzenie ma być odpalane na drugiej stronie.(Np. z wiadomością "Widziałem cię")


SCREENY:
Spoiler:




Izaya - Nie 06 Cze, 2010 16:38

Podoba mi się. Może wystąpi w mojej grze ;-)
Yoroiookami - Pon 21 Cze, 2010 08:28

EDIT:
(1,3,"A") gdzie 1 to ID stwora na mapie który ma mieć View Range.
3 to zasięg widzenia, a A to przełącznik na który zdarzenie ma być odpalane na drugiej stronie.(Np. z wiadomością "Widziałem cię")

Izaya - Nie 11 Lip, 2010 10:59

Coś podobnego jest w Metin2 :mrgreen:
czyli przyda się np. gdy potwór jest agresywny, przykład "Agresywny wilk".
Na prawdę bardzo fajny skrypt :-)

R.I.P. - Wto 13 Lip, 2010 18:59

Skrypcik niezły :mrgreen: , tylko mam trudności z opanowaniem go :-? , ponieważ nie rozumiem pare rzeczy jak to zazwyczaj widze to zawsze mi parzy tą mądrością :-) , dobra może później go Opanuje, Thx for you.






Pozdr. R.I.P. :papa:

smakowy155 - Sob 06 Lis, 2010 14:57

Mam pytanko. Gdy kopiuje ognisko z dema(http://www.ultimateam.pl/viewtopic.php?t=2795) to gdy wchodzę w pole widzenia to strasznie się tnie i dźwięk ogniska też się tnie. Co to może być?
Yoroiookami - Sob 06 Lis, 2010 15:28

Najlepiej wyślij mi projekt :I będzie najszybciej, bo nie będzie trzeba zgadywać.
Przesłać możesz mi na PW.
-----------------------------------
EDIT - sprawdziłem i obawiam się, że nie da się nic poradzić. Nieco źle ustawiłeś te zdarzenia, ale nie w tym rzecz. Nie wiem czemu, ale RPG Maker(lub skrypt) jakoś nie toleruje dwóch BGS na jednej mapie, nawet jeśli są takie same o_o'
Myślę że to robota dla kogoś lepszego w te klocki :I no i nie mam pewności czy i ktoś na to coś poradzi.

Proponuję po prostu użyć jednego ogniska, pozostałe mogą być zgaszone xD

smakowy155 - Czw 11 Lis, 2010 21:17

Dobrze wszystko było, ale teraz gdy robię zdarzenie z tym skryptem to wyskakuje mi taki błąd:
????? 'View_Range' ? 26 ??? NoMethodError ????????
undefined method 'x' for nil:NilClass

HESEE - Pią 17 Gru, 2010 13:57

Mi wywala błąd:

Script 'Wywoływanie zdarzeń' line 26: NoMethodError occurred.

undefined method `x' for nil:NilClass

Yoroiookami - Pią 17 Gru, 2010 16:03

Mi wszystko działa, a sprawdziłem też swoją przetłumaczoną wersję >_> nie używacie przypadkiem polskiej wersji programu? A jeżeli nie, to może ten skrypt kłóci się z jakimś innym który macie :I
CreeperCrisis - Pon 09 Maj, 2011 21:04

Po pierwsze przepraszam że piszę teraz bo dawno w tym temacie nie odpisywano choć skrypt bardzo był mi potrzebny, po drugie jest również kompatybilny z VX. :D Powiem że skrypt już opanowałem, mam nadzieję że inni nie mają z tym problemu. xD Działa na każdym (chyba) systemie poruszania się, u mnie na przykład działa na platformówce. Skrypcik przydatny i bardzo prosty w użytku. :)
Dr.man - Nie 16 Gru, 2012 15:57

Mam mały jeden problem.
Jak zrobić by po zauważeniu gracza, potwór przestał gonić jeśli bohater oddali się, np: 0 sześć kratek?

A i jeszcze jedno, jak wyłączyć ten liczony czas w prawym górnym rogu?
Nie ogarniam skryptu. ;p


Powered by phpBB modified by Przemo © 2003 phpBB Group