Pickup and Throw [RGSS3]

11 Respostas   2629 Visualizações

0 Membros e 1 Visitante estão vendo este tópico.

Lotmaker

  • Veterano
  • *
  • Posts: 340
  • Ouros: 462
  • Deixando as coisas mais fúteis para você.
  • Medalhas Vencedor CRM Awards - Melhor Roteirista
Tópico criado em: 09/03/2014 às 02:31



Resumo

               Basicamente é um script de "pegar e jogar" objetos, muito útil para puzzles sem dúvida.

Informações

Para definir quais os eventos serão arremessáveis basta nomear o evento da seguinte forma.

<ThrowX>

X é a distância que o evento pode ser arremessado.

Exemplo

<Throw5>


_________________________________________



É preciso ter uma imagem do personagem em posição de carregar objeto e nomear a imagem da seguinte forma.

Character_Name +_Pickup

Exemplo

Actor1_Pickup.png


Sample Image



Script

Código: [Selecionar]
#==============================================================================
# +++ MOG - PICKUP AND THROW (v1.2) +++
#==============================================================================
# By Moghunter
# http://www.atelier-rgss.com
#==============================================================================
# Sistema de carregar e arremessar eventos, útil para criar puzzles.
#==============================================================================
# Para definir quais os eventos serão arremessáveis basta nomear o evento
# da seguinte forma.
#
# <ThrowX>
#
# X é a distância que o evento pode ser arremessado.
#
# Exemplo
#
# Event01<Throw4>
#
#==============================================================================
# Sprite do personagem carregando o Objeto (Opcional)
#==============================================================================
# É preciso ter uma imagem do personagem em posição de carregar objeto e
# nomear a imagem da sequinte forma.
#
# Character_Name + _Pickup
#
# Exemplo
#
# Actor1_Pickup.png
#==============================================================================
 
#==============================================================================
# ● Histórico (Version History)
#==============================================================================
# v 1.2 - Melhor codificação.
# v 1.1 - Melhor compatibilidade com scripts de terceiros.
#==============================================================================
 
module MOG_PICK_THROW
  #Altura do sprite do objeto carregado.
  SPRITE_POSITION = 20
  #Definição do Som quando o objeto é arremessado.
  THROW_SE = "Jump2"
  #Definição do Som quando o objeto é carregado.
  PICK_UP_SE = "Jump1"
  #ID da Switch que desativa o sistema de carregar.
  DISABLE_PICKUP_SWITCH_ID = 100
  # Definição do botão de carregar(Arremeçar) objetos.
  PICKUP_BUTTON = Input::C
end 
 
#==============================================================================
# ■ Game_Temp
#==============================================================================
class Game_Temp
 
  attr_accessor :pickup_lock 
  attr_accessor :pickup_lock_time
  attr_accessor :character_pre_name
  attr_accessor :can_throw
  attr_accessor :throw_position
 
  #--------------------------------------------------------------------------
  # ● initialize
  #-------------------------------------------------------------------------- 
  alias mog_pick_initialize initialize
  def initialize
      @pickup_lock = false
      @pickup_lock_time = 0   
      @character_pre_name = ""
      @can_throw = true
      @throw_position = []
      mog_pick_initialize
  end 
end
 
#==============================================================================
# ■ Game_Event
#==============================================================================
class Game_Event < Game_Character
  attr_reader   :jump_count 
  attr_accessor :x
  attr_accessor :y
  attr_accessor :bush_depth
  attr_accessor :direction
 
  #--------------------------------------------------------------------------
  # ● initialize
  #--------------------------------------------------------------------------
  alias mog_pickup_initialize initialize
  def initialize(map_id, event)
      mog_pickup_initialize(map_id, event)   
      @throw_active = false
      if event.name =~ /<Throw(\d+)>/i
         @throw = $1.to_i
      end     
  end     
end
 
#==============================================================================
# ■ Game_CharacterBase
#==============================================================================
class Game_CharacterBase
  attr_accessor :throw_active
  attr_accessor :throw
 
  #--------------------------------------------------------------------------
  # ● initialize
  #-------------------------------------------------------------------------- 
  alias x_pickup_initialize initialize
  def initialize
      @throw_active = false
      @throw = 0
      x_pickup_initialize
  end 
 
end
 
#==============================================================================
# ■ Game_Character
#==============================================================================
class Game_Character < Game_CharacterBase
 
 #--------------------------------------------------------------------------
 # ● Throw Action
 #--------------------------------------------------------------------------
  def throw_action(range)   
      moveto($game_player.x,$game_player.y)
      jump_range = range
      moveto($game_player.x,$game_player.y)
      range.times do
      unless jumping?
        case $game_player.direction
           when 6             
             jump(jump_range,0) if throw_range?(jump_range,0,jump_range)
           when 4
             jump(-jump_range,0) if throw_range?(-jump_range,0,jump_range)
           when 2
             jump(0,jump_range) if throw_range?(0,jump_range,jump_range)
           when 8                       
             jump(0,-jump_range) if throw_range?(0,-jump_range,jump_range)
         end         
         if @x == $game_player.x and @y == $game_player.y and jump_range == 1
            $game_temp.can_throw = false
         end
         jump_range -= 1 
      end               
   end     
 end 
   
 #--------------------------------------------------------------------------
 # ● Throw Range?
 #--------------------------------------------------------------------------
 def throw_range?(x, y,range ) 
    x = $game_player.x
    y = $game_player.y
    case $game_player.direction   
        when 2
            y += range
        when 6       
            x += range
        when 4 
            x -= range
        when 8
            y -= range
    end     
    return false if collide_with_characters?(x, y)
    return false unless map_passable?(x, y,$game_player.direction)   
    return true
  end     
   
end 
 
#==============================================================================
# ■ Game_Player
#==============================================================================
class Game_Player < Game_Character 
  include MOG_PICK_THROW
 
  #--------------------------------------------------------------------------
  # ● Update Player Before Movement
  #-------------------------------------------------------------------------- 
  alias pickup_update update
  def update
      pickup_update
      update_pickup_command
  end
 
  #--------------------------------------------------------------------------
  # ● Update Pickup Command
  #-------------------------------------------------------------------------- 
  def update_pickup_command
      $game_temp.pickup_lock_time -= 1 if $game_temp.pickup_lock_time > 0
      return if $game_temp.pickup_lock_time > 0
      if Input.trigger?(PICKUP_BUTTON)
         throw_event if can_check_throw_event?
         check_event_pickup([0,1,2]) if can_check_pickup_event?
      end
  end
   
  #--------------------------------------------------------------------------
  # ● Check Action Event
  #--------------------------------------------------------------------------
  alias mog_pickup_check_action_event check_action_event
  def check_action_event
      return if $game_temp.pickup_lock_time > 0 or $game_temp.pickup_lock
      mog_pickup_check_action_event
  end 
   
  #--------------------------------------------------------------------------
  # ● Can Check Pickup Event
  #-------------------------------------------------------------------------- 
  def can_check_pickup_event?
      return false if $game_temp.pickup_lock
      return false if $game_temp.pickup_lock_time > 0     
      return false if $game_map.interpreter.running?
      return false if $game_message.visible
      return false if $game_switches[DISABLE_PICKUP_SWITCH_ID]
      return true
  end   
 
  #--------------------------------------------------------------------------
  # ● Can Check Throw Event
  #--------------------------------------------------------------------------   
  def can_check_throw_event?
      return false if $game_temp.pickup_lock == false
      return false if $game_temp.pickup_lock_time > 0
      return false if $game_map.interpreter.running?
      return false if $game_message.visible
      return false if $game_switches[DISABLE_PICKUP_SWITCH_ID]
      return true
  end   
 
  #--------------------------------------------------------------------------
  # ● Reserve Transfer
  #--------------------------------------------------------------------------
  alias mog_pickup_reserve_transfer reserve_transfer
  def reserve_transfer(map_id, x, y, direction)
      if $game_temp.pickup_lock == true
         for event in $game_map.events.values
             if event.throw_active == true
                event.throw_active = false
                event.moveto(@x,@y)
                case @direction
                   when 2
                     event.jump(0,-1)     
                   when 4
                     event.jump(1,0)     
                   when 6
                     event.jump(-1,0)     
                   when 8 
                     event.jump(0,1)   
                end     
             end 
         end     
         $game_temp.pickup_lock = false
         $game_temp.pickup_lock_time = 0
         @character_name = $game_temp.character_pre_name
      end 
      mog_pickup_reserve_transfer(map_id, x, y, direction)
  end
 
  #--------------------------------------------------------------------------
  # ● Movable?
  #-------------------------------------------------------------------------- 
  alias mog_pickup_movable movable?
  def movable?
      return false if $game_temp.pickup_lock_time > 0 
      mog_pickup_movable
  end 
 
  #--------------------------------------------------------------------------
  # ● Throw Event
  #-------------------------------------------------------------------------- 
  def throw_event
      for event in $game_map.events.values
          if event.throw_active and not jumping?
             $game_temp.can_throw = true
             event.throw_action(event.throw)
             return if $game_temp.can_throw == false
             $game_temp.pickup_lock_time = event.jump_count
             $game_temp.throw_position[0] = event.x
             $game_temp.throw_position[1] = event.y
             event.throw_active = false
             $game_temp.pickup_lock = false           
             Audio.se_play("Audio/SE/" + THROW_SE, 100, 100)
             @character_name = $game_temp.character_pre_name
             break
          end         
      end   
      if event == nil
         $game_map.reset_pickup
      end       
  end
 
  #--------------------------------------------------------------------------
  # ● Check Event Pickup
  #--------------------------------------------------------------------------
  def check_event_pickup(triggers)
      front_x = $game_map.x_with_direction(@x, @direction)
      front_y = $game_map.y_with_direction(@y, @direction)
      for event in $game_map.events_xy(front_x, front_y)
          if event.throw > 0 and not jumping?
             event.throw_active = true
             $game_temp.pickup_lock = true
             event.jump(0,0)
             $game_temp.pickup_lock_time = event.jump_count
             event.x = $game_player.x
             event.y = $game_player.y
             Audio.se_play("Audio/SE/" + PICK_UP_SE, 100, 100)
             $game_temp.character_pre_name = @character_name
             make_pickup_pose
             break
          end
      end
  end
 
  #--------------------------------------------------------------------------
  # ● Img Pickup Exist?
  #--------------------------------------------------------------------------
  def img_pickup_exist?
      Cache.character(@character_name + "_Pickup") rescue return false
  end
   
  #--------------------------------------------------------------------------
  # ● Make Pickup Pose
  #-------------------------------------------------------------------------- 
  def make_pickup_pose
      @character_name = @character_name + "_Pickup" if img_pickup_exist?
  end
 
end
 
#==============================================================================
# ■ Sprite_Character
#==============================================================================
class Sprite_Character < Sprite_Base 
  include MOG_PICK_THROW
 
  #--------------------------------------------------------------------------
  # ● Update X Effects
  #--------------------------------------------------------------------------             
  alias mog_pickup_update_position update_position
  def update_position
      mog_pickup_update_position
      update_pickup_position if can_pickup_position?
  end 
 
  #--------------------------------------------------------------------------
  # ● Can Pickup Position
  #--------------------------------------------------------------------------       
  def can_pickup_position?
      return false if $game_temp.pickup_lock_time > 0
      return false if $game_temp.pickup_lock == false     
      return false if @character.throw_active == false     
      return false if @character.is_a?(Game_Player)
      return false if @character.jumping?
      return true
  end   
 
  #--------------------------------------------------------------------------
  # ● Update Pickup Position
  #--------------------------------------------------------------------------     
  def update_pickup_position
      @character.x = $game_player.x
      @character.y = $game_player.y
      @character.bush_depth = 0
      unless @character.direction_fix
          @character.direction = $game_player.direction
      end
      self.x = $game_player.screen_x
      self.y = $game_player.screen_y - SPRITE_POSITION
      self.z = $game_player.screen_z + 1
  end
end 
 
#==============================================================================
# ■ Scene_Map
#==============================================================================
class Scene_Map < Scene_Base
 
  #--------------------------------------------------------------------------
  # ● Call Menu
  #--------------------------------------------------------------------------   
  alias mog_pickup_call_menu call_menu
  def call_menu
      return if $game_temp.pickup_lock == true
      mog_pickup_call_menu
  end
 
end
 
#==============================================================================
# ■ Game Interpreter
#==============================================================================
class Game_Interpreter
 
  #--------------------------------------------------------------------------
  # ● Command 352
  #--------------------------------------------------------------------------     
  alias mog_pickup_command_352 command_352
  def command_352
      return if $game_temp.pickup_lock == true
      mog_pickup_command_352
  end
     
end     
 
#==============================================================================
# ■ Game_Map
#==============================================================================
class Game_Map
 
 #--------------------------------------------------------------------------
 # ● Setup
 #-------------------------------------------------------------------------- 
  alias mog_pickup_setup setup
  def setup(map_id)
      mog_pickup_setup(map_id)
      reset_pickup
  end 
 
 #--------------------------------------------------------------------------
 # ● Reset Pickup
 #-------------------------------------------------------------------------- 
  def reset_pickup
      for i in $game_map.events.values
          if i.throw_active
             i.throw_active = false
             i.moveto($game_player.x,$game_player.y)
             i.jump(0,0)             
             i.move_backward
             $game_player.character_name = $game_temp.character_pre_name
          end   
      end 
      $game_temp.pickup_lock_time = 0
      $game_temp.pickup_lock = false
  end 
end 
 
$mog_rgss3_pickup_and_throw = true
 


Demo



Créditos

Mog pela Criação
Atelier RGSS pela disponibilização
Conteúdos novos sempre, o trem nunca para.


Zombie  Misty!

By:Zombie

Myzhuk

  • *
  • Posts: 439
  • Ouros: 219
  • Hello there!!!
  • Medalhas Medalha dada ao 2° colocado no concurso DFTW
Resposta 1: 09/03/2014 às 12:58

Eu já tenho esse script em um pacote do autor, é realmente muito bem feito e útil velho!

Noble

  • *
  • Posts: 282
  • Ouros: 127
  • Me manda mensagem, vou ficar bem feliz c:
  • Equipamentos "Se prefere andar à noite vai precisar de uma dessas. Permite golpes silenciosos e se camufla fácil, fácil na escuridão." "Um dos melhores trabalhos dos povos das terras da noite é esse metal, que na escuridão mais gelada aquece o corpo que protege."
Resposta 2: 09/03/2014 às 13:03

Script muito bom, dá pra fazer um Bomberman com isso :/
Eu lembro que em Lufia, a maioria dos obstáculos eram ultrapassados dessa forma, tendo que levar essas paradas para botões, que quando pressionados abriam alguma porta.
♫ Portfolio ♪
Sinta-se livre pra entrar em contato comigo quando quiser.

katumblo

  • *
  • Posts: 555
  • Ouros: 211
  • Aposentado esperando o Uthred pagar minha aposent.
  • Equipamentos "Este era muito usado nas famosas e aclamadas justas. A pequena abertura era só para a visão mesmo. Ainda bem que guardei um." "O azul da cota de malha e o dourado da ombreira contrastam com o aço forte e resistente desta armadura." "Quando reerguemos nossa CRM, árduas foram as batalhas, e sempre tivemos em mãos nossos escudos. Este representa nossas defesas, e nele, as engrenagens que nos move." "Se não lhe dão a glória, conquiste-a com uma beleza dessas. Confie em mim, não há odalisca que resista."
Resposta 3: 09/03/2014 às 13:36

Ótimo script, perfeito para algumas ocasiões, só não coloco no meu jogo pois tenho muita preguiça pouco tempo vago :c

Uma dica para quem não sabe o que fazer com esse script :
Faça uma casa customizável pelo personagem, realmente iria ficar muito interessante {:

Talvez eu use esse script {:
Tudo vai dar certo (y(8.

Lotmaker

  • Veterano
  • *
  • Posts: 340
  • Ouros: 462
  • Deixando as coisas mais fúteis para você.
  • Medalhas Vencedor CRM Awards - Melhor Roteirista
Resposta 4: 09/03/2014 às 19:00

@all

Penso eu que interessante mesmo seria você fazer algo que não fosse para um puzzle, isso seria bem original, visto que o script, a ideia dele, é carregar o objeto, transpor ele de lugar, a ideia dos braços levantados pra cima, usando para carregar pedras por exemplo, nós a criamos.

Interessante seria se usasse para um sistema menos complexo, como compras em um SHOP, você carrega o potion, põe em cima do balcão, e depois o compra. Isso sim seria algo original, usando um script, um evento que já é quase clichê


Abrçs, Ltmkr
Conteúdos novos sempre, o trem nunca para.


Zombie  Misty!

By:Zombie

katumblo

  • *
  • Posts: 555
  • Ouros: 211
  • Aposentado esperando o Uthred pagar minha aposent.
  • Equipamentos "Este era muito usado nas famosas e aclamadas justas. A pequena abertura era só para a visão mesmo. Ainda bem que guardei um." "O azul da cota de malha e o dourado da ombreira contrastam com o aço forte e resistente desta armadura." "Quando reerguemos nossa CRM, árduas foram as batalhas, e sempre tivemos em mãos nossos escudos. Este representa nossas defesas, e nele, as engrenagens que nos move." "Se não lhe dão a glória, conquiste-a com uma beleza dessas. Confie em mim, não há odalisca que resista."
Resposta 5: 09/03/2014 às 19:26

@all

Penso eu que interessante mesmo seria você fazer algo que não fosse para um puzzle, isso seria bem original, visto que o script, a ideia dele, é carregar o objeto, transpor ele de lugar, a ideia dos braços levantados pra cima, usando para carregar pedras por exemplo, nós a criamos.

Interessante seria se usasse para um sistema menos complexo, como compras em um SHOP, você carrega o potion, põe em cima do balcão, e depois o compra. Isso sim seria algo original, usando um script, um evento que já é quase clichê


Abrçs, Ltmkr

Do meu jeito não é cliche não ._. Você mudar os móveis de sua casa de lugar ... provável que eu use desse jeito, daí você poderia re-decorar sua casa como você quisesse ...
Só uma pergunta, teria como se, em vez de parar em cima do personagem, parasse em cima de um carrinho ? tipo :

 O
/|\ c BBBBBBB
/\   ccccccc

No caso o boneco é o personagem, o C é o carrinho e o B é o objeto ...
Tudo vai dar certo (y(8.

Lotmaker

  • Veterano
  • *
  • Posts: 340
  • Ouros: 462
  • Deixando as coisas mais fúteis para você.
  • Medalhas Vencedor CRM Awards - Melhor Roteirista
Resposta 6: 09/03/2014 às 19:29

Cara, tudo depende do sprite que você for criar para o personagem, e uma configuração leve no script. Mas é possível sim
Conteúdos novos sempre, o trem nunca para.


Zombie  Misty!

By:Zombie

Avenger_B7

  • *
  • Posts: 841
  • Ouros: 396
  • A persistência é o caminho do êxito. - C. Chaplin
  • Equipamentos "Escudos não são só para defender. Este por exemplo é excelente para ataques noturnos. Em mãos hábeis se torna invisível, é o que dizem por aí." "Todo guerreiro jura dar a própria vida para defender seu reino, e esta arma é o símbolo disto. Quer dizer, a engrenagem nela que é."
Resposta 7: 10/03/2014 às 00:56

Muito interessante!! Só acho que não será compatível com um script de mostrar o nome do personagem.

-

Queria ter participado na época do Mog. Será que ele tem alguns tutoriais e aulas?!

Unique Destiny | um novo conceito de RPG Maker 2000!

Raizen

  • Administrador
  • *
  • Posts: 3224
  • Ouros: 3192
  • Medalhas Vencedor do Protótipo Premiado Participante notável do evento "A Estação das Luzes do Norte" Vencedor CRM Awards - Melhor Scripter Vencedores das edições do Concurso Projeto Rickas!
Resposta 8: 10/03/2014 às 14:47

Muito interessante!! Só acho que não será compatível com um script de mostrar o nome do personagem.

-

Queria ter participado na época do Mog. Será que ele tem alguns tutoriais e aulas?!
Como assim na época do Mog xD? Ele continua ativo, só que nunca participou de comunidades que eu saiba :P.

E nops, ele só faz scripts ele não tem aulas pelo que eu saiba :(.


É um script bem maneiro, como a maioria dos trabalhos dele xD, legal trazer Lot.

Uhtred

  • Mito
  • *
  • Posts: 1598
  • Ouros: 2175
  • Even a broken clock is right twice a day.
  • Medalhas Participante da 2º Mostra de Arte Steamfórdia Vencedor da 1º Edição da CRM JAM Vencedor CRM Awards - Melhor Maker Vencedor CRM Awards - Melhor Projeto Vencedor CRM Awards - Melhor Jogo Completo Participantes do Maps Together 2 Vencedor do Protótipo Premiado Vencedores das edições do Concurso Projeto Rickas!
Resposta 9: 10/03/2014 às 15:06

Belo script mesmo, me lembra do Harvest Moon onde tem que tirar as pedras de lugar pra limpar o terreno ahuah

Valeu por trazer, lot!

Victor Sena

Resposta 10: 10/03/2014 às 15:10

 O Khas tem umas videos aulas que podem te ajudar mais, ele é um ótimo scripter também, diria que bem nivelado com o Mog.

AndreFi1ho

  • *
  • Posts: 9
  • Ouros: 0
Resposta 11: 20/04/2020 às 18:21 - Última modificação por AndreFi1ho em 20/04/2020 às 18:46

Como manter o item em algum lugar modificado após sair e voltar do mapa?