1 / 19

SOP aplicado em um jogo tipo de corrida usando a arquitetura cliente e servidor

SOP aplicado em um jogo tipo de corrida usando a arquitetura cliente e servidor. Alisson Rafael Appio alisson.appio@gmail.com. Descrição da Aplicação. Um jogo tipo de carrinho, onde cada usuário controla o seu carrinho (telcas up, down, left e right) Arquitetura cliente/servidor Em Java

louisa
Download Presentation

SOP aplicado em um jogo tipo de corrida usando a arquitetura cliente e servidor

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. SOP aplicado em um jogo tipo de corrida usando a arquitetura cliente e servidor Alisson Rafael Appio alisson.appio@gmail.com

  2. Descrição da Aplicação • Um jogo tipo de carrinho, onde cada usuário controla o seu carrinho (telcas up, down, left e right) • Arquitetura cliente/servidor • Em Java • Cada movimento do carrinho de um usuário é enviado aos outros usuários (clientes), mantendo um estado consistente do jogo. 2-11

  3. Descrição do Problema • Duas equipes escrevem o código do jogo. • A primeira equipe conhece os conceitos necessários para fazer um jogo (lógica de jogo e render). • A segunda equipe sabe como replicar os objetos mantendo o estado sincronizado em todos os clientes (multiplayer) • As equipes não tem acesso direto ao código da outra equipe, porém a API foi bem definida, separando a camada de jogo da camada de network • A equipe de network deve suportar os protocolos TCP/IP e UDP/IP 3-11

  4. Solução Proposta • Uma das maneiras de resolver o problema sem adicionar overhead na aplicação é usar técnicas de SOP • Usar SOP para adicionar suportede comunicação de rede (TCP e UDP)ao jogo de corrida

  5. Diagrama de classes do cliente – RENDER (entidades do domínio) 5-11

  6. Diagrama de classes do clienteModel + Render 6-11

  7. Diagrama de classe do servidor 7-11

  8. Diagrama de classes do Game Componente (usando SOP) 8-11

  9. Diagrama de classes do Server Componente (Usando SOP) 9-11

  10. Diagrama de classes do VehicleModel Componente (Usando SOP) 10-11

  11. Diagrama de componente do Server 11-11

  12. public class Game { public void run() { GameThread t = new GameThread(this, renderer); t.setDaemon(true); t.start(); } public void setMyVehicle(VehicleRender myVehicle) { this.myVehicle = myVehicle; } public void removeVehicle(VehicleRender vehicle) { vehicles.remove(vehicle); renderer.removeDrawable(vehicle); } .... } //Component - SOP public class Game { public void run() { network = ClientNetwork.instance; network.connect("localhost", 65000); network.startNetwork(); ... //initialize serializers } public void setMyVehicle(VehicleRender myVehicle) { network.send(0, METHODS.createVehicle, new NetworkCommand( NetworkCommand.CREATE)); } public void removeVehicle(VehicleRender vehicle) { if (vehicle.getModel().getOid() == getMyVehicle().getModel().getOid()) { network.send(0, METHODS.deleteVehicle, vehicle.getModel()); } } } Código Component Game

  13. public class VehicleModel { public void move(int x, int y) { this.position.move(x, y); } } //Component - SOP public class VehicleModel { public void move(int x, int y) { ClientNetwork network = ClientNetwork.instance; network.send(0, METHODS.updatePosition, this); } } Código Componente VehicleModel

  14. public class VehicleGameServer { public void addVehicle(VehicleModel vehicle, int connectionOwner){ clientsMap.put(connectionOwner, vehicle); for (Entry<Integer, VehicleModel> entry: clientsMap.entrySet()) { Integer connectionId = entry.getKey(); if (!connectionId.equals(connectionOwner)){ vehicleAdded(vehicle, connectionId); vehicleAdded(entry.getValue(), connectionOwner); } } } void vehicleAdded(VehicleModel vehicle, Integer connectionId) { // not implemente here } //Component - SOP public class VehicleGameServer { void vehicleAdded(VehicleModel vehicle, Integer connectionId) { network.send(connectionId, 0, METHODS.vehicleAdded, vehicle); } void vehicleRemoved(VehicleModel vehicle, Integer connectionId) { network.send(connectionId, 0, METHODS.vehicleDeleted, vehicle); } Código Componente GameServer

  15. public void removeVehicle(VehicleModel vehicle, int connectionOwner) { clientsMap.remove(connectionOwner); for (Entry<Integer, VehicleModel> entry: clientsMap.entrySet()) { vehicleRemoved(vehicle, entry.getKey()); } } void vehicleRemoved(VehicleModel vehicle, Integer key) { // not implemente here } public void run() { System.out.println("running"); } ..... } public void run() { try { network.startServer(65000); } catch (IOException e) { throw new RuntimeException(e); } ..... //other initialization related with network } } Código Componente GameServer (cont.)

  16. Dificuldades Encontradas • Novo paradigma de programação • Ferramenta HyperJ sem código aberto (apenas os bytecodes) • Algumas limitações da ferramenta HyperJ como, geração automática de construtor (protegidos) que não fazem parte da aplicação, problemas de acesso a atributos Java (AlgumaClasse.class), Enums, Inner-classes

  17. Demonstração da Aplicação

  18. Conclusões • Apesar das limitações da ferramenta HyperJ foi possível realizar o trabalho com sucesso, aplicando esse novo paradigma de programação • HyperJ, atualmente é a única implementação que suporta SOP em Java • Uma API bem definida torna fácil a evolução e manutenção de aplicativos que usam SOP

  19. Perguntas?

More Related