[SourceForge] JMMORPG Project - Java - GUJ
[SourceForge] JMMORPG Project
Michel.Montenegro Dezembro 2, 2015, 7:43pm #1
JMMORPG Project: https://sourceforge.net/projects/jmmorpg/
Apresentação (Autor) -
Mais de 12 anos de experiência profissional na área da Tecnologia da Informação. Bacharel em Sistemas de Informação pelo Instituto de Estudos Superiores da Amazônia - IESAM. Esta cursando sua pós-graduação em Latu Sensu em Engenharia de Sistemas pela Escola Superior Aberta do Brasil - ESAB. Participação em grandes projetos para o Estado como Transparência-Pará (Sistema Web desenvolvido com o objetivo de manter expostas as informações relacionadas aos gastos públicos de todo o estado do Pará) e o Siscon (Sistema de Controle de Auditorias, um dos sistemas pioneiros no que se refere a Órgãos de Controle Interno no País (Auditorias e Controladorias). Possui 16 cursos extracurriculares na área de T.I.
. E-mail: michel.montenegro@gmail.com
Criar um Tutorial Map, que deve ter todas as funções disponiveis para o jogo (Sistema de Lutas, Eventos, etc…), para ser o Core (Nucléo do Projeto), e no lado servidor idem, o JMMORPG deve ser a base para a criação de outros tipos de mmorpgs (Ex: Sistema de luta em modo tatics [Dofus], colisão [Tibia], etc…). Claro que vamos projetar e evoluir um jogo real para ser usado e servir como exemplo.
-> O que já existe?
Ele já tem algumas funcionalidades:
Sistema de Criação do mapa e objetos sem criar conflitos.
Exemplo de uma funcionalidade do mapa: Efeito do Heroi passar por trás de uma arvore.
Sistema de Colisão: Baseado no mapa criado pelo TiledEditor (Respeitando o padrão seguido pelo projeto), colisão em objetos não indicados no mapa TiledEditor (Ex: NPCs). falta checar com objetos moveis (Monstros).
Sistema de checagem e delimitação do mapa (Ver item 5).
Sistema de Camera:
a) A camera anda junto com o heroi
b) A camera para de acompanha-lo quando ela chega no limite do mapa
Obs: Fiz um mini-map e esta funcionando, mas vou oculta-lo já que ele deve ser desenhado depois em um GUI.
Sitema de Eventos:
Ex: O heroi chega na área do npc e aperta "barra de espaço" e dispara o evento equivalente aquele npc.
Organização baseada em -
Estates {
=> System …
=> Entity …
-----> component …
-----> Spatial …
Não preciso dizer que aceitamos colaboradores no desenvoilvimento ou "Tirando duvidas, indicar links, opinar sobre algo no projeto, etc…"
ViniGodoy Dezembro 2, 2015, 7:43pm #2
Vou companhar esse projeto de perto.
Michel.Montenegro Dezembro 2, 2015, 7:43pm #3
ViniGodoy Dezembro 2, 2015, 7:43pm #4
Legal, você usou a Slick 2D.
Mas a taxa de FPS não está meio baixa, não? Para um jogo simples como esse, numa máquina modesta, ela deveria ser 60FPS, se você estiver usando v-sync, ou mais de 300FPS, sem.
Principalmente porque suas texturas parecem bastante simples.
E no servidor, o que você está usando? É o RedDwarf?
ViniGodoy Dezembro 2, 2015, 7:43pm #5
Outra coisa, a movimentação vai ser sempre quadrada, como no zelda, ou você está pensando em deixa-la vetorial? Sua colisão é feita por pixel, ou através de bouding box?
Michel.Montenegro Dezembro 2, 2015, 7:43pm #6
Ele ta a 30FPS porque eu coloquei como limite 35.
[quote]private static final int TARGET_FRAME_RATE = 35;
container.setTargetFrameRate(TARGET_FRAME_RATE);
Obs 1: VSYNC = true;
Obs 2: Lembro que a visão humana não percebe mais do que 30fps.
Teria alguma vantagem em manter um FPS, mais alto que isso?
Usei o Slick2d(Que us LWJGL) + Artemis.
O sistema de colisão atual foi feto no braço (Usei o phys2d no começo, tive um problema com delay, descobri que nem era culpa do framework, mas como já tinha mudado, resolvi manter o sistema atual, deixando margem para mudar a qualquer momento para um sistema mais sofisticado). Por hora vou deixa-la quadrada (Mas penso em deixar vetorial sim o movimento).
Estou usando intersect entre poligonos (Estou estudando colisão por "bouding box"), junto com a imagem(objeto) crio um Poligono que o acompanha (checando as interseções com outros objetos (polignos)).
Não estou usando o "RedDwarf", por hora vai ser na mão (RMI para algumas ações e UDP para outras). Mas pretendo no minimo ver como o reddwarf vai se comportar com o projeto (Nunca o usei ou testei).
ViniGodoy Dezembro 2, 2015, 7:43pm #7
Quanto aos 24 FPS, dê uma lida:
De qualquer forma, quando for tirar Screenshots para sua engine, sugiro tirar fora toda e qualquer limitação, até para termos uma boa noção do quão eficiente a parte de desenho está. Ou para ninguém ter a impressão errada que tive.
Ou então, simplesmente retire a informação do FPS da cena.
Acho que com RMI será muito difícil que esse jogo seja um MMO. Ele será, no máximo, um jogo multiplayer (o primeiro "m" refere-se a "massive", o que exige estratégias específicas para lidar com milhares de conexões simultâneas).
Também seria bom você testar esse jogo em internet, pois o grande problema de jogos massivos é, além do congestionamento de banda e da performance do servidor, os atrasos causados pela própria rede. Contormamos isso através de Dead Reckoning, ou seja, gerando uma previsão de onde o cliente estará e deixando que o cliente comece suas ações (movimentação, ataques, etc) antes de obter uma confirmação do servidor. Caso contrário, o jogo fica "lagado" muito rapidamente, causando grande desconforto aos jogadores.
Adriel Dezembro 2, 2015, 7:43pm #8
Olá Michel.Montenegro,
Cara eu me candidato a colaborador, tenho o período da noite livre. Achei interessantíssimo, e sempre tive vontade de participar de algo do tipo. Qualquer coisa, me manda uma MP.
Adriel Oliveira.
Michel.Montenegro Dezembro 2, 2015, 7:43pm #9
Bem falado, vou lebrar disso nasproximas screens.
Vini de uma olhada neste projeto "http://www.l2jserver.com/" (Open-Source e Free) este servidor eu já vi com até 2K Players (Dizemque tem com mais), e eles usam RMI e comunicação direta via UDP (Ainda não sei, quais os casos). Ainda não passei por estes problemas em relação a comunicação to deixando 1° o lado cliente "pronto para a evolução". Mas até lá vamos resolver isso.
Quem quiser colaborar e interagir com o projeto, me adiciona.
Meu Gtalk: michel.montenegro@gmail.com
Meu Msn: michel.montenegro@gmail.com
Meu Skype: michel.montenegro (Belém - PA)
AntonioDiego Dezembro 2, 2015, 7:43pm #10
Achei que apenas eu desse forum conhecia a serie Zelda.
Michel.Montenegro Dezembro 2, 2015, 7:43pm #11
* Adicionado Transição entre Mapas:
Agora da pra criar qualquer mapa (respeitando umas regras), que o heroi pode transitar facilmente entre telas/cenarios (Ex: Mapa->Dungeon->dungeon Nivel 1…->Mapa, etc…).
No que se refere a codigo com 3 linhas se tem a mudança do mapa sem stress. ^^
Obs: Leiam a "documentacao.txt" do projeto pra conhecer os padrões.
* Adicionado Teleporte:
Em mapas grandes, podem ter pontos de teleport, e a camera acompanha o teleport do personagem (Ficando no local certo e respeitando limite do mapa).
Agora vou adicionar o sistema de coleta de itens (ex: Pegar item do chão (colher flores, recolher itens caidos, …)), mas estou na duvida em como organizar isso, pensei em organizar desta forma:
=> Entity Hero
. Component Inventario
----(Atributo) inventario(Tipo Coleção deObjects): aqui ele guardaria os objetos do chão.
----(Atributo) arma(Tipo Weapon): Adiciona dano ao ataque fisico do heroi (Por hora não vai fazer nada além de exstir rsrsrs…).
----(Atributo) escudo(Tipo Shield) … (Tipo Bota) etc…
Porém to pensando em as classes Weapons, Shields… como Componentes separados do inventario. Alguem tem alguma sugestão?
Jokabeludoido Dezembro 2, 2015, 7:43pm #12
Ei…muito legal esse projeto!
Michel.Montenegro Dezembro 2, 2015, 7:43pm #13
Obrigado, ele ta saindo aos poucos, mas o que tem ta sendo feito com cuidado. Quero qualidade e capacidade de adaptação.
To vendo se tem algo que possa trabalhar em cima, que não dependa de acesso a algum BD ou ao lado servidor, por horaquero adiantar o maximo de coisas no lado cliente.
Michel.Montenegro Dezembro 2, 2015, 7:43pm #14
Alguem aqui que já usou o reddwarf poderia me da uma mão?
Comecei a estuda-lo, em tese pretendo usa-lo no lado servidor (Vique tem jogos que o utilizam no lado servidor, vi no site dele)
Michel.Montenegro Dezembro 2, 2015, 7:43pm #15
Adicionado imagens ao projeto.
Link: https://sourceforge.net/projects/jmmorpg/
Michel.Montenegro Dezembro 2, 2015, 7:43pm #16
O projeto Slick-SUI e FengGUI foram abandonados?
Michel.Montenegro Dezembro 2, 2015, 7:43pm #17
Depois de muito sofrer, estudar, pesquisar, estou trabalhando com o Nifty-GUI ( Inclusive é usado no Jmonkeyengine para jogos 3D ).
Uma screen do UI temporario do projeto, vou modelar o scomponentes finais ainda. Vocês não fazem ideia do parto que foi isso, o NiftyGUI na versão 1.3 não tem documentação praticamente e tudo aponta pro 1.2 (MUITO diferente o 1.3).
Michel.Montenegro Dezembro 2, 2015, 7:43pm #18
Erro ao usar o metodo Render por Seção.
===>>>>> Preciso de ajuda aqui!
Estou desenhando somente a seção do mapa visivel na tela, oque ta fora não é desenhado. Ele ta funcionando direito, porém estou com um problema. De vez emquando o mapa da pulosno desenho.
Isso ocorre porque o heroi anda de 4 em 4 pixes, e sua cordenada XY tem que ser convertida em Tiles (Ex: heroPosX(128)/32= Tile 4).
Só que quando o heroi anda, o fundo (Chão) fica dando saltos. Gostaria de corrigir isto, mas nã osei como.
Eu realmente gostaria de uma ajuda nisso, com certeza não sou o unico que já passou por isso.
Informações que vão ajudar:
Heroi anda de: 4 em 4 pixels.
Screen Height: 400
-> Map (Width/Height): 100x100 Tiles
-Tiles (Width/Height): 32x32 pixels
-> Hero Sprite (Width/Height): 32x32
-> Get Hero Position:
X: transformHero.getX()
Y: transformHero.getY()
-> Get Camera-OffSet Position:
X: cameraSystem.getOffsetX()
Y: cameraSystem.getOffsetY()
* Metodo em que ocorre o problema:
public void renderMapSprites() {
cameraSystem  = world.getSystemManager().getSystem(CameraSystem.class);
int offPixelX = (int) cameraSystem.getOffsetX()*-1; // (? * -1) for positive value
int offPixelY = (int) cameraSystem.getOffsetY()*-1; // (? * -1) for positive value
int offTileX  = offPixelX/32;
int offTileY  = offPixelY/32;
int visx = 25;
int visy = 21;
this.managerMap.getTmap().render(offPixelX, offPixelY, offTileX, offTileY, visx, visy, 1 , true); //layer oceano
[quote]	/**
* Render a section of the tile map
* @param x The x location to render at
* @param y The y location to render at
* @param sx The x tile location to start rendering
* @param sy The y tile location to start rendering
* @param width The width of the section to render (in tiles)
* @param height The height of the secton to render (in tiles)
* @param l The index of the layer to render
* @param lineByLine True if we should render line by line, i.e. giving us a chance
* to render something else between lines (@see {@link #renderedLine(int, int, int)}
public void render(int x,int y,int sx,int sy,int width,int height,int l,boolean lineByLine)[/quote]
Michel.Montenegro Dezembro 2, 2015, 7:43pm #19
Aqui esta a correção do problema:
By PEJUGE
[code]	public void renderMapSprites() {
cameraSystem = world.getSystemManager().getSystem(CameraSystem.class);
Entity hero = world.getTagManager().getEntity("Hero");
Transform transformHero = transformMapper.get(hero);
int offPixelX = (int) -cameraSystem.getOffsetX();
int offPixelY = (int) -cameraSystem.getOffsetY();
offPixelX = offPixelX - offPixelX % 32;
offPixelY = offPixelY - offPixelY % 32;
int offTileX  = (offPixelX)/32;
int offTileY  = (offPixelY)/32;
int visx = 27;
//System.out.println(cameraSystem.getOffsetX()*-1 + "=" +cameraSystem.getOffsetY()*-1);
System.out.println(offPixelX + "=" + offPixelY);
System.out.println(offTileX + "-" +offTileY);
//Desenhando o mapa
this.managerMap.getTmap().render(offPixelX, offPixelY, offTileX, offTileY, visx, visy, 2, true); //layer ilha
this.managerMap.getTmap().render(offPixelX, offPixelY, offTileX, offTileY, visx, visy, 3, true); //layer obstaculos
this.managerMap.getTmap().render(offPixelX, offPixelY, offTileX, offTileY, visx, visy, 4, true); //layer enfeites
ImmutableBag<Entity> npcs = world.getGroupManager().getEntities("Group: Npc");
for(int b = 0; npcs.size() > b; b++) {
Entity npc = npcs.get(b);
Transform transformNPC = transformMapper.get(npc);
Spatial spatial = this.managerMap.getSpatials().get(npc.getId());
if (transformNPC.getX() >= 0 && transformNPC.getY() >= 0 && spatial != null) {
spatial.render(graphics);
Spatial spatial = this.managerMap.getSpatials().get(hero.getId());
if (transformHero.getX() >= 0 && transformHero.getY() >= 0 && spatial != null) {
this.managerMap.getTmap().render(offPixelX, offPixelY, offTileX, offTileY, visx, visy, 5 , true); //layer céu
Michel.Montenegro Dezembro 2, 2015, 7:43pm #20
Algumas duvidas com o lado servidor de um jogo multiplayer.
Li bastante sobre qual o melhor protocolo para um MMOG, falam muito que UDP é mais recomendado, pois o TCP pode gerar travamentos no jogo se não tiver a resposta no "Hand sShake".
Vi que existem "protocolos" mais especificos para jogos, não entendi bem isso, se alguem souber explicar melhor agradeço.
Mas estamos com outras duvidas também, são elas:
É interessante que fique uma classe(thread) rodando e capturando e enviando as informações para o/do servidor? ou dentro das outras threas ficar fazendo isso em cada metodo especifico?
Sobre o tratamento de conexões, como vocês fazem?
a) Abre conexão -> executam tarefa -> fecha a conexão (Isso pra cada tarefa exigida, mesmo as feitas por segundo como andar no mapa).
b) Abre conexão -> fica executando todas as tarefas -> Quando o jogo for finalizado fecha a conexão.
Em nosso projeto, fizemos algo basico, onde ao andar o servidor apenas checa colisão com os objetos fixos do mapa (Ex: Muros etc…), isso já esta funcionando, mas esta bem basico o codigo, usamos UPD como protocolo. Quando fomos para algo além, como pegar os dados dos outros players, ai tivemos uns problemas, inclusive tem coisas chatas como sempre vir um monte de "[][][][][]" depois do texto que enviamos e recebemos (Usamos o metodo Split da classe String, seguido de um belo FOR para separar as informações).
Isso jáesta no ar no projeto: https://sourceforge.net/projects/jmmorpg/ (Cas oalguem queira ver e testar).