GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

[SourceForge] JMMORPG Project

#1

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

0 Likes

#2

Boa sorte.
Vou companhar esse projeto de perto.

0 Likes

#3

Screens:



0 Likes

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

0 Likes

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

0 Likes

#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);
[/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).

0 Likes

#7

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.

0 Likes

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

Abraço.
Adriel Oliveira.

0 Likes

#9

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)

0 Likes

#10

Achei que apenas eu desse forum conhecia a serie Zelda.

0 Likes

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

0 Likes

#12

Ei…muito legal esse projeto!

0 Likes

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

0 Likes

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

0 Likes

#15

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

0 Likes

#16

ViniGodoy
O projeto Slick-SUI e FengGUI foram abandonados?

0 Likes

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

Uploaded with ImageShack.us

0 Likes

#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:

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

0 Likes

#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;
	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]
0 Likes

#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:

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

0 Likes