Tranquilo 
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:
-
Cada novo player logado envia suas coordenadas para os outros players!
-
As informações enviadas são recebidas e guardadas localmente!
-
Cada Player da rede é guardado como uma Entidade (Logo possui componentes (Velocity, Transform, etc…))!
-
Faço um laço aonde pego todas as entidades do grupo (“Group: PlayerNetWork”) e mando desenhar na tela!
-
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.
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:
- Coloquei o jogo dentro de um JPAINEL.
- Adicionei um jEdtText, jButton e jToggleButton.
- Ao escrever algo no jEdtText, ele automaticamente escreve DENTRO DO JOGO.
- Ao clicar no jToggleButton (Checked), ao clicar com o mouse ele vai pondo imagens (E criando entidades) estilo um Tower Defense.
- 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
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.