O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

Sliding Block Puzzle

Iniciado por Raizen, 02/03/2014 às 06:20

02/03/2014 às 06:20 Última edição: 02/03/2014 às 11:22 por Raizen
Sliding Block Puzzle

Compativel com: RMVXAce
Compatibilidade :excelente
Facilidade de uso: fácil
Lag gerado: baixo
[box class=titlebg]
Condições de Uso
[/box]
  Pode ser modificado, e divulgado, mas mantenha os créditos a mim obrigado.

[box class=titlebg]
Para que serve o script
[/box]
  O script adiciona o mini-game famoso de deslizar blocos para montar a imagem final, basta ver as imagens e saberá do que digo :).

O mini-game pode ser adicionado a qualquer momento no jogo, e a quantidade de blocos é totalmente configurável.


[box class=titlebg]
Script
[/box]

module Lune_Sliding
Game = []

#=======================================================
#         Sliding Puzzle Game
# Author: Raizen
# Comunidade: www.centrorpg.com
# 
# O mini-game consiste em mover blocos até
# que a imagem esteja completa.
#=======================================================
# NOTA: O script PODE ser adicionado a qualquer momento 
# na produção do jogo

# Para chamar o Script basta utilizar o seguinte comando,
# Chamar Script: slide_game(n)
# aonde n é o número do jogo que pode ser configurado abaixo.


# A velocidade com o qual os blocos se movem
Speed = 10 

# Som no momento que um bloco se mover
Sound_B = 'Wind7' 

# Som no caso de conseguir resolver
Victory = 'Decision2' 

# A quantidade de vezes que é embaralhado, quanto maior
# mais embaralhado, mas demora mais para carregar.
Shuffle = 200 


# Crie aqui os jogos que deseja, basta seguir o seguinte,
# Game[n] = { Aonde n é o número do jogo.


# Todas Imagens dentro de Graphics/Sliding
#==============================================================================
# Game 1 => Miku
#==============================================================================
Game[1] = {
'Background' => 'back1', # Imagem de fundo
'Image' => 'Miku', # Imagem dos blocos
'Xaxis' => 3, # Quantidade de blocos no eixo X
'Yaxis' => 3, # Quantidade de blocos no eixo Y
'Escape?' => false, # É possível sair no meio do jogo?
'Switch' => 1, #Switch ativada após completar o jogo
'Music' => 'Dungeon6', #música do jogo
}

#==============================================================================
# Game 2 => Misa
#==============================================================================
Game[2] = {
'Background' => 'back1', # Imagem de fundo
'Image' => 'Misa', # Imagem dos blocos
'Xaxis' => 4, # Quantidade de blocos no eixo X
'Yaxis' => 5, # Quantidade de blocos no eixo Y
'Escape?' => true, # É possível sair no meio do jogo?
'Switch' => 1, #Switch ativada após completar o jogo
'Music' => 'Dungeon6', #música do jogo
}
end

#==============================================================================
# ** Scene_Panel
#------------------------------------------------------------------------------
#  Esta classe é a classe principal do mini-game.
#==============================================================================

class Scene_Panel < Scene_MenuBase
include Lune_Sliding
  #--------------------------------------------------------------------------
  # * Inicialização do processo
  #--------------------------------------------------------------------------
  def start
    @map_bgm = RPG::BGM.last
    @map_bgs = RPG::BGS.last
    RPG::BGS.stop
    @game = Game[$config_panel_game]
    super
    create_game_variables
    create_game_pictures
    shuffle_board
  end
  #--------------------------------------------------------------------------
  # * Criação das variáveis
  #--------------------------------------------------------------------------
  def create_game_variables
    @speed = Speed
    @cursor = 0
    @aux = []
    @move = 0
    @block = []
    @direction = 0
    @count = 10
    @victory = false
  end
  #--------------------------------------------------------------------------
  # * Criação das Imagens
  #--------------------------------------------------------------------------
  def create_game_pictures
    @back = Sprite.new
    @im = Array.new
    RPG::BGM.new(@game['Music']).play
    @back.bitmap = Cache.sliding(@game['Background'])
    @back.x = (Graphics.width - @back.bitmap.width)/2
    @back.x = (Graphics.height - @back.bitmap.height)/2
    @map = Array.new(@game['Xaxis'])
    for n in 0...@game['Xaxis']
      @im[n] = Array.new
      @map[n] = Array.new
    end
    for x in 0...@game['Xaxis']
      for y in 0...@game['Yaxis']
        @im[x][y] = Sprite.new
        @im[x][y].bitmap = Cache.sliding(@game['Image'])
        @im[x][y].x = (Graphics.width - @im[x][y].bitmap.width)/2 + x*@im[x][y].bitmap.width/@game['Xaxis']
        @im[x][y].y = (Graphics.height - @im[x][y].bitmap.height)/2 + y*@im[x][y].bitmap.height/@game['Yaxis']
        @im[x][y].src_rect.set(x*@im[x][y].bitmap.width/@game['Xaxis'], y*@im[x][y].bitmap.height/@game['Yaxis'], @im[x][y].bitmap.width/@game['Xaxis'], @im[x][y].bitmap.height/@game['Yaxis'])        
        @map[x][y] = [@im[x][y].x, @im[x][y].y]
        @im[x][y].bitmap = Cache.sliding('') if (x+1) == @game['Xaxis'] && (y+1) == @game['Yaxis']
        @map[x][y] = (x+1) + y*@game['Xaxis']
      end
    end
    @cursor = @game['Xaxis'] * @game['Yaxis']
  end
  #--------------------------------------------------------------------------
  # * Atualização da classe
  #--------------------------------------------------------------------------
  def update
    super
    if @victory
      return_scene if Input.trigger?(:B)
      return
    end
    return if block_moving?
    if Input.trigger?(:B)
      @game['Escape?'] ? return_scene : Sound.play_buzzer
    end
    move_block(Input.dir4)
  end
  #--------------------------------------------------------------------------
  # * Mover os quadros
  #--------------------------------------------------------------------------
  def block_moving?
    return false if @direction == 0
    x = @block[0]
    y = @block[1]
    case @direction
    when 8
      if @count < @speed
        @im[x][y].y -= (@im[x][y].bitmap.height/@game['Yaxis'])/@speed
      else
        @im[x][y].y -= @correctiony
      end
    when 6
      if @count < @speed
        @im[x][y].x += (@im[x][y].bitmap.width/@game['Xaxis'])/@speed
      else
        @im[x][y].x += @correctionx
      end
    when 4
      if @count < @speed
        @im[x][y].x -= (@im[x][y].bitmap.width/@game['Xaxis'])/@speed
      else
        @im[x][y].x -= @correctionx
      end
    when 2
      if @count < @speed
        @im[x][y].y += (@im[x][y].bitmap.height/@game['Yaxis'])/@speed
      else
        @im[x][y].y += @correctiony
      end
    end
    @count += 1
    if @count == (@speed + 1)
      @direction = 0 
      if orded
        $game_switches[@game['Switch']] = true
        @victory = true 
        RPG::SE.new(Victory).play
      end
    end
    true
  end
  #--------------------------------------------------------------------------
  # * Mover o bloco
  #--------------------------------------------------------------------------
  def move_block(dir)
  return if dir == 0
  @move = @map[(@cursor-1) % @game['Xaxis']][(@cursor-1)/@game['Xaxis']]
  @aux = [(@move-1) % @game['Xaxis'],(@move-1)/@game['Xaxis']]
  @old_cursor = @cursor
  case dir
  when 8
    if @cursor + @game['Xaxis'] <= @game['Xaxis']*@game['Yaxis']
      @cursor += @game['Xaxis']
    else
      return
    end
  when 6
    if (@cursor - 1) % @game['Xaxis'] != 0
      @cursor -= 1
    else
      return
    end
  when 4
    if @cursor % @game['Xaxis'] != 0
      @cursor += 1
    else
      return
    end
  when 2
    if @cursor - @game['Xaxis'] > 0
      @cursor -= @game['Xaxis']
    else
      return
    end
  end
    RPG::SE.new(Sound_B).play
    @move = @map[(@cursor-1) % @game['Xaxis']][(@cursor-1)/@game['Xaxis']]
    @block = [(@move-1) % @game['Xaxis'],(@move-1)/@game['Xaxis']]
    @old = @map[(@cursor-1) % @game['Xaxis']][(@cursor-1)/@game['Xaxis']]
    @map[(@cursor-1) % @game['Xaxis']][(@cursor-1)/@game['Xaxis']] = @map[(@old_cursor-1) % @game['Xaxis']][(@old_cursor-1)/@game['Xaxis']]
    @map[(@old_cursor-1) % @game['Xaxis']][(@old_cursor-1)/@game['Xaxis']] = @old
    @correctionx = @im[0][0].bitmap.width/@game['Xaxis'] % @speed
    @correctiony = @im[0][0].bitmap.height/@game['Yaxis'] % @speed
    @count = 0
    @direction = dir
  end
  #--------------------------------------------------------------------------
  # * Embaralhar o quadro
  #--------------------------------------------------------------------------
  def shuffle_board
    @count = 0
    while @count <= Shuffle
      move_shuffle
      block_shuffle
      @count+= 1
    end
    until @cursor == @game['Xaxis'] * @game['Yaxis']
      move_shuffle
      block_shuffle
    end
    @count = 0
  end
  #--------------------------------------------------------------------------
  # * Embaralhar os quadros
  #--------------------------------------------------------------------------
  def block_shuffle
    return false if @direction == 0
    x = @block[0]
    y = @block[1]
    case @direction
    when 8
      @im[x][y].y -= (@im[x][y].bitmap.height/@game['Yaxis'])
    when 6
      @im[x][y].x += (@im[x][y].bitmap.width/@game['Xaxis'])
    when 4
      @im[x][y].x -= (@im[x][y].bitmap.width/@game['Xaxis'])
    when 2
      @im[x][y].y += (@im[x][y].bitmap.height/@game['Yaxis'])
    end
    @direction = 0
    true
  end
  #--------------------------------------------------------------------------
  # * Embaralhar as variáveis
  #--------------------------------------------------------------------------
  def move_shuffle
  @move = @map[(@cursor-1) % @game['Xaxis']][(@cursor-1)/@game['Xaxis']]
  @aux = [(@move-1) % @game['Xaxis'],(@move-1)/@game['Xaxis']]
  @old_cursor = @cursor
  dir = (rand(4)+1)*2
  p dir
  case dir
  when 8
    if @cursor + @game['Xaxis'] <= @game['Xaxis']*@game['Yaxis']
      @cursor += @game['Xaxis']
    else
      return
    end
  when 6
    if (@cursor - 1) % @game['Xaxis'] != 0
      @cursor -= 1
    else
      return
    end
  when 4
    if @cursor % @game['Xaxis'] != 0
      @cursor += 1
    else
      return
    end
  when 2
    if @cursor - @game['Xaxis'] > 0
      @cursor -= @game['Xaxis']
    else
      return
    end
  end
    @move = @map[(@cursor-1) % @game['Xaxis']][(@cursor-1)/@game['Xaxis']]
    @block = [(@move-1) % @game['Xaxis'],(@move-1)/@game['Xaxis']]
    @old = @map[(@cursor-1) % @game['Xaxis']][(@cursor-1)/@game['Xaxis']]
    @map[(@cursor-1) % @game['Xaxis']][(@cursor-1)/@game['Xaxis']] = @map[(@old_cursor-1) % @game['Xaxis']][(@old_cursor-1)/@game['Xaxis']]
    @map[(@old_cursor-1) % @game['Xaxis']][(@old_cursor-1)/@game['Xaxis']] = @old
    @direction = dir
  end
  #--------------------------------------------------------------------------
  # * Verificação de vitória
  #--------------------------------------------------------------------------
  def orded
    for x in 0...@game['Xaxis']
      for y in 0...@game['Yaxis']
        return false unless @map[x][y] == (y*@game['Xaxis']+x+1)
      end
    end
    true
  end
  #--------------------------------------------------------------------------
  # * Retornar para cena anterior
  #--------------------------------------------------------------------------
  def return_scene
    super
    Sound.play_cancel
    @map_bgm.replay
    @map_bgs.replay
    for x in 0...@game['Xaxis']
      for y in 0...@game['Yaxis']
        @im[x][y].bitmap.dispose
        @im[x][y].dispose
        @back.dispose
      end
    end
  end
end

#==============================================================================
# ** Game_Interpreter
#------------------------------------------------------------------------------
#  Um interpretador para executar os comandos de evento. Esta classe é usada
# internamente pelas classes Game_Map, Game_Troop e Game_Event.
#==============================================================================

class Game_Interpreter
  #--------------------------------------------------------------------------
  # * Inicialização do objeto
  #     depth : profundidade
  #--------------------------------------------------------------------------
  def slide_game(index)
    $config_panel_game = index
    SceneManager.call(Scene_Panel)
  end
end

#==============================================================================
# ** Cache
#------------------------------------------------------------------------------
#  Este modulo carrega cada gráfico, cria um objeto de Bitmap e retém ele.
# Para acelerar o carregamento e preservar memória, este módulo matém o
# objeto de Bitmap em uma Hash interna, permitindo que retorne objetos
# pré-existentes quando mesmo Bitmap é requerido novamente.
#==============================================================================


module Cache
  #--------------------------------------------------------------------------
  # * Carregamento dos gráficos de batalha (piso)
  #     filename : nome do arquivo
  #     hue      : informações da alteração de tonalidade
  #--------------------------------------------------------------------------
  def self.sliding(filename)
    load_bitmap("Graphics/Sliding/", filename)
  end
end


Demo caso necessária: Download

[box class=titlebg]
Videos e Imagens
[/box]

Spoiler
[close]

Spoiler
[close]



[box class=titlebg]
Créditos e Avisos
[/box]

Raizen

Então finalmente ficou pronta a primeira parte do plano pra babação das gringa?
Postado as 6 da manhã... A ânsia era tanto de postar que nem aguentou né? Deve ter trabalhado duro... Ficou muito bom cara. Eu não testei ainda pela falta da engine, não tomei vergonha na cara ainda. De qualquer jeito parabéns, me lembra de Zelda... De pokémon, de jogos bem antigos mesmo, é um puzzle original. Mais uma vez, se superando na criatividade. Parabéns Raizen.


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


Zombie  Misty!

By:Zombie


Excelente e bem simples de configurar!! Vou usa-lo!
O mundo não se divide em pessoas boas e más. Todos temos Luz e Trevas dentro de nós...

O que importa é o lado o qual decidimos agir. Isso é o que realmente somos!

Nunca curti muito esse puzzle aí não, sempre fico com dor de cabeça xD mas o script está perfeito, é muito útil, inclusive para um projeto que estou fazendo =P
♫ Portfolio ♪
Sinta-se livre pra entrar em contato comigo quando quiser.

Tinha um puzzle desse em um Resident Evil eu acho, é sempre bom puzzles diferentes como
esses :D

Citação de: Lotmaker online 02/03/2014 às 12:54
Então finalmente ficou pronta a primeira parte do plano pra babação das gringa?
Postado as 6 da manhã... A ânsia era tanto de postar que nem aguentou né? Deve ter trabalhado duro... Ficou muito bom cara. Eu não testei ainda pela falta da engine, não tomei vergonha na cara ainda. De qualquer jeito parabéns, me lembra de Zelda... De pokémon, de jogos bem antigos mesmo, é um puzzle original. Mais uma vez, se superando na criatividade. Parabéns Raizen.


Abrçs, Ltmkr
Vlws manolo, criatividade +ou- porque é um jogo antigo shUAsh, e sim tinha no pokemão :D, no gold/silver.
Vlws vei de novo.
Citação de: Myzhuk online 02/03/2014 às 14:03
Muito bom cara haha!!!
Vlws manolo :)
Citação de: Tabby Feline online 02/03/2014 às 14:15
Excelente e bem simples de configurar!! Vou usa-lo!
Fico feliz que seja útil a alguém xD.
Citação de: Windshock online 02/03/2014 às 15:35
Nunca curti muito esse puzzle aí não, sempre fico com dor de cabeça xD mas o script está perfeito, é muito útil, inclusive para um projeto que estou fazendo =P
Ah eu gosto até kk, jogava ele no PC aqui na época que não tinha nada para fazer.
Citação de: SimonMuran online 02/03/2014 às 15:35
Tinha um puzzle desse em um Resident Evil eu acho, é sempre bom puzzles diferentes como
esses :D
Ah vlws man, no RE não lembro que parte tinha, eu me lembro do pokemon ter um desses :P.

Perfeito para cenas em que o jogador precisa de tipo: Uma senha secreta pra abrir uma porta e etc...
Também serve para muitas coisas similares. Acho que vou usar no meu jogo de mistério. Valeu por disponibilizar man.

Ah, e pokémon Gold/Silver/Crystal/Heart Gold/Soul Silver tem esse sistema aí.
No RE esse sistema é usado na parte em que o Leon se separa da Ashley e o player joga com ela. É nesse momento que ela pega tipo uma chave....resumindo, é disso que estou falando.

Caralho, Raizen ... tu tá tendo umas ideias ultimamente muito boas pra scripts, esse é um ótimo puzzle pra inserir no meio de um jogo.

Parabéns aí cara.

Finalmente em Manolo  :=|:
Esta indo te pedir a mesma coisa,este Puzzle para um jogo de terror...Muito bom modificado,e alem de tudo,fácil intendimento,obrigado por disponibilizar aqui e alem de tudo,ler minha mente :noface:.
RPG Maker Vx Ace.

Citação de: Uhtred online 03/03/2014 às 16:27
Caralho, Raizen ... tu tá tendo umas ideias ultimamente muito boas pra scripts, esse é um ótimo puzzle pra inserir no meio de um jogo.

Parabéns aí cara.
Vlws manolo, ah ideias é o que faltam shAUSh, mas de vez em quando algo bom vem a mente xD.
Citação de: TokusatsuBR online 05/03/2014 às 07:53
Finalmente em Manolo  :=|:
Esta indo te pedir a mesma coisa,este Puzzle para um jogo de terror...Muito bom modificado,e alem de tudo,fácil intendimento,obrigado por disponibilizar aqui e alem de tudo,ler minha mente :noface:.

Sabe como é né, você olhou pra mim, olhei pra você, teve aquele lance rápido e puft xD, tive a ideia kkk, bom vlws ai vei, no que precisar dele de modificações só pedir ae.
Citação de: Alisson online 02/03/2014 às 16:06
Perfeito para cenas em que o jogador precisa de tipo: Uma senha secreta pra abrir uma porta e etc...
Também serve para muitas coisas similares. Acho que vou usar no meu jogo de mistério. Valeu por disponibilizar man.

Ah, e pokémon Gold/Silver/Crystal/Heart Gold/Soul Silver tem esse sistema aí.
No RE esse sistema é usado na parte em que o Leon se separa da Ashley e o player joga com ela. É nesse momento que ela pega tipo uma chave....resumindo, é disso que estou falando.
Sim sim, acho que sim suhAsu vou ver no vid aqui do RE xD, bom ele é bem repetitivo, mas no começo do joguinho é bem divertido k, vlws pelo comment.

Script muito útil!!!  :clap: :wow: :wow: :clap:
Spoiler
+ouro
[close]
Spoiler
O que você estava esperando?
[close]

Ótimo mini game, devo usar no projeto atual.