sexta-feira, 19 de abril de 2013

Aprendendo RGSS do zero - Aula 10

Nesta aula veremos um exemplo prático de como fazer um sistema simples de dia e noite.
O sistema basicamente consiste em um ciclo de horas de 0 a 24 onde o tom da tela é alterado em função das horas.

- Introdução

Primeiro temos que saber onde fazer esta modificação, o script é a class Scene_Map, é lá onde é atualizado todo o mapa. Quando falo em atualizar, lembre-se do método update, e é ele que iremos modificar.

Como há momentos em que não desejamos ligar o sistema, temos que fazer uma condição para que ele só funcione se a switch estiver ligada.

Então vamos criar as variáveis globais:

$secs = 0
$mins = 0
$hours = 0
$hours_var = 1
$dn_on = 1


As três primeiras são as variáveis do tempo. A penúltima é a variável que armazena a hora, é a mesma que $hours, porém para que fique melhor utilizar em eventos, por condições fica melhor associá-la a uma variável do jogo. E a última é a switch que liga e desliga o sistema.

- Modificando o método update

Antes de modificar o método precisamos criar uma variável de velocidade do tempo, poderíamos deixar o valor 1 como velocidade assim os segundos passariam normalmente, porém como é apenas um exemplo vamos colocar um valor alto para vermos o tempo passar mais rápido.

$time_speed = 35

Crie um novo script e escreva a classe Scene_Map, não se esqueça de por a classe mãe Scene_Base por meio de herança e
copie o método update.

Agora antes do end cole o código:

if $game_switches[$dn_on]
  $secs += $time_speed
  if $secs >= 60
    $secs = 0
    $mins += 1
  end
  if $mins >= 60
    $mins = 0
    $hours += 1
  end
  if $hours >= 24
    $hours = 0
    $game_variables[$hours_var] = $hours
  end
  update_screen
end


Aqui são feitas as três condições do tempo, os segundos serão incrementados pela velocidade e ao atingirem 60 ou mais serão

zerados e os minutos serão incrementados em 1, repetindo o ciclo até que os minutos sejam igual a 60, zerando-os e incrementando as horas, que por sua vez será incrementada até chegar a 24, onde voltará a ser 0.

Chamamos o método update_screen então que é o que irá fazer a tela mudar de tonalidade.

- O método da tonalidade

Crie o método:

def update_screen
  case $hours
  when 0,1,2,3,4
    $game_map.screen.start_tone_change(Tone.new(-102,-102,-102),140)
  when 5,6,7
    $game_map.screen.start_tone_change(Tone.new(-34,-34,-34),140)
  when 8,9,10,11,12,13,14,15,16,17
    $game_map.screen.start_tone_change(Tone.new(20,10,10),140)
  when 18,19,20,21,22,23
    $game_map.screen.start_tone_change(Tone.new(-68,-68,-68),140)
  end
end


Aqui são feitas condições também para verificar qual é a hora e em sua função mudar a tonalidade. Usamos a classe Game_Map que tem uma instância da Game_Screen ($game_map.screen) a qual é a responsável pela tela do jogo, e nela há o método start_tone_change que muda a tonalidade da tela. Os argumentos são o tom e a velocidade. O tom é uma classe também, portanto temos que iniciá-la com o new e os argumentos são as cores RGB (vermelho, verde, azul) que vão de 0 a 255.

Para fazermos a condição, eu utilizei o comando case, poderíamos escrever 24 if + eslsif porém esta maneira é muito mais eficiente.

Aqui está o script completo. Para testá-lo, lembre-se de ativar a switch 1.

$secs = $mins = $hours = 0
$time_speed = 35
$hours_var = 1
$dn_on = 1


class Scene_Map < Scene_Base
 
  def update
    super
    $game_map.update(true)
    $game_player.update
    $game_timer.update
    @spriteset.update
    update_scene if scene_change_ok?
    if $game_switches[$dn_on]
      $secs += $time_speed
      if $secs >= 60
        $secs = 0
        $mins += 1
      end
      if $mins >= 60
        $mins = 0
        $hours += 1
      end
      if $hours >= 24
        $hours = 0
        $game_variables[$hours_var] = $hours
      end
      update_screen
    end
  end
 
  def update_screen
    case $hours
    when 0,1,2,3,4
      $game_map.screen.start_tone_change(Tone.new(-102,-102,-102),140)
    when 5,6,7
      $game_map.screen.start_tone_change(Tone.new(-34,-34,-34),140)
    when 8,9,10,11,12,13,14,15,16,17
      $game_map.screen.start_tone_change(Tone.new(20,10,10),140)
    when 18,19,20,21,22,23
      $game_map.screen.start_tone_change(Tone.new(-68,-68,-68),140)
    end
  end
 
end

Um comentário:

  1. Suas aulas são muito esclarecedoras! Há a possibilidade de você continuá-las?

    ResponderExcluir