[SourceForge] JMMORPG Project

  • Adicionado:
    O sistema multiplayer esta funcionando, tanto no chat, quanto na exibição dos outros players logados. (O chat vai sofrer melhorias)

Nova Screen do pojeto:

Olá Michel,

Muito interessante o seu projeto.
Eu te adicionei no gtalk pra trocar umas idéias.

Abraço.

Adicionado :slight_smile:

Da uma lida neste link: [Tutorial] Instalando o projeto JMMORPG

Se tudo correr bem em breve faço outros tutoriais sobre o projeto e faço a documentação dele, mas por hora este é o principal para começar.

Muito fera cara, vou acompanhar também, parabens!!!

Você está fazendo a parte servidor e client junto?
Pergunto no sentido de, da para trocar o Slick2d por outra engine, e a parte server continuar funcionando?

[]s

Obrigado! :slight_smile:

Sim! estou fazendo junto.
Sim! O servidor é independe do cliente (Agora o cliente depende do servidor, ele não roda mais offline).

Recentemente estamos mudando o sistema de movimento para matriz, e movimentação ao estilo Dofus e Tibia (Personagem na ANIMAÇÃO anda normalmente de x em X pixels, mas pro servidor é enviado de 32 em 32 (Tamanho dos tiles)).

Na pratica da um tempo X entre o envio das atualizações do movimento ao server e não altera a animação (Anda normalmente), a colisão acaba sendo feita pela posição da matriz e não mais por interseção entre Poligonos.
Obs: Minha duvida é “Só inicio a movimentação no cliente após o servidor confirmar ou inicio a movmentação e se oservidor disser “Não” ele corrige o cliente (Isso pode fazer o char voltar derrepente para uma posição anterior, mas …)”.

Onde eu gostaria de uma ajuda forte é com o niftygui.

Lembrete: Adicionei um ssistema de avatar, agora cada personagemtem um avatar vinculado, vou postar uma screen neste post, wait…

Uploaded with ImageShack.us

[quote=Michel.Montenegro]Obrigado! :slight_smile:

Sim! estou fazendo junto.
Sim! O servidor é independe do cliente (Agora o cliente depende do servidor, ele não roda mais offline).

[/quote]

O servidor sendo indenpendente do cliente deixa mais legal ainda! hehehehehe

Eu tenho desenvolvido uma engine em Java2d, com o servidor indenpendendo podemos fazer uma integração depois. =)

Continue com o bom trabalho
[]s

Ah, que lindo, agora que vi que simplesmente parei de receber e-mails desse tópico. E ainda consto como “following”.

O problema de trocar a Slick por outra Engine, é que praticamente não existe outra engine. Daí o problema de usar Java em jogos novamente.

Além disso, é impressionante a quantidade de componentes em Java para jogos que foram desenvolvidos por um único desenvolvedor, o Kevin Glass, do site Coke and Code. Além da Slick, ele está presente em projetos como a LWJGL (base do JMonkey), JOGL, JInput, etc. O que mostra a fragilidade da plataforma Java para jogos de maneira geral.

Quanto a rede.

O UDP não tem conexão. Não é necessário abrir e fechar nada.

Em TCP, de maneira geral, abre-se uma conexão para a tarefa que se quer desempenhar (por exemplo, o chat) e só fecha quando essa tarefa termina. Se você controlar o jogo com TCP, irá abrir uma conexão no início do jogo, e fecha-la ao final. Existe um custo muitíssimo alto em abrir e fechar conexões…

No servidor, evite a criação de múltiplas threads. Threads não dão justiça para diferentes jogadores e sobrecarregam o servidor. Use os ByteBuffers e Selectors do java.nio, se for controlar no braço.

Faça a movimentação no cliente, e volte caso haja negação por parte do servidor. É melhor um pouco de “pipocation” do que lag. Qualquer tempo superior a 0,3 segundos de atraso será percebido pelo jogador e encarado como lag, caso ele pressione uma tecla e não veja a resposta.

É impressão minha ou já falei tudo isso para você em outro tópico sobre sockets e conexão?

Realmente java é pessimo para jogos… conheça a engine UDK 3 éla é o que á de melhor para desenvolver jogos na atualidade…

O servidor que estou usando e estou gostando muito é o RedDwarf, ele superou em muito minhas espectativas (Em tudo), ele basicamente cuida da parte mais problematica e me deixou livre para ver o que realmente interessa. :slight_smile:

erickzanardo

  • Me add no MSN ou Gtalk
    MSN: michel.montenegro@gmail.com
    Gtalk: michel.montenegro@gmail.com
    ps: Se tiver skype vai ser excelente “michel.montenegro”.

  • Usar Java2D puro é tenso, muito tenso, eu comecei assim no inicio e demora muito pra fazer uma besteirinha, só depois de sei lá quanto x tempo começa a melhorar, o slick 2D facilita muito deixando a parte chata para ele, o artemis é interessante por ajudar a organizar o projeto em um “world”. etc…

ViniGodoy
Então a estrtegia de movimento que comentei acima é boa? Tem algo mais que possa me falar em relação a isso que ajude?

  • Imagino que sincronizar PvP deve ser um problema, mas usando o mesmo principio da movimentação, já resolveriamos em muito isto ou me engano?
    hehehe sósobre udp e tcp falaste, o resto foi novo
    ps: muitas vezes o forum não atualiza meu email, mesmo quando marco para notificar.

luistiagos
Ainda verei o UDK 3.
Mas por hora estou com o projeto bem adiantado, e olha que estou praticamente estudando e trabalhando só nisso.

Atualmente estou com 1 questão, como vou trabalhar o sistema de batalha (Não me importo de fazer um sistema simples como o do Tibia, desde que esteja funcional), se puderem me dar uma ajuda nisso agradeço (Qualquer tipo: Conceitual ou …)
Informações:

  • Basicamente vou trabalhar só com 3 skills pilotos (1 atack fisico, 1 atack ranged (poderia ser magia ou arco, só muda a animação mesmo), 1 atack em área ).
  • Se vai ser ao estilo tátics ou tibia based, ou até outro vai ser baseado na simplicidade do mesmo (Já que estou só, prefiro fazer algo modesto que funcione e depois possa ser evoluido do que sonhar com algo que por sí só pode ser muito oneroso para um homem só rsrssr…)

[quote=Michel.Montenegro]Então a estrtegia de movimento que comentei acima é boa? Tem algo mais que possa me falar em relação a isso que ajude?

  • Imagino que sincronizar PvP deve ser um problema, mas usando o mesmo principio da movimentação, já resolveriamos em muito isto ou me engano?
    hehehe sósobre udp e tcp falaste, o resto foi novo[/quote]

Qual delas? Se for esperar o servidor, é péssima. Se for movimentar antes, é boa sim. Outra dica é vc pensar em animações mais longas para seus poderes. Nunca faça nada “imediato”, tipo um tipo de sniper, ou qualquer coisa nesse sentido. As animações, além de deixarem o jogo legal, servem como “enrolação” no lado do cliente para as mensagens trafegarem. A idéia é a seguinte, o comando vai ao servidor no momento que o jogador pressiona o botão de ataque/defesa. Mas aí vem a animaçãozinha do personagem, que dá tempo dos pacotes irem e voltarem.

Barras de vida relativas também ajudam no processo. Se os jogadores não puderem prever com exatidão quando um vai matar o outro, ou quanto de dano eles dão a cada golpe, você pode “segurar” um determinado jogador vivo até que a conexão do servidor confirme que ele morreu.

  • Vamos ver se entendi bem:

1° Caso: Movimeto.
a) Mando iniciar a animação junto com a mensagem para o servidor (Movel de oldXY(0,0) para newXY(0,32)).
b) servidor checa se a posição indicada na matriz é valida e retorna ao cliente “livre” ou “bloqueado”.
c) Se “livre” mantem a animação e prosegue com as ações, se “bloqueado” reverte a posição para oldXY(0,0).

  • Correto?

2° Caso: Enrolation.
a) o Cliente manda a mensagem informando que se movel 32pixels (Movimento de 32 em 32), isso para o servidor antecipar o movimento “final”.

b) A animação do movimento seria o enrolation, o personagem digamos leve 1 segundo para percorrer os 32px, então a mensagem para o servidor em um movimento continuo seria de 1 em 1 segundo.

  • Correto?
    Obs: Em relação ao enrolation no atack, as magias da pra gerar uma animação antes que vai garantir o enrolation, mas e nos danos fisicos como espada (Que costumam ter uma ação simples “bate”), como enrolaria ai?

3° Caso: Barras de vida: Relativa

  • Exibir as barras de HP em Porcentagem (%) seria uma saida?

  • Não exibir a HP dos inimigos ou exibir também em % resolveria isto?

  • Não exibir o dano aplicado é complicado muitas vezes o pessoal gosta de controlar a evolução do dano, como posso resolver este ponto?

4° Caso: Dano a longa distancia

  • Como seria a logica para isso? Pois o meu alvo pode ter se movido de lugar, é como a magia por exemplo teria uma delay, o alvo não estaria mais na posição inicial de onde mandei o dano. (Acho que isso se aplica até para dao corpo-a-corpo para um inimigo movél).

Agradeço a colaboração de vocês.

[quote=Michel.Montenegro]a) Mando iniciar a animação junto com a mensagem para o servidor (Movel de oldXY(0,0) para newXY(0,32)).
b) servidor checa se a posição indicada na matriz é valida e retorna ao cliente “livre” ou “bloqueado”.
c) Se “livre” mantem a animação e prosegue com as ações, se “bloqueado” reverte a posição para oldXY(0,0).[/quote]

Isso. Outra possibilidade é o “não” do server dizer “você deveria estar em other(x,y)”
E o cliente atualizar para essa posição.

Isso. A espada vc pode fazer o personagem saltar, girar, balançar, etc. Mas nem sempre se garante com enrolation. No caso, dê um dano pequeno com a espada e garanta com a técnica do “dano subjetivo”.

Normalmente os jogos resolvem colocando várias variáveis:
a) Barras de vida sem valores absolutos;
b) Além do dano, resistência ao dano, resistências especiais, tipos de danos e resistências combinados, etc;
c) Chances de miss e crítico;

O importate é o jogador não ter uma visão perfeitamente clara de quanto dano ele teria causado num golpe. Se ele tiver, não dá para disfarçar nunca.
Alguns servidores também transformam combos em um golpe só. Por exemplo, o jogador “A” vê uma sequencia de 3 golpes lindos em seu monitor, o B só se vê levando um pancadão só.

Experimente baixar um MMO qualquer moderno e joga-lo em duas máquinas, lado-a-lado. Facilmente vc perceberá as técnicas de dead reckoning. Se dois jogadores apostarem corrida, o avatar deles sempre estará na frente no seu próprio micro, e atrás no do adversário. Só com algum tempo de corrida é que o servidor dará a vantagem para o jogador mais rápido.

O servidor calcula a posição do alvo em algum momento. Se ele disser que acertou, a magia irá “perseguir” o jogador que levou a pancada.
Faça o teste em alguns MMOs. Você vai ver que isso acontece.

Entendi obrigado, conversando com uma amigo aqui, ele me falou que é comum usarem movimento do player pelo click do mouse para dar mais folego ao servidor, é mais fácil o player ficar apertando seta pra direita (Pressionando sem parar) que clicar, abordagem bem interessante, mas a movimentação pelo mouse também é importante, poderia me mandar o link de algum site que fale de como fazer o algoritimo de movimentação pelo mouse? (O personagem deve pegar sempre o melhor caminho, já levando em consideração os muros.

Você implementa a busca de caminhos através do algorítmo A*:
http://www.policyalmanac.org/games/aStarTutorial_port.htm

Eu sugiro o sistema tatics ou batalha por turno… pois este tipo de sistema aumenta a jogabilidade e é mais desafiador tendo o jogador a bolar taticas e tecnicas para derrotar o oponente e não só chegar lá e dar barrigadas nos monstros que nem no tibia este sistema classico é fraco e ultrapassado… outra vantagem seria que o “Enrolation” seria bem mais proveitoso em sistemas de batalhas deste tipo…

Não sei se vc já ouviu falar de Atlantica Online… é um rpg com ambos sistemas de turno e de tatica chamado TBS(Tatical Battle System) e é um dos melhores sistemas de batalhas de um MMORPG

A batalha por turno não funciona pra MMO, já pensou ter que esperar cada player fazer sua jogada? E tem um motivo pra não existir jogos blockbuster de turno, pouca gente tem paciência para este modo de jogar. Na minha opinião, perde o suspense, não tem o efeito surpresa.

[quote=soaresinfo][quote=luistiagos]
Eu sugiro o sistema tatics ou batalha por turno…
[/quote]

A batalha por turno não funciona pra MMO, já pensou ter que esperar cada player fazer sua jogada? E tem um motivo pra não existir jogos blockbuster de turno, pouca gente tem paciência para este modo de jogar. Na minha opinião, perde o suspense, não tem o efeito surpresa.[/quote]

veja este jogo então um mmorpg de sucesso e em turno: www.playatlantica.com

em pvp este tempo sendo meio curto funciona e ainda da pra da enfase animações de skills e ataques diferentes,
e tmb tem a possibilidade de se jogar com diversos personagens com skills distintos…

E vc acha q 2 bonecos dando barrigadas tem muito suspense?

soaresinfo
Dofus é um MMORPG Tátics, bem popular, level up que o diga.

luistiagos
Na verdade penso em um sistema de batalha do genero. Até cogitei a ideia de fazer o modo de batalha aos moldes do Pokemon/Final fantasy, onde é um pseudo-sistema de turno, mas deve ser bem interessante. Como sou apenas um (rsrsrsr…) prefiro um sistema simples que funcione a um abusivamente complexo que vou levar decadas pra terminar só.

ViniGodoy
Obrigado! Vou estudar o link que mandaste, o que notei olhando rapido agora, é que, não tem nenhuma formula base (ex: X=Y*Z+…, onde X é a …), olhando rapido parece que ele só diz o que é conceitualmente (Mas quando ler melhor vou poder confirmar), mas com certeza deve existir uma formula pra isso.

All
Recentemente o Pedro refez o sistema de movimento, e gerou um problema, ve se derrepente podem dar uma luz. Antes quando o personagem andava a camera se movia junto com ele independente da velocidade do heroi (mover de px em px). atualmente esta dando umas tremidas na tela (Entendam tremida como a camera e o heroi não estão sincronizados (Como se o herói anda-se primeiro e depois camera ou o inverso, gerando este efeito)

  • Informações Importantes.
  1. A classe “Transform” é responsavel pela posição X e Y da ANIMAÇÃO (O metodo “addY(valor)” é só um y+=valor; o mesmo vale para o addX(…))

  2. A classe “Velocity” é responsavel pela velocidade (O metodo “getVelocity()” tem o valor de quantos pixels a animação deve se mover ).

  3. O valor de “Util.tileSize” é 32 (Todos os tiles do mapa tem o valor de 32x32)

  • Logica:
  1. Quando precionamos uma tecla (seta) a informação da posição final é enviada para o servidor para validação.
    ex: Da posição X=32/y=32 moveu-se para x=64/y=32 (Andou para a direita um tile inteiro (32pixels)), porém a animação do personagem NÃO pula 32px, ela anda de N em N pixels até chegar na posição informada (ex: “x=64/y=32”).

  2. Foi criada um classe/Thread interna “MovimentSystemThread extends Thread” dentro de “MovimentSystem”, a função dela e fazer com que cada passo do personagem tenha um delay de N milissegundos, por exemplo o personagem pode levar até 1seg para mover a sua animação por 32pixels (Então por 1seg o cliente não vai enviar a mensagem de movimento ao servidor, evitando um Flood (Excesso de mensagens).
    Obs: Ele esta fazendo isto corretamente o problema é a desincronização entre o movimento do personagem e o da camera (O maximo que consegui foi deixar mais sutil a esta desincronização, entre os dois). Lembrando que antes estava funcionando perfeitamente isso, antes era assim (E funcionava):

...
if (container.getInput().isKeyDown(Input.KEY_DOWN))
{
    transform.addY(velocity.getVelocity();
}
...

Link para a classe mencionada nos exemplos acima: MovementSystem.java

  • Vou ficar realmente grato a quem puder dar uma força, estou olhando o codigo a algumas horas e não to entendendo aonde esta o problema.