Tutorial servidor multiplayer em Delphi com exemplos

 
   3D Game Builder - Índice » Tutoriais
Tutorial servidor multiplayer em Delphi com exemplos
Autor Mensagem
lucke
Novato
Novato


Registrado: 16/08/13
Mensagens: 22

Tutorial servidor multiplayer em Delphi com exemplos
Opa galera, beleza?
Depois de tanto tempo, vim aqui deixar a solução que encontrei na internet e que adaptei para o meu problema, que era desenvolver um server pros meus jogos em Delphi, porque prometi que ia postar os códigos e os exemplos (aliás, demorei um pouco Laughing) e porque não seria justo eu guardar para mim mesmo uma coisa que pode ajudar muita gente, afinal o conhecimento deve ser repassado, disponibilizado e livre pra quer quer adquiri-lo Very Happy !

Enfim, vamos lá:
O servidor foi desenvolvido em Delphi 7.

Nesse tutorial, vou ensinar como fazer um pequeno servidor de chat (bem simples) que pode ser adaptado pra qualquer situação com facilidade, basta conhecer um pouco da linguagem pascal. Vou tentar ser o mais claro possível para ajudar os iniciantes, mais caso tenham algum problema, podem postar aí nos comentários que eu vou tentar fazer o possível para ajudar Very Happy !

(OBS: Se você não sabe ou quer entender mais sobre o protocolo TCP/IP, recomendo esse link.)

Passo 1-Abra o Delphi 7:

Passo 2-Adicione um IdTCPServer (paleta Indy Servers):


Passo 3-E um IdAntiFreeze, na paleta Indy Misc.

Passo 4-Agora, no object inspector, renomeie o IdTCP na propriedade name, para "ss" e mude a propriedade DefaultPort para a porta de sua preferência:


Passo 5-Ainda no object inspector, acesse a aba "Events", e dê um duplo clique em "OnConnect", e adicione o seguinte código:
Código:

var
ClienteNovo : PJogador;
begin
GetMem(ClienteNovo,Sizeof(TJogador));
ClienteNovo.IP := Athread.Connection.Socket.Binding.PeerIP;
ClienteNovo.HostName := GStack.WSGetHostByAddr(ClienteNovo.IP);
ClienteNovo.Connection := Athread.Connection;
Athread.Data := TObject(ClienteNovo);
FConexoes.Add(ClienteNovo);

Deixando +/- desse jeito:


Passo 6-Faça o mesmo procedimento, clicando em "OnDisconnect":
Código:

Var
Cliente : PJogador;
begin
Cliente := PJogador(Athread.Data);
FConexoes.Remove(Cliente);
Athread.Data := nil;
FreeMem(Cliente,SizeOf(TJogador));

Passo 7-E agora, em "OnExecute":
Código:

var
principal, user, msg: string;
Cliente : PJogador;
begin
Cliente := PJogador(Athread.Data);
principal := Cliente.Connection.ReadLn;
user:= TextoEntre(principal, '[', ']');
msg := TextoEntre(principal, '(', ')');
Mandarmsg('(['+user+'] escreveu: '+msg+')');


Feito isso, o código do IdTcp está pronto, porém falta algumas coisas necessárias pro nosso projeto funcionar:

Passo 8-Vá no "CodeExplorer" e insira declare o uso das units "IdTCPConnection" e "IdStack" na cláusula "uses", deixando +/- assim:


Passo 9-Agora abaixo desta cláusula, adicione o seguinte código:
Código:

Type
TJogador = Record
IP : string[15];
HostName : string[40];
ThreadID: Cardinal;
Connection: TidTCPConnection;
end;
PJogador = ^TJogador;

Deixando assim:


Passo 10-Declare as variáveis globais (acima de implementation):
Código:
 
 principal, user, msg: string;
  FConexoes: TList;


Passo 11-Declare esta função (abaixo de implementation e "{$R *.dfm}"):
Código:

//Função responsável por tratar as strings passadas pelo client
function TextoEntre(Texto, Delimitador1, Delimitador2: String; CaseSensitive : boolean = false): string;
var Inicio, Fim : Integer;
      Saida : string;
begin
  // Passar o texto para variável temporária
  Saida := Texto;
  // Verificar se é sensível ao caso
  // Pegar o início
  if CaseSensitive then
    Inicio := Pos(Delimitador1, Saida)
  else
    Inicio := Pos(ansiUpperCase(Delimitador1), ansiLowerCase(Saida));
  // Verificar se localizou
  if Inicio > 0 then
    Saida := Copy(Saida, Inicio + Length(Delimitador1), Length(Saida));
  // Pegar o fim
  if CaseSensitive then
    Fim := Pos(Delimitador2, Saida)
  else
    Fim := Pos(ansiUpperCase(Delimitador2), ansiUpperCase(Saida));

  // Verificar se localizou
  if Fim > 0 then
    Saida := Copy(Saida, 1, Fim - 1);

  // retornar o resultado
  Result := Saida;
end;
//Fim Função

Foto passo 10/11:


Passo 12- Abaixo de "{Private Declarations}" declare a procedure (MandarMsg):


Passo 13 - E adicione ela no código: (pode ser embaixo da função acima)
Código:

procedure TForm1.MandarMsg(mensagem: string);
var
i : integer;
Cliente : PJogador;
begin
for I := 0 to FConexoes.Count-1 do begin
Cliente := PJogador(FConexoes.Items[i]);
Cliente.Connection.WriteLn(mensagem);
end;
end;


Passo 14 - Agora, adicione um botão (paleta Standard) e no object inspector mude a propriedade Caption para "Conectar", e depois na aba Events dê um duplo clique no evento "OnClick", e adicione o seguinte código:
Código:

if ss.Active = false then begin
ss.Active:=true;
button1.Caption:= 'Desativar';
end else begin
ss.Active:=false;
button1.Caption:= 'Ativar';
end;


Passo 15 - Vá no object inspector e selecione o form (Form1), vá na aba Events e adicione dois eventos: OnCreate e OnDestroy
OnCreate:
Código:

FConexoes := TList.Create;


OnDestroy:
Código:

FConexoes.Free;



Para finalizar o projeto delphi, vá no menu "File>Save Project As..." e escolha o diretório que deseja para salvar o projeto.Para rodar o projeto aperte [F9].

Pronto!

Não vou ensinar a parte do projeto do 3DGB porque já tem outros tutoriais disponíveis aqui para isso, porém, no exemplo, leia o arquivo "Leia-me.txt" para mais informações.
(OBS: Os códigos acima vão incluidos no exemplo, só que já "montado" para melhor compreensão de iniciantes)

>Clique aqui e baixe os exemplos<


É isso galera! Elogios, agradecimentos, sugestões e críticas, comentem aí!Espero ter ajudado! Very Happy


Qui Jul 23, 2015 3:50 pm Exibir perfil de usuários
conectvideo
Novato
Novato


Registrado: 15/10/16
Mensagens: 1

JOGO MULTIPLAYER DELPHI
estamos com um grupo no facebook sobre criar uma mesa de rpg para jogar online

a dificuldade na criação está sendo como fazer para transmitir a todos os jogadores daquela mesa o que esta sendo feito por cada personagem tipo um se moveu , soltou um feitiço etc isso tem que ser visto por todos daquela mesa em tempo real.
tens ideia de como fazer isso?

_________________
Mauricio Abreu
Sáb Out 15, 2016 12:01 pm Exibir perfil de usuários
ManoPlayForum
Usuário
Usuário


Registrado: 30/10/15
Mensagens: 344

Muito bom
Sáb Out 15, 2016 8:02 pm Exibir perfil de usuários
   3D Game Builder - Índice » Tutoriais
Página 1 de 1