[SourceForge] JMMORPG Project

Tranquilo :slight_smile:

Rapaz agora vou ver como faço pra suavizar o movimento dos players da rede, ao invez de teleportarem. Com o conceito já usado no movimento do heroi acredito que isto acabei sendo tranquilo, mas vou ver isso, agor vou ver qual a melhor maneira de tratar varias entidades do mesmo tipo no Artemis, justmente para fazer o movimento suave destas antidades, lembrando que são varias entidades para ser gerenciada pelo metodo move.

Preciso de uma ideia. Mas antes vamos ao ambiente:

  1. Cada novo player logado envia suas coordenadas para os outros players!

  2. As informações enviadas são recebidas e guardadas localmente!

  3. Cada Player da rede é guardado como uma Entidade (Logo possui componentes (Velocity, Transform, etc…))!

  4. Faço um laço aonde pego todas as entidades do grupo (“Group: PlayerNetWork”) e mando desenhar na tela!

  5. Como funciona o “item 4”?

5.1 Quando o personagem tem seu movimento validado (não colide com nada), ele envia para os clientes a sua posição final.
ex:

  • É enviado o tile que ele deve estar após o movimento (“tile origem 5” -> “tile destino 6”), é enviado “tile 6” (sua posição futura).

5.2 O personagem inicia uma movimentação suave (anda até o tile indicado). Porém seu personagem que é exibido para os outros players se teleporta para a posição futura (Isto estaria correto se não fosse o teleporte).

  • Me deem uma ideia de como poderia usar o metodo move indicado aqui, de uma forma que funciona-se, para as entidades que representam os outros players (Lembrando que para reinderiza-las uso um for, porém cada uma delas tem seus componentes como o transform que possui sua posição X, Y (Inclusive se alterar este valor altera diretamente a posição dele na tela, tanto que eles se teleportam corretamente, só falta suavizar) ).

Resolvido!

A solução foi bem simples, tanto a entidade Player como o PlayerNetwork, possuem componentes comuns:

  • Velocity, responsavel pelo(a):
    . Velocidade da animação
    . Angulo da animação.

  • Transform, responsavel pelo(a):
    . PosiçãoXY atual
    . PosiçãoXY futura
    . Movimento (Parado ou andando)
    . Distancia percorrida (Enquanto andou e zerada ao estar parado)
    . Posição da Animação (Cima, Baixo, Esquerda, Direita) )

erickzanardo com certeza deve ter notado que no Transform tem basicamente os atributos necessarios para o metodo move, e foi exatamente isto que fiz, deixei que o gerenciamento da posição futura, se esta ou não andando, distancia que já percorreu enquanto moviment=true e a posição da animação na responsabilidade da propria entidade (atravez de seu component Transform). Então criei outra classe “MovimentPlayerNetWorkSystem” para gerenciar só o movimento dos players da rede (Veja o codigo abaixo).

	@Override
	protected void processEntities(ImmutableBag<Entity> playersNetwork) {
		
		if (playersNetwork!=null){
			for (int i = 0; i < playersNetwork.size(); i++) {
				Entity playerNetwork = playersNetwork.get(i);
				Transform transform = transformMapper.get(playerNetwork);
				Velocity velocity = velocityMapper.get(playerNetwork);
				move(playerNetwork, world.getDelta(), transform, velocity);
			}
		}
	}

	private float calcSpeed(int delta, float time, float pixels) {
		float returnValue = 0;

		returnValue = (pixels * delta) / time;

		return returnValue;
	}

	private void move(Entity player, int delta, Transform transform,
			Velocity velocity) {
		if (transform.isMoving()) {
			float speed = calcSpeed(delta, 1000f,
					(float) velocity.getVelocity());
			// speed = (int)speed;
			switch (transform.getPosition()) {
			case FACE_DOWN:
				transform.addY(speed);
				break;
			case FACE_LEFT:
				transform.addX(-speed);
				break;
			case FACE_RIGHT:
				transform.addX(speed);
				break;
			case FACE_UP:
				transform.addY(-speed);
				break;
			}

			transform.setDistanceTraveled(transform.getDistanceTraveled() + speed);

			if (Math.round(transform.getDistanceTraveled()) >= Util.TILE_SIZE) {
				if ((transform.getFuturePositionTileX() != Util.NO_CLICK_OR_PRESS_KEY
						&& transform.getFuturePositionTileY() != Util.NO_CLICK_OR_PRESS_KEY)) {
					transform.setLocation(transform.getFuturePositionTileX()
							* Util.TILE_SIZE, transform.getFuturePositionTileY()
							* Util.TILE_SIZE);
				}
				transform.setMoving(false);
				transform.setFuturePositionTileX(Util.NO_CLICK_OR_PRESS_KEY);
				transform.setFuturePositionTileY(Util.NO_CLICK_OR_PRESS_KEY);
				transform.setDistanceTraveled(0.0f);

			}
		}
	}

Observação: O codigo que cria/atualiza/remove as entidades relacionadas aos outros players, fica na classe InGameState. (Caso alguem queira dar uma olhada).

  • Pronto esta funcionando perfeitamente agora. :slight_smile:

Acredito que em relação a movimentação das outras criaturas da tela, devo manter omesmo principio.

Michel, em primeiro lugar parabéns pela iniciativa e pelo esforço em criar esse motor de jogo.

Mas deixa eu te perguntar uma coisa: você pretende que este projeto seja de código aberto, que aceite contribuições de outros desenvolvedores? Eu mesmo, que estudo desenvolvimento e projeto de jogos, gostaria de contribuir.

Se for assim, eu sugiro que você hospede o código no GitHub. Lá fica mais fácil um desenvolvedor fazer fork do projeto e contribuir de forma colaborativa.

Sim o projeto e de codigo aberto, meu intuito principal e fazer deste projeto algo academico e que possa ser explorado por terceiros. Sinceramente nunca usei o “GitHub” não faço nem ideia dos facilitadores ou complicadores dele.

Inclusive minha monografia vai ser sobre desenvolvimento de jogos, devo começar esta semana.

A parte do projeto que gostaria de ajuda forte é no GUI, atualmente os dois melhores são nifty-gui e o twl (Optei pelo nifty-gui, por também poder ser usado no JMonkeyEngine, se olhar na screen até já foi feito algo, mas preciso de apoio nesta parte do projeto a priori). Assim que conseguir respirar em relação as provas que to fazendo, pretendo terminar de implanatar o Spawn mob.

Estou prestes a retomar o projeto novamente, ontem a noite revisei todo o projeto e vi que a pendencia seria no GUI (Interface grafica: botões de skill, etc.)

Estava usando o nifty-gui, pensei em mudar para o TWL. Mas existe a solução que inclusive o Bruno me aconselhou e depois de conversarmos uma noite achamos interessante usarmos imagens em uma camada acima das outras e só manipular a posição do mouse para saber se clicamos em um “botão” (2 Imagens que se alternam Click\NoClick por exemplo).

Sobre isso qual a estrategia que vocês me aconselhariam a seguir?

Estou com um problema quem puder ajudar ficarei grato.

Resolvi testar como ficaria usando um GUI Swing então fiz o seguinte teste:

  1. Coloquei o jogo dentro de um JPAINEL.
  2. Adicionei um jEdtText, jButton e jToggleButton.
  3. Ao escrever algo no jEdtText, ele automaticamente escreve DENTRO DO JOGO.
  4. Ao clicar no jToggleButton (Checked), ao clicar com o mouse ele vai pondo imagens (E criando entidades) estilo um Tower Defense.
  5. Ao clicar em jButton ele só fecha o jogo.

Obs: fiz isso somente para testar.

Curiosidade: O Jogo esta literalmente dentro do Painel, inclusive o GUI do Nifty esta funcionando perfeitamente dentro dele.

Vamos ao problema apesar de tudo ter funcionado perfeitamente, algo não ficou perfeito, quando eu tiro o foco do container ele “congela” a imagem, ele NÃO para o processamento, se eu mando andar e clico no jEdit, ele pausa a imagem, mas quando devolvo o foco ele ta lá aonde deveria estar (ainda andando ou já no local), até meus amigos na rede continuam recebendo o resultado como se tivessenormal ( E esta), ele só não esta atualizando. Não sei como resolver isso e já ppassei uns dias pesquisando, se alguem tiver alguma solução ou ideia ia agradecer muito, pois fora isso, posso voltar a pensar no projeto (O Jogo em si).

* Imagem da tela quando estava testando:

Uploaded with ImageShack.us

Novas Screens do Projeto:






Eu sou da época que homens, eram homens e desenvolviam seus próprios Servidores.

Mano, tu já fez a engine no braço.

Faz o logo o servidor, ai tu já deixa otimizado do seu jeito.

Esse negocio de ficar pegando as coisas prontas é bom pra estudar,
Agora implementa o seu, precisar de ajuda com TCP,Socket, qlqr coisa tamo junto!

Abraço!

O problema é que só posso me focar em um alvo por vez, se não nada fica pronto. Graças a minha organização o projeto não morreu, inclusive esta atualizado com tecnologias recentes. Eu já terminei a versão alpha, mas só devo lançar em fevereiro, pois tenho que fazer o manual em pdf e o vídeo ensinando a usar.

Mas fazer o servidor no braço, não é uma ideia descartada, isso vai depender de N fatores, mas o meu ponto de partida é performance e resultados.