O site está em reconstrução - obrigado pela paciência.
Aula Avançada - Entendendo o envio dos dados para o servidor513

Publicidade

Você não está conectado. Conecte-se ou registre-se

 » Criação de Jogos » Rpg Maker VX Ace » Wing MMORPG Maker » Tutoriais » 

Aula Avançada - Entendendo o envio dos dados para o servidor

Terabin


Equipe de desenvolvimento da Taberna RPG
Equipe de desenvolvimento da Taberna RPG
Introdução

Apesar da minha explicação sobre a DB do jogo ser enviada para o servidor, muitos que verificaram o código ficaram em dúvida sobre o forma como ela é enviada, é uma questão interessante, e por isso esse tópico está surgindo.

Vamos lá!
O Wing usa sockets de berkeley, para quem não conhece, leia sobre ela aqui:
/t1271-programacao-udp-e-tcp-sobre-sockets-de-berkeley

Basicamente, em uma conexão, nunca podemos assumir que TODOS os dados vão chegar inteiros quando se envia uma informação, existem vários fatores internos e externos que sempre irão gerar a chance de informação fragmentada.

O melhor exemplo é sem dúvidas o mapa.
O mapa é relativamente grande, e envia-lo de uma vez ao servidor fazia com que ele recebesse informações fragmentadas sobre o mapa e não conseguisse realizar o trabalho de salvar corretamente.

Pensando nisso, a solução para o envio de mapas foi simples, eu simplesmente dividi o envio do mapa em 4 pacotes, como podemos ver aqui:
Código:
 def self.formatpart(part)
    @cache ||= self.scan_map
    str = String_Builder.new

    if part == 1
      startx = 0
      startxend = 4
      starty = 0
      startyend = 14
    end
    
    if part == 2
      startx = 5
      startxend = 9
      starty = 0
      startyend = 14
    end
    
    if part == 3
      startx = 10
      startxend = 14
      starty = 0
      startyend = 14
    end
    
    if part == 4
      startx = 15
      startxend = 19
      starty = 0
      startyend = 14
    end
    
    str.write(part)
    str.write(startx)
    str.write(startxend)
    str.write(starty)
    str.write(startyend)
    str.write($game_map.display_name)
    
    for x in startx..startxend
      for y in starty..startyend
        str.write(@cache[x][y][:event])
        str.write(@cache[x][y][:data1])
        str.write(@cache[x][y][:data2])
        str.write(@cache[x][y][:data3])
        str.write(@cache[x][y][:data4])
        str.write($game_map.passable?(x, y, 2))
        str.write($game_map.passable?(x, y, 4))
        str.write($game_map.passable?(x, y, 6))
        str.write($game_map.passable?(x, y, 8))
      end
    end
    @cache = nil
    return str.to_s
  end

Note que essa função recebe a parte do mapa pedida, e envia. Como ela não é automatizada, ela tem um simples padrão de enviar apenas mapas no limite de 19x14. (tamanho padrão do Wing)

Essa divisão não apenas acontece com os mapas, vamos ver outro exemplo.

Código:
 def self.format50(start)
    str = String_Builder.new
    
    startend = start + 50
    startend = $data_enemies.size - 1 if startend > $data_enemies.size - 1
    
    str.write(start)
    str.write(startend)
    
    for i in start..startend
      p i
        str.write($data_enemies[i].name)
        str.write($data_enemies[i].battler_hue)
        str.write($data_enemies[i].exp)
        str.write($data_enemies[i].gold)
        str.write($data_enemies[i].note)
        
        str.write($data_enemies[i].params.size - 1)
        
        for i2 in 0..$data_enemies[i].params.size - 1
        str.write($data_enemies[i].params[i2])
        end

        str.write($data_enemies[i].drop_items.size - 1)
        
        for i2 in 0..$data_enemies[i].drop_items.size - 1
        str.write($data_enemies[i].drop_items[i2].kind)
        str.write($data_enemies[i].drop_items[i2].data_id)
        str.write($data_enemies[i].drop_items[i2].denominator)
        print $data_enemies[i].drop_items[i2].kind
        end
        
    end
    return str.to_s
  end

Esse é o envio de monstros, como são 1000 monstros enviados, eu também precisei dividir em vários lotes de 50 monstros. Assim, ele envia de 50 em 50 até chegar no 1000.

Conclusão
Trabalhar com o envio de informações muito grandes entre servidor e cliente possibilita a fragmentação da informação recebida. Por isso, devemos dividir informações muito grandes em pacotes para que tudo chegue tranquilamente.



[Você precisa estar registrado e conectado para ver esta imagem.]

"Criar jogos não é sobre como você é bom em programar, é sobre como é o mundo que você deseja passar para seus jogadores..."
Ver perfil do usuário /

1Normal Publicidade! Hoje à(s) 00:00


Nin



Permissão deste fórum:
Você não pode responder aos tópicos neste fórum

Parceiros
Centro RPG Maker Mundo RPG Maker La Communauté RPG Maker Condado Braveheart