Плохо! Плохо!:  0
Страница 2 из 2 ПерваяПервая 12
Показано с 11 по 16 из 16

Тема: Зрение ивента по прямой

  1. #11
    Хранитель Аватар для Paranoid
    Информация о пользователе
    Регистрация
    22.12.2014
    Сообщений
    2,776
    Записей в дневнике
    34
    Репутация: 28 Добавить или отнять репутацию

    По умолчанию

    Небольшой анонсик. Я решил чутка переделать смотрелку используя террайн теги и, возможно, регионы (чтобы любители параллакса могли использовать его). Пока не скажу когда все будет готово, но точно будет!
    Лицензионный VX Ace. Спасибо Петр.
    2 года мукеризма в пустую.

  2. #12

    По умолчанию

    Жаль, а то не помешал бы такой скрипт.

  3. #13

    По умолчанию

    Здравствуйте, скрипт выдаёт ошибку, если вы ещё тут сидите, можете помочь пожалуйста?
    Изображения Изображения

  4. #14

    По умолчанию

    вот ошибка, кстати. вылетает просто потому что. метод не нравится, ругается на строку 121

    error.png

    sx = $game_map.modw($game_player.x)*stx
    sy = $game_map.modh($game_player.y)*sty

    именно modw и modh
    Последний раз редактировалось Sleeping Visitor; 21.08.2025 в 17:29. Причина: никак не могу добавить изображение

  5. #15

    По умолчанию

    Цитата Сообщение от Lower Посмотреть сообщение
    Не работает, выдаёт ошибку
    нейросеть и я, немного допилили скрипт, он не идеален, но ошибку похоже не выдаёт и работает. (хотя как по мне его ещё стоит дорабатывать)
    возможно он кому-нибудь пригодится, держите:

    Спойлер Скрипт:

    Код:
    =begin
    -- Зрение противника
    -- Автор: ну наверное Paranoid. Хотя по сути это просто куча копипаста
    -- Доделано: Железный Ворон (персонаж нейросети GIGA CHAT) и чуть-чуть руками
                 Sleeping Visitor (обновлено до версии 1.1)
    -- Версия: 1.1
    -- Лицензия: Свободная для коммерческих и некоммерческих проектов.
                 Только в титрах укажите автора скрипта - Paranoid.
    
    Этот скрипт позволяет ивентам видеть игрока по прямой. Даже если вы используете
    пиксельное движение. Его можно настроить в блоке "Смотрит" заменив число
    0.75 или 4.75 на любое другое (0.75 было установлено изначально для обычных
    тайлов).
    на нужное вам или вообще убрав его. Числа 12 и 16 позволяют ивенту смотреть
    на расстояние всего экрана 12 клеток по Y и 16 по X. Если хотите уменьшить поле
    зрения до определенной длины, то просто измените эти числа.
    
    Ивент так же не может видеть игрока, если он за непроходимыми тайлами.
    
    Так же игрок может прятаться в коробку аля Солид Снейк. За это отвечает свитч
    SW_IN_BOX, у меня он 3, можете поменять. Как работает: если вы в коробке (свитч)
    включен, то ивент не будет обращать на вас внимание, пока вы не двигаетесь.
    
    Чтобы просто проверить видимость используйте event_see?(event_id), дает true
    если игрока видно.
    
    P.S.: скрипт полукопипаста зрения от DeadElf79 с изменением принципа зрения
    =end
    ###########################################################################
    ################################# Настройки ###############################
    ###########################################################################
    
    module EnemyEvent
      EVENT_NAME = /see/i   # Здесь "see" это имя зрячего ивента (/see/имя ивента).
      SSW_IF_SEE  = 'C'     # Свитч, который сработает в случае если героя увидят.
      SW_IN_BOX = 3         # Свитч, который позволяет вам быть невидимым
                            # если вы не двигаетесь.
      EVENT_MEMORY_T = 1800 # Сколько кадров враг будет помнить, что видел игрока.  
    end
    
    ###########################################################################
    ############################# Конец настроек ##############################
    ###########################################################################
    
    def event_see?(event_id)
      $game_map.events[event_id].can_see?($game_player.x,$game_player.y)
    end
    
    class Game_Event
      def enemy?
        self.name =~ EnemyEvent::EVENT_NAME
      end
      def can_see?(px,py)
        # Смотрит
        case @direction
        when 8
          return true if py.between?(self.y-12, self.y) && px.between?(self.x-4.75, self.x+4.75) and for fy in (py.to_i..self.y)
            return false if $game_map.passable?(self.x, fy, 8)!=true or $game_map.passable?(self.x, fy, 2)!=true
          end
        when 4
          return true if px.between?(self.x-16, self.x) && py.between?(self.y-4.75, self.y+4.75) and for fx in px.to_i..self.x
            return false if $game_map.passable?(fx, self.y, 4)!=true or $game_map.passable?(fx, self.y, 6)!=true
          end
        when 6
          return true if px.between?(self.x, self.x+16) && py.between?(self.y-4.75, self.y+4.75) and for fx in self.x.to_i..px
            return false if $game_map.passable?(fx, self.y, 4)!=true or $game_map.passable?(fx, self.y, 6)!=true
          end
        when 2
          return true if py.between?(self.y, self.y+12) && px.between?(self.x-4.75, self.x+4.75) and for fy in self.y.to_i..py
            return false if $game_map.passable?(self.x, fy, 8)!=true or $game_map.passable?(self.x, fy, 2)!=true
          end
        end
        false
      end
    end
    
    class Game_Map
      attr_accessor :enemies
    
      alias enemy_event_setup setup
      def setup(map_id)
        enemy_event_setup(map_id)
        setup_enemies
      end
    
      def setup_enemies
        @enemies = []
        @events.each_value do |event|
          @enemies.push event if event.enemy?
        end
      end
    end
    
    class Scene_Map < Scene_Base
      alias enemy_event_update update
      def update
        enemy_event_update
        update_enemies
      end
    
    def update_enemies
        $game_map.enemies.each do |enemy|
          next unless enemy_on_screen?(enemy)
          x, y = $game_player.x, $game_player.y
          # вот бы сделать, чтобы ивент отключался не сразу, но я не умею :D
          see_now = false
          if enemy.can_see?(x,y)
            if $game_switches[ EnemyEvent::SW_IN_BOX ]
              # player is in box
              if $game_player.moving?
                see_now = true
              end
            else
              # player is not in box
              see_now = true
            end
          end
          if see_now
            $game_map.events[enemy.id].balloon_id = 1 # это баллон, можно убрать
          end
          # Реакция на игрока
          key = [$game_map.map_id, enemy.id, EnemyEvent::SSW_IF_SEE]
          $game_self_switches[key] = see_now
          enemy.refresh
        end
      end
    
      def enemy_on_screen?(event)
        stx = $game_map.screen_tile_x
        sty = $game_map.screen_tile_y
        # Ширина и высота экрана в клетках
        width_in_tiles = stx
        height_in_tiles = sty
        # Границы поля зрения
        left_bound = $game_player.x - width_in_tiles / 2
        top_bound = $game_player.y - height_in_tiles / 2
        right_bound = left_bound + width_in_tiles
        bottom_bound = top_bound + height_in_tiles
        # Проверка попадания ивента в поле зрения
        if event.x.between?(left_bound, right_bound) && event.y.between?(top_bound, bottom_bound)
          return true
        end
        false
      end
    end

  6. #16

    По умолчанию

    Есть мысль об улучшении скрипта, но к сожалению я не знаю как это сделать. Пробовал подружить этот скрипт и скрипт Moghunter - Event Sensor Range (v1.0).
    Спойлер MOG - Event Sensor Range (v1.0):
    Код:
    #==============================================================================
    # +++ MOG - Event Sensor Range (v1.0) +++
    #==============================================================================
    # By Moghunter
    # https://atelierrgss.wordpress.com/
    #==============================================================================
    # Permite que o evento tenha dois comportamentos, de curta distância e de 
    # longa distância.
    #===============================================================================
    # - Utilização
    # Crie uma página com a condição de ativação Self Switch D, está página será 
    # usada quando o player estiver perto do evento.
    # Defina a area do sensor do evento colocando este nome no evento.
    #
    # <SensorX>
    #
    # X = Area do Sensor
    #
    #===============================================================================
    module MOG_EVENT_SENSOR
      #Definição da letra da Self Switch que ativará a página de curta distância.
      SENSOR_SELF_SWITCH = "C"
    end
     
    #===============================================================================
    # ■ GAME EVENT
    #===============================================================================
    class Game_Event < Game_Character
      
      attr_reader   :sensor_range
      
      #--------------------------------------------------------------------------
      # ● Initialize
      #--------------------------------------------------------------------------            
      alias mog_event_sensor_initialize initialize
      def initialize(map_id, event)
          mog_event_sensor_initialize(map_id, event)
          setup_event_sensor
      end
      
      #--------------------------------------------------------------------------
      # ● Setup Event Sensor
      #--------------------------------------------------------------------------          
      def setup_event_sensor
          @sensor_range =  @event.name =~ /<Sensor(\d+)>/ ? $1.to_i : 0
      end  
      
      #--------------------------------------------------------------------------
      # ● Update
      #--------------------------------------------------------------------------            
      alias mog_event_sensor_update update 
      def update
          mog_event_sensor_update
          update_event_sensor 
      end  
      
      #--------------------------------------------------------------------------
      # ● Update Sensor
      #--------------------------------------------------------------------------        
      def update_event_sensor 
          return if @sensor_range == 0
          distance = ($game_player.x - self.x).abs + ($game_player.y - self.y).abs
          enable   = (distance <= @sensor_range)
          key = [$game_map.map_id, self.id, MOG_EVENT_SENSOR::SENSOR_SELF_SWITCH]
          last_enable = $game_self_switches[key]
          execute_sensor_effect(enable,key) if enable != last_enable
        end
     
      #--------------------------------------------------------------------------
      # ● Execute_Sensor Effect
      #--------------------------------------------------------------------------            
      def execute_sensor_effect(enable,key)
          @pattern = 0 ; @pattern_count = 0
          $game_self_switches[key] = enable ;  self.refresh
      end
        
    end
     
    $mog_rgss3_event_sensor = true


    Вроде как лицензия от MOG позволяет редактировать скрипт, только нужно указывать какие изменения внесли в подзаголовок, не удалять авторство MOG и не менять название скрипта. Лицензия позволяет использовать скрипт для коммерческих и бесплатных целей, только автора скрипта нужно указывать в игре (титры и т.п.).

    Я сперва хотел не редактировать его скрипт и использовать два скрипта сразу, потому что они не конфликтовали выдавая ошибки с вылетами.
    Однако оба скрипта, ссылаясь на один локальный переключатель, как и подозревал, стали "колбасить" ивент) он стал ходить диагоналями и постепенно пытаться сблизиться с игроком. Выглядит очень забавно и тупо) Мне пришлось поменять локальный переключатель скрипта MOG на "B", оставив "C" для Event See скрипта с этой темы, но я попробовал запускать локальный переключатель "C" через действия в переключателе "B", ради теста. Конечно это привело к тому что ивент снова "колбасило". Копировать функции с переключателя "C" (Event See) на переключатель "B" (MOG) это очень неразумно, поскольку при больших действиях придётся всё каждый раз копировать, да и вообще в целом ссылаться на другой переключатель неразумно, поскольку мы теряем нужный слот локального переключателя.

    Пробовал покопаться в обоих скриптах и ставить условия из игровых переключателей (не локальных), но увы, это ни к чему не привело, т.к. Event See постоянно выполняет update, из-за чего переключатель "дрыгается", не давая нормально заработать скрипту MOG, от чего ивент смешно поднимает ногу, в попытке заагриться на игрока, но не двигается в его сторону, потому что update из Event See постоянно его глушит, обновляя переключатель, не давая перейти к действиям))

    В процессе возни я пришёл к интересной задумке. Что, если объединить возможности Event See со скриптом от MOG? Вот как можно было бы реализовать функционал:
    Спойлер Идея:

    игрок зажимает клавишу "Q" или любую другую из доступных мейкерских (можно заменить на свои клавиши, например взяв клавиши из модуля скрипта на полную раскладку, и ссылаясь на кнопки из модуля - это не проблема, так что можно пользователю для примера просто оставить встроенную в мейкер клавишу Q, а дальше он поменяет на свою если что), от нажатия Q включается переключатель, который просто запускает общее событие, в котором настроена череда действий. Переключатель отвечает за включение режима "скрытность". В общем событии мы искусственно понижаем (или вообще не трогаем, как угодно) скорость перемещения игрока в действиях, запрещаем спринт (можем проводить всякие проверки на всё это, как душе угодно, если вдруг захочется больше рпгшности с добавлением перков и т.д.) - получается такая имитация подкрадывания. Цель не видя игрока своими глазами, проверяет радиус вокруг себя "на слух" (по мимо радиуса можно в скрипте попробовать указать и проверку уровня через число в имени ивента, чем выше число, тем лучше слышит), а игроку можно дать пассивные способности, обозначающие его умения скрытности. Создаём несколько таких способностей, каждая будет отвечать за уровень перка скрытности и на ивентах мы просто удаляем одну способность и заменяем на другую при повышении/понижении уровня умения.
    В скрипте указываем каким числам из переменной слуха удовлетворяют какие способности - пример:
    # x => [y]
    {
    1 => [1, 2, 3, 4, 5],
    2 => [2, 3, 4, 5],
    3 => [3, 4, 5],
    4 => [4, 5],
    5 => [5]
    }
    Где в "X" указываем уровень слуха в имени ивента, а где "Y" указываем id способностей, которые должны быть, чтобы слух ивента не сработал. Если у игрока нет такой способности то делаем ему шанс, что когда он подкрадывается, 30% шанс при каждом update, что игрок себя обнаружит, даже если стоит на месте (обновление же идёт покадрово, верно?) Так что игрок получается всякий раз будет рисковать, если уровень его умения красться не дотягивает до уровня слуха моба. Будет круто если проверка будет затрагивать всех членов партии, и если хоть один не соответствует умению красться - он подводит всю группу.
    Но всё это касается слуха по радиусу. А что же до зрения? Зрение мы можем оставить как есть, и оно срабатывает независимо от слуха и умения скрытности игрока, просто когда моб видит игрока, сразу же и идёт на него без всяких проверок, но при этом, чего скрипту зрения не хватает - чтобы моб, увидев игрока, бежал на него и не забывал о игроке, даже если игрок уже забежал за угол, так-как он уже был замечен мобом, и пока игрок не скроется от него в "ящик" (пока переключатель "ящика" не включен) - моб будет преследовать его.
    Просто по умолчанию, в скрипте Event See, ивент быстро забывает об увиденном игроке, стоит ему только уйти с поля зрения, что выглядит крайне нелогично, лично я не вижу смысла отключать поиск игрока, если игрок уже был замечен и не спрятался ни в какой ящик. Будет круто дополнить скрипт, если игрок замечен именно глазами, и пытается скрыться в ящик находясь в поле зрения, игра ему просто не даст это сделать. (включать переключатель, запрещающий прятаться в ящики, пока находишься в поле зрения)

    Для слуха будет хорошо сделать проверки на наличие непроходимых препятствий, такие же как и сделаны для зрения.

    Как можно записать проверки в ивент: <Sensor5>4/see/Робот (<Sensor5> - проверка радиуса слуха, 4 - уровень слуха для проверок способностей, /see/ - может ли ивент заметить игрока глазами перед собой (кстати, можно оставить гибкую настройку этого зрения, потому что она позволяет улучшить зрение в ширь и длину - Paranoid предусмотрел), а Робот - это любое имя ивента, какое угодно, просто как пример)


    Знаю, что это можно было описать проще, но писал этот текст ночью) В общем мой уровень точно не позволит написать скрипт такого рода, но если кто шарит и есть желание так прокачать скрипт, возьмите пожалуйста скрипт MOG и обновлённый нейросетью и мной скрипт Event See от Paranoid'а, что я кидал в сообщении выше (версия 1.1), из них можно слепить действительно крутой скрипт, позволяющий наконец, нормально реализовать систему скрытности на RPG Maker VX Ace, которой уже давно не хватало для игр с элементами стелса.
    Последний раз редактировалось Sleeping Visitor; Сегодня в 01:29.

Страница 2 из 2 ПерваяПервая 12

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Метки этой темы

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
Зрение ивента по прямой