|
|
|
Autor |
Mensagem |
lucke
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 ) 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 !
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 !
(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:
| |
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":
| |
Var
Cliente : PJogador;
begin
Cliente := PJogador(Athread.Data);
FConexoes.Remove(Cliente);
Athread.Data := nil;
FreeMem(Cliente,SizeOf(TJogador));
|
Passo 7-E agora, em "OnExecute":
| |
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:
| |
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):
| |
principal, user, msg: string;
FConexoes: TList;
|
Passo 11-Declare esta função (abaixo de implementation e "{$R *.dfm}"):
| |
//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)
| |
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:
| |
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:
| |
FConexoes := TList.Create;
|
OnDestroy:
| |
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!
|
|
Qui Jul 23, 2015 3:50 pm |
|
|
conectvideo
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 |
|
|
ManoPlayForum
Usuário
Registrado: 30/10/15 Mensagens: 344
|
|
|
Sáb Out 15, 2016 8:02 pm |
|
|
|
|
|
|
|
|