Войти на сайт

Авторизация, ждите ...
×

ТЕМА: Переключение героев (Player Switch)

Переключение героев (Player Switch) 9 года 6 мес. назад #80701

  • DeadElf79
  • DeadElf79 аватар
  • Вне сайта
  • Звездный Страж
  • Сообщений: 3147
  • Спасибо получено: 2650
  • Организатор конкурсовПроект месяца 2 место1 место в ГотвУчительПрограммист RubyВетеран3 местоПроект месяца 1 местоПисатель 3 место
Переключение героев (Player Switch)
Автор: Hime
Переводчик: DeadElf79
Оригинал скрипта: forums.rpgmakerweb.com/index.php?/topic/3083-player-switch/

Описание: скрипт позволяет удобно переключаться между персонажами. В демке указан самый простой способ - через вызов меню по нажатию клавиши (по умолчанию - Ф). Дополнительные возможности описаны в скрипте.

Код:
=begin
Ссылка на оригинальный скрипт:
http://forums.rpgmakerweb.com/index.php?/topic/3083-player-switch/
 
#==============================================================================
 ** Player Switch (Переключение персонажей)
 Автор: Hime
 Переводчик: DeadElf79
 Дата создания: Август 3, 2013
 Дата перевода: 4 мая 2015
------------------------------------------------------------------------------
 ** Список изменений
 Август 3, 2013
   - добавлена возможность удалить главного героя из списка,
   чтобы не переключаться на него.
 Август 12, 2012
   - добавлена поддержка вызова скрипта выбора персонажей от Moghunter
   (опционально, ищите в скрипте переменную Use_Better_Scene)
 Август 9, 2012
   - исправлена ошибка, когда созданные главные герои появлялись на карте
   не сразу.
 Май 23, 2012
   - добавлена поддержка проверки событий
   для множества главных героев
 Май 22, 2012
   - Первый релиз
------------------------------------------------------------------------------   
 Данный скрипт позволяет Вам переключаться между несколькими главными
 героями в одной и той же игре при помощи удобного меню или ивентов (см. ниже).
 
 Для создания персонажа, на которого можно переключаться, вызовите скрипт:
 
   $game_players.create_player(actor_id)
 
 Где actor_id - это номер персонажа в базе данных
 
 Вы также можете переключится на необходимого персонажа
 с помощью вызова скрипта из события:
 
   $game_players.switch_player(player_id)
 
 По умолчанию, главный герой имеет player_id равное 1,
 все остальные персонажи имеют player_id в зависимости от того,
 в каком порядке они добавлялись в список
 
 Вы также можете проверить, присутствует ли карте кто-то из героев
 через вызов скрипта в окне проверки условия (вкладка 4):
 
    any_players_here?
 
 Аналогично этому Вы можете проверить присутствие определенных
 персонажей (по номеру персонажа в списке).
 
    player_here?(player_id)
 
#==============================================================================
=end
$imported = {} if $imported.nil?
$imported["Tsuki_PlayerSwitch"] = true
#==============================================================================
# ** Настройки
#==============================================================================
module Tsuki
  module Player_Switch
 
    # Случайные фразы, которые произносят неактивные персонажи
    # (на которых Вы не переключены прямо сейчас).
    Player_Speeches = [
       "Хм...",
       "Да, что?",
       "Ты чего-то хочешь",
       "Эй, видал ли ты такое?",
       "Мне так скучно",
       "Всё - тлен",
       "Может, ты уже переключишься на меня?"
    ]
 
    # Измените на true только в том случае, если у Вас
    # установлен скрипт Scene_Player_Select
    # от Moghunter (от переводчика: работает с этим скриптом плохо, не ставьте)
    # Ставь false, если у тебя нет
    # супер-скриптов с окнами
    Use_Better_Scene = false
 
    # Поставьте 0, если Вы хотите, чтобы неактивные персонажи оставлись стоять
    # или же 1, чтобы они могли свободно гулять в пределах карты.
    Idle_Player_Move_Type = 0
 
    # Поставьте true, если Вы хотите включить возможность дублировать персонажей
    Allow_Dupe_Actors = false
 
    # Клавиша для переключения между персонажами (по умолчанию - Ф)
    # Подробнее о клавишах Вы можете почитать в справке.
    Switch_Key = :X
  end
end
#==============================================================================
# ** Здесь начинается скрипт. Не меняйте, если не хотите проблем ^_^
#==============================================================================
module DataManager
 
  class << self
    alias :th_player_switch_create_game_objects :create_game_objects
    alias :th_player_switch_make_save_contents :make_save_contents
    alias :th_player_switch_extract_save_contents :extract_save_contents
  end
 
  def self.create_game_objects
    th_player_switch_create_game_objects
    $game_players = Game_Players.new
    $game_parties = Game_Parties.new
  end
 
  def self.make_save_contents
    contents = th_player_switch_make_save_contents
    contents[:players] = $game_players
    contents[:parties] = $game_parties
    contents
  end
 
  def self.extract_save_contents(contents)
    th_player_switch_extract_save_contents(contents)
    $game_players = contents[:players]
    $game_parties = contents[:parties]
  end
end
 
module RPG
 
  class Event
    attr_accessor :player
  end
end
 
class Game_System
 
  attr_accessor :switch_disabled
  attr_accessor :switch_fade
  attr_accessor :player_roam
  alias :th_player_switch_init_system :initialize
  def initialize
    th_player_switch_init_system
    @switch_disabled = false
    @switch_fade = true
    @player_roam = 0
  end
end
 
class Game_Map
  include Tsuki::Player_Switch
 
  alias :th_player_switch_init_map :initialize
  def initialize
    th_player_switch_init_map
    @player_events = []
  end
 
  alias :th_player_switch_setup_map :setup
  def setup(map_id)
    th_player_switch_setup_map(map_id)
    setup_player_events
  end
 
  def setup_player_events
    index = @events.empty? ? 1 : @events.keys.max + 1
    clear_player_events
    events = create_player_events(index)
    events.each_with_index do |event, i|
      @events[index+i] = Game_PlayerEvent.new(@map_id, event)
      @player_events << index+i
    end
    SceneManager.scene.refresh_spriteset if SceneManager.scene_is?(Scene_Map)
  end
 
  def create_player_events(index)
    events = []
    players = $game_players.other_players(@map_id)
    players.each_with_index do |player, i|
      leader = player.party.leader
      event = RPG::Event.new(player.x, player.y)
      event.id = index+i
      event.player = player
 
      add_balloon_animation(event.pages[0].list)
      event.pages[0].move_type = $game_system.player_roam
      event.pages[0].trigger = 0
      event.pages[0].priority_type = 1
      event.pages[0].graphic.character_name = leader.character_name
      event.pages[0].graphic.character_index = leader.character_index
      event.pages[0].graphic.direction = player.direction
      events << event
    end
    return events
  end
 
  def add_balloon_animation(list)
    list << RPG::EventCommand.new(101, 0, ["", 0, 0, 2])
    list << RPG::EventCommand.new(401, 0, [Player_Speeches[rand(Player_Speeches.size - 1)]])
    list << RPG::EventCommand.new
  end
 
  def clear_player_events
    return if @player_events.nil?
    @player_events.each do |id|
      ev = @events[id]
      next unless ev.is_a?(Game_PlayerEvent)
      ev.player.update_position(ev.x, ev.y, ev.direction)
      @events.delete(id)
    end
    @player_events = []
  end
end
 
class Game_CharacterBase
 
  def pos
    [@x, @y]
  end
end
 
class Game_PlayerEvent < Game_Event
 
  attr_accessor :player
  def initialize(map_id, event)
    super
    @player = event.player
  end
end
 
class Game_Player
 
  attr_accessor :party
  attr_accessor :map_id
  attr_accessor :player_id
 
  alias :th_player_switch_init_player :initialize
  def initialize
    th_player_switch_init_player
    @party = $game_party
    @player_id = 0
  end
 
  def update_position(x, y, direction)
    @x = x
    @y = y
    @direction = direction
    moveto(x, y)
  end
 
  def save_map_info
    @map_id = $game_map.map_id
  end
 
  def in_vehicle?
    in_boat? || in_ship? || in_airship?
  end
 
  #--------------------------------------------------------------------------
  # * Don't center on players that aren't the current player
  #--------------------------------------------------------------------------
  alias :th_player_switch_center :center
  def center(x, y)
    if @player_id == $game_player.player_id
      th_player_switch_center(x, y)
    end
  end
end
 
class Game_Players
  include Tsuki::Player_Switch
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    @data = [nil]
    @actors = []
    @id = 1
    setup
  end
 
  def setup
    $game_player.party = $game_party
    $game_player.player_id = 1
    @data << $game_player
  end
  #--------------------------------------------------------------------------
  # * Get Actor
  #--------------------------------------------------------------------------
  def [](actor_id)
    @data[actor_id]
  end
 
  def size
    @data.size
  end
 
  def all_players
    @data[1..-1]
  end
 
  def update_position(player_id, x, y, direction)
    @data[player_id].update_position(x, y, direction)
    @data[player_id].moveto(x, y)
  end
 
  def other_players(map_id = $game_map.map_id)
    @data.select {|player| player if player && player.player_id != @id && player.map_id == map_id}
  end
 
  def add_player(player)
    @data << player
  end
 
  def switch
    if @id == 1
      switch_player(2)
    else
      switch_player(1)
    end
  end
 
  def switch_player(id)
    return if @id == id || !@data[id] || $game_player.transfer?
    SceneManager.scene.fadeout(60) if SceneManager.scene_is?(Scene_Map) && $game_system.switch_fade
    @id = id
    $game_player.save_map_info
    $game_player = @data[id]
    $game_party = $game_player.party
    $game_map.setup($game_player.map_id) if $game_map.map_id != $game_player.map_id
    $game_player.center($game_player.x, $game_player.y)
    $game_player.make_encounter_count
    $game_player.refresh
    $game_map.setup_player_events
    SceneManager.scene.refresh_spriteset if SceneManager.scene_is?(Scene_Map)
    SceneManager.scene.fadein(60) if SceneManager.scene_is?(Scene_Map) && $game_system.switch_fade
  end
 
  # create a new player with the specified actor as the leader
  def create_player(actor_id, start_map_id=$data_system.start_map_id, start_x=$data_system.start_x, start_y=$data_system.start_y)
    return if @actors.include?(actor_id) && !Allow_Dupe_Actors
    @actors << actor_id
    player = Game_Player.new
    player.player_id = @data.size
    player.moveto(start_x, start_y)
    player.map_id = start_map_id
    party = $game_parties.create_party(actor_id)
    player.party = party
    add_player(player)
    $game_map.setup_player_events
  end
 
  def delete_player(player_id)
    player = @data[player_id]
    return unless player
    @actors -= player.party.members.collect {|mem| mem.instance_variable_get(:@actor_id)}
    @data.delete(player)
    $game_map.setup_player_events
    SceneManager.scene.refresh_spriteset if SceneManager.scene_is?(Scene_Map)
  end
end
 
class Game_Parties
  def initialize
    @data = [nil]
    setup
  end
 
  def setup
    @data << $game_party
  end
  #--------------------------------------------------------------------------
  # * Get Actor
  #--------------------------------------------------------------------------
  def [](party_id)
    @data[party_id]
  end
 
  def add_party(party)
    @data << party
  end
 
  def create_party(actor_id)
    party = Game_Party.new
    party.add_actor(actor_id)
    add_party(party)
    return party
  end
end
 
class Game_Interpreter
 
  def any_players_here?
    $game_players.all_players.any? {|player| player.pos == $game_map.events[@event_id].pos}
  end
 
  def player_here?(player_id=1)
    return unless $game_players[player_id] 
    $game_players[player_id].pos == $game_map.events[@event_id].pos
  end
 
  def delete_player(player_id)
    $game_players.delete_player(player_id)
  end
end
 
class Scene_Map < Scene_Base
  include Tsuki::Player_Switch
 
  alias :th_player_switch_update_scene :update_scene
  def update_scene
    th_player_switch_update_scene
    update_switch_player unless scene_changing? 
  end
 
  def update_switch_player
    @player_switch ||= Input.trigger?(Switch_Key)
    call_player_switch if @player_switch && !$game_player.moving? && !$game_system.switch_disabled || $game_player.transfer? 
  end
 
  def call_player_switch
    @player_switch = false
    return if $game_map.interpreter.running?
    if $game_players.size - 1 <= 2
      $game_players.switch
    else
      Sound.play_ok
      call_switch_scene
 
    end
  end
 
  def call_switch_scene
    if Tsuki::Player_Switch::Use_Better_Scene 
      SceneManager.call(Scene_Character_Select)
    else
      SceneManager.call(Scene_Switch) 
    end
  end
 
  #re-draw sprites
  def refresh_spriteset
    @spriteset.refresh_characters
  end
end
 
class Scene_Switch < Scene_MenuBase
 
  def start
    super
    create_switch_window
    @switch_window.activate
  end
 
  def create_switch_window
    @switch_window = Window_Switch.new(84, 100)
    @switch_window.set_handler(:ok, method(:on_switch_ok))
    @switch_window.set_handler(:cancel, method(:return_scene))
  end  
 
  def on_switch_ok
    player = @switch_window.item
    $game_players.switch_player(player.player_id)
    return_scene
  end
end
 
class Window_Switch < Window_Selectable
 
  def initialize(x, y)
    super(x, y, window_width, window_height)
    refresh
    select(0)
  end
 
  def window_width
    400
  end
 
  def window_height
    240
  end
 
  def col_max
    2
  end
 
  def item
    @data && index >= 0 ? @data[index] : nil
  end
 
  def item_max
    @data ? @data.size : 1
  end
 
  def make_item_list
    @data = $game_players.all_players
  end
 
  def item_height
    96
  end
 
  def draw_item(index)
    player = @data[index]
    if player
      leader = player.party.leader
      rect = item_rect(index)
      rect.width -= 4
      draw_actor_face(leader, rect.x + 32, rect.y)
    end
  end
 
  def refresh
    make_item_list
    create_contents
    draw_all_items
  end
end

Скриншот [ Нажмите, чтобы развернуть ]


Демо:
yadi.sk/d/OA4eK6dlgQsgn
Последнее редактирование: 9 года 6 мес. назад от DeadElf79.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: I_LORD, Ren310, strelokhalfer, Демий, peter8031983, MAHTUKOP, GoodBlackTea, Koteuka

Переключение героев (Player Switch) 9 года 6 мес. назад #80744

  • GoodBlackTea
  • GoodBlackTea аватар
  • Вне сайта
  • Заблокирован
  • Сообщений: 17
  • Спасибо получено: 2
Прям как в GTA 5 :laugh:



У меня вопрос
Как сделать, чтобы в неактивное время(когда я на него не переключён) персонаж ходил, говорил и так далее
P.S.
Idle_Player_Move_Type = 1 не работает :cry:
Администратор запретил публиковать записи гостям.

Переключение героев (Player Switch) 9 года 6 мес. назад #80745

  • DeadElf79
  • DeadElf79 аватар
  • Вне сайта
  • Звездный Страж
  • Сообщений: 3147
  • Спасибо получено: 2650
  • Организатор конкурсовПроект месяца 2 место1 место в ГотвУчительПрограммист RubyВетеран3 местоПроект месяца 1 местоПисатель 3 место
Как выяснилось, автор сделал настройку, но не сделал к ней рабочего метода. Будет время - допишу.
Администратор запретил публиковать записи гостям.
Модераторы: NeKotZima
Время создания страницы: 0.251 секунд