[SourceForge] JMMORPG Project

Projeto (Open-Source) para a criação de MMORPGs em Java.
JMMORPG Project: https://sourceforge.net/projects/jmmorpg/

  • Apresentação (Autor) -

Michel Pinheiro Montenegro

 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

  • Objetivo-

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:
  1. 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.

  2. Sistema de Movimento.

  3. 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).

  4. Sistema de checagem e delimitação do mapa (Ver item 5).

  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.

  6. 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…”

Boa sorte.
Vou companhar esse projeto de perto.

Screens:



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?

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?

Ele ta a 30FPS porque eu coloquei como limite 35.

[quote]private static final int TARGET_FRAME_RATE = 35;

container.setTargetFrameRate(TARGET_FRAME_RATE);
[/quote]
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).

Quanto aos 24 FPS, dê uma lida:
http://www.100fps.com/how_many_frames_can_humans_see.htm

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.

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.

Abraço.
Adriel Oliveira.

ViniGodoy
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.

Adriel
te mandei uma PM.

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)

Achei que apenas eu desse forum conhecia a serie Zelda.

* 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?

Ei…muito legal esse projeto!

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.

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)

Adicionado imagens ao projeto.
Link: https://sourceforge.net/projects/jmmorpg/

ViniGodoy
O projeto Slick-SUI e FengGUI foram abandonados?

  • 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).

Uploaded with ImageShack.us

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:

* 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
	}

* Documentação

[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]

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;
	int visy = 21;
	//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, 1 , true); //layer oceano
	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) {
		   spatial.render(graphics);
	}
	
	this.managerMap.getTmap().render(offPixelX, offPixelY, offTileX, offTileY, visx, visy, 5 , true); //layer céu
}[/code]

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:

  1. É 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?

  2. 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.
    c) ???

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).