> Estrutura da aplicação Interface - Botões apresentados de acordo com os estados dos controles para movimentação manual da criatura no mundo virtual. Controle do Servidor - Mantém o socket de comunicação, a thread de leitura, buffers de entrada e saída de mensagens e comunica-se com o controle de log em qualquer entrada e saída que ocorra Controle de Log - Entidade que gerencia um buffer de texto por trás para manter as mensagens de análise da aplicação, com tokens de identificação para o tipo de mensagem a ser armazenada Controle de Criatura - Entidade que mantém informações da criatura inicializada no servidor e mensagens de comunicação com o servidor Configuração Circular - Entidade responsável por controlar uma movimentação circular da criatura, com thread particular e controle de liga e desliga que são acessíveis pela interface. > Considerações Na comunicação com o servidor, inicialmente tentei um approach pergunta-resposta, para evitar um thread e os famosos problemas de sincronização. Depois de algumas horas concluí que iria ter dificuldades para capturar mensagens do servidor que fossem enviadas sem necessariamente ser uma resposta a uma mensagem enviada anteriormente pelo cliente. Com este receito, mudei a solução para um formato semelhante ao encontrado dentro do WorldServer3D (WS3D) com thread. Uma vez que completei a abertura do socket e aguardo de mensagens, tive grande dificuldade para conseguir completar a simples tarefa de adicionar uma criatura. Ocorreu que eu não fiquei atento ao comando de leitura de linha (readLine) que precisava então de um término de linha ao escrever a mensagem pro servidor. Depois de alguns testes com as possibilidade ('\n', "\n\r", "\r\n", '\r') vi que o '\r' resolveria no Linux porém mantive o "\r\n" por compatibilidade com o Windows. Durante a dificuldade anterior, nasceu naturalmente a classe LogControl, como um singleton, para ajudar na tarefa de compreender o acontecido. Optei por enviar a saída para o depurador por comodidade. Considerei copiar na área de transferência do computador, porém imaginei que eu teria problemas de compatibilidade entre diferentes sistemas operacionais e talvez fosse necessária alguma biblioteca adicional, o que complicaria demais a tarefa. Pelo depurador, acredito que tenha resolvido de forma adequada dentro da necessidade existente. Na construção da classe de controle da criatura, a única dificuldade foi descobrir que o controle de velocidade aparentemente é de 0 a 1. Quando descobri, e mudei a velocidade de 100.0 para 1.0, então funcionou. Apesar de suportar velocidades diferentes, e a implementação permitir isso nesta versão, criei métodos que igualavam os motores por mera conveniência de teste. Portanto, a função 'setangle' foi tratada de forma completa mas usada pela aplicação com somente uma velocidade (igual em ambos os motores). A pré-configuração para andar em círculos foi um desafio próprio desenvolvido para treinar controlar a criatura de forma autônoma, mesmo que tão simplificada, e também entender melhor como travar os controles do usuário para que ele não atrapalhasse o funciona de um comportamento pré-programado. Acredito que o esforço foi válido inclusive para lidar com uma thread que orquestrava as atualizações.