Entrar
Últimos assuntos
» player não consegue andarpor lovn7 Ontem à(s) 13:33
» É possível fazer istó no game maker
por William Lima Ontem à(s) 10:56
» Rio Rise - novo launcher do Gta San Andreas SAMP Brasil
por Lua Sáb 16 Nov 2024, 20:22
» Cenario longo x Texture Pages
por josuedemoraes Sáb 16 Nov 2024, 15:31
» Kids' band
por Adilson Lucindo Santos Sex 15 Nov 2024, 12:23
» Engasgos-Troca de Sprites/animações
por josuedemoraes Ter 12 Nov 2024, 01:49
» Block Room - DEMO
por Joton Qua 06 Nov 2024, 22:58
» Game Infinito vertical (subindo)
por macmilam Sáb 26 Out 2024, 12:36
» Retorno da GMBR!!!
por Dancity Ter 22 Out 2024, 16:36
» Máquina de estados
por aminaro Qui 10 Out 2024, 13:33
» como faço pra um objeto colidir com o outro e diminuir a vida do player ?
por josuedemoraes Qui 03 Out 2024, 16:51
» RESOLVIDO: Colisão com objetos moveis
por josuedemoraes Qua 02 Out 2024, 20:28
» Crypt of the Blood Moon
por divin sphere Qua 11 Set 2024, 18:18
» como fazer um objeto seguir?
por divin sphere Dom 18 Ago 2024, 18:08
» Procuro de alguém para Modelar/Texturizar/Animar objetos 3D
por un00brn Dom 11 Ago 2024, 11:10
» Destruição de cenário (estilo DD Tank)
por CoronelZeg Sex 09 Ago 2024, 17:16
» RESOLVIDO-Como destruir uma instancia especifica de um objeto
por josuedemoraes Ter 23 Jul 2024, 00:40
» Automatizar a coleta de id
por GabrielXavier Seg 22 Jul 2024, 18:01
» Preciso de ajuda para concluir um pequeno projeto
por lmoura Qui 27 Jun 2024, 15:45
» ANGULO ACOMPANHAR O OBJETO
por Klinton Rodrigues Qui 27 Jun 2024, 08:34
» Musica reinicia quando sala reinicia
por GabrielXavier Ter 18 Jun 2024, 07:28
» como fazer uma copia de gd
por generico_cube Sex 14 Jun 2024, 15:48
» Square Adventure
por guilherme551 Ter 11 Jun 2024, 09:54
» como posso definir limite de uma variavel
por GabrielXavier Sex 07 Jun 2024, 14:14
» [Resolvido] Dúvida, colisão única de objeto
por vdm842 Sex 24 maio 2024, 09:50
[Tutorial] 39dll Tutorial - Part I
GMBR :: Ensine & Aprenda :: Tutoriais :: Game Maker
Página 1 de 1
[Tutorial] 39dll Tutorial - Part I
39dll Tutorial Part I
Luke Escude
Luke Escude
Descrição : Eu achei este tutorial sobre a 39dll no site da gmc (forum de game maker da yoyogames) , então resolvi traduzi-la e postar aqui no fórum pra ver se ajudam os usuários a entender melhor sobre esta dll , eu ainda não testei , mas pelos comentários , parece ser bom !
Então vamos começar , bom proveito e os créditos vai a Luke Escude que disponibilizou este tutorial para todos!
Obs:Tutorial traduzido ,comentários das engines traduzidas , menos as imagem , voçes mesmo terão que traduzi-las
Nível de dificuldade: Avançado
Game Maker : (Não testado em outros game maker's pelo o que eu sei)
Tutorial Original: http://www.lukeescude.com/online-tutorial/
1. A Dll
O 39dll é uma dll por 39ster (GMC), que permite aos programadores Game Maker para enviar dados de e para um servidor e um cliente. Você vê, os comandos embutidos no Game Maker, muitas vezes referida como "Mplay", são lixo completo.
A DLL 39dll vem com as bases de cliente e servidor (continue lendo)
Você vai aprender sobre apenas as porções on-line, o TCP da DLL. Ele também contém utilidades, tais como criptografia de arquivos, e algumas outras coisas que eu não quero mexer com agora. Este tutorial deve ser bastante fácil de seguir. Exemplos para download, a DLL, e uma base de cliente / servidor (todos feitos por mim, se o DLL é claro) estão disponíveis para você em todo o tutorial.
NOTA: Leia este tutorial todo. Não pense que você pode pular uma seção se você "já sabe disso."
2. O que o TCP significa?
TCP significa Transmission Control Protocol. O irmão conhecido atual do TCP é UDP, que é algo que funciona de forma diferente .. TCP será a base para a nossa comunicação com a Internet.
Um servidor, também chamado de host, é o núcleo do mundo Online. Se você pode imaginar uma roda em um carrinho de mercado, há o centro de "hub" com raios saindo para a borda. Que hub, é o servidor, neste caso.
Um cliente é o que se conecta ao servidor. É o raio da nossa roda metafórica. Abaixo está uma imagem artisticamente desenhada, que mostra as relações entre clientes e servidores:
A seta TCP pra cima mostra o upload para o servidor. Trata-se de dados transmitidos a partir do cliente para o servidor.
A seta TCP pra baixo mostra o download para o cliente.
O seu é o modelo cliente-servidor no TCP. Muito simples, certo? Nota: Dados não pode ser passado de cliente para cliente. Ele tem que ir através do servidor para chegar a outro cliente. Caso contrário, eu teria que linhas pretas que ligam os clientes.
3. O Servidor
Até agora, você deve ter uma boa compreensão do trabalho em rede TCP. Hora de sujar as mãos.
Primeiro, começar com uma base de GMK que tem todas as chamadas de função 39dll. Abaixo, há um link para a base do servidor que eu fiz para você:
ServerBase.GMK
Se você olhar para que linda coleção de scripts, você verá um monte de coisas. Para o nosso jogo online, vamos trabalhar com os comandos TCP.
O objeto Server_Init configura todo o servidor. No evento CREATE, precisamos ter o seguinte código:
- Spoiler:
- dllinit(0,true,false);
servertcp=tcplisten(8080,10,1);
No código acima, dllinit () é a função exigida pela DLL para inicializá-lo. O primeiro parâmetro, 0, significa apenas que o nome do arquivo DLL regular, "39dll.dll". O primeiro Boolean, True, significa que queremos carregar funções de soquete. Tomada basicamente significa TCP. O parâmetro final, False, é carregar utilitários. (As outras coisas eu não quero mexer com)
Então nós criamos uma variável, servertcp, que, literalmente, é a porta TCP que estamos ouvindo. O primeiro parâmetro é a porta. Para o exemplo, eu defini-lo para 8080. Por favor, alterá-lo, uma vez que alguns programas utilizam 8080. O segundo parâmetro, 10, é a quantidade máxima de conexões (jogadores) que deseja permitir conectado. Os conjuntos de um bloqueio para OFF. Não se preocupe com isso, apenas mantê-la em 1.
Agora, nosso objetivo Server_Init vai ter um evento STEP. Cada passo, ele vai verificar se há uma conexão do cliente:
- Spoiler:
- stcp = tcpaccept(servertcp,true);
if (stcp)
{
setsync(stcp,0);
o=instance_create(x,y,player);
o.tcp=stcp;
setsync(stcp,1);
}
O código acima é executado a cada passo. A STCP é uma variável temporária que armazena o cliente TCP ID. Eu vou mais para isso mais tarde. tcpaccept () aceita a conexão, o primeiro parâmetro, obviamente, objeto do servidor, ea segunda é o modo bloqueio, que vamos manter como verdadeiro.
Em seguida, o comando define setsync Bloqueio para fora. Mais uma vez, não se preocupe com o bloqueio. Pegue a minha palavra para ela.
Nosso próximo comando, faz um objeto novo jogador. (Nós não nos importamos em que o objeto é, uma vez que este é apenas o servidor). Isso é importante! No objeto de jogador, é cada função o servidor realiza para o cliente. Cada objeto representa o cliente do jogador na vida real, no computador de outra pessoa. Assim, se houver 13 pessoas ligadas ao seu servidor, haverá 13 objetos do jogador no servidor. NOTA: No cliente, sempre que enviar os dados do servidor, é objeto jogador específico é a que recebe os dados e usa-lo. Isto irá tornar-se mais evidente mais adiante.
O comando o.tcp = stcp define o objeto jogador TCP ID. Este ID TCP é como o objeto jogador sabe qual cliente ele é exclusivo para. Vou fazer outro diagrama artisticamente desenhada, com um pouco, para ajudar a visualizar tudo isso.
Outra setsync () define comando de bloqueio para fora.
Se você entender completamente o que aconteceu até agora, você está pronto para ir para o resto. Se você ainda está tendo problemas, re-ler as seções acima e olhar para as minhas habilidades de arte incríveis abaixo:
Observe como os clientes não ligar em ordem. A de cima ligado, então a uma inferior, etc
Mas você vê, cada objeto jogador é atribuído a apenas um cliente específico
Agora que você entende os fundamentos de hospedagem do servidor, e à espera de conexões, vamos dar uma olhada de perto o jogador.
O que está no evento de criação do objeto jogador realmente é inútil. Não me lembro por que eu furei a = tcp "" lá dentro. Eu acho que era para manter "tcp" um número inteiro, em vez de uma string. O que parece inútil. Quem sabe.
O evento jogador etapa é onde isso está acontecendo. Eu vou digitar o código abaixo, em seguida, explicar. Por favor, se familiarizar com a declaração Switch, bem como a declaração de interrupção. Eu vou tocar levemente sobre estes temas que vão aparecendo. Aqui está o evento STEP do objeto jogador:
- Spoiler:
- while (1) //Loop Infinito
{
msize=receivemessage(tcp);
if msize=0
{
instance_destroy()
}
if (msize <=0) break;
mid = readbyte();
switch (mid)
{
case 0:
break;
case 1:
break;
//Nada a baixo disto
}
}
O básico de um while(1) ou while(true) é um loop infinito. Nosso primeiro comando, receiveMessage (), armazena a mensagem em espera em "msize". Note, este é o lugar onde a lição que aprendemos acima se aplica. Você vê que "tcp" dentro do ()? Esse é o ID do TCP do cliente conectado atualmente associada a esse objeto jogador específico.
A próxima instrução if verifica se msize é igual a 0. Msize só vai ser igual a 0 se o jogador espontaneamente desconectado, sem nenhum motivo. Se não verificar isso, os objetos jogador iria aumentar, e nós não queremos isso.
Em seguida, a declaração, se (msize <= 0) break; basicamente faz msize certeza não tem nenhuma mensagem de espera. O reinício do comando break do loop while, para que possamos verificar novamente se há uma mensagem.
Tudo bem, aqui é onde alguma complexidade e mal-entendidos começar. A declaração mid = ReadByte () armazena o primeiro elemento da mensagem de espera, que é um byte. Este byte, na frente de todas as mensagens enviadas a partir do servidor / cliente, diz o programa para ler a mensagem. Não tem necessariamente de ser um byte. Pode ser uma string, etc Mas é necessário para que o cliente ou servidor sabe a ordem dos dados dentro da mensagem. Leia, para a próxima seção, sobre o que exatamente isso significa.
4. Estrutura de mensagens
A forma como você estrutura uma mensagem de / para o servidor / cliente é muito importante. É como você passar dados. Dados em sua mensagem deve ser enviada na ordem em que ele será lido! Esta seção irá listar os comandos para gravar informações em uma mensagem, que você vai enviar a um cliente ou servidor.
Vamos na mesma página: uma "mensagem" é um pacote de dados que você envia. Ele pode conter strings, inteiros, bytes, duplos, etc Os dados que você escreve em uma mensagem no cliente, precisa ser lido na mesma ordem no servidor. Aqui está um exemplo:
- Spoiler:
- (cliente envia a seguinte mensagem para o servidor ... Nota, todos os dados é na mesma mensagem.)
1(Este é o byte que eu estava falando acima. Ele diz ao servidor como ler a mensagem)
"Olá, meu nome é Lucas."
8675309
23,87
"O bolo é uma mentira!"
(Agora, aqui está o servidor que recebe a mensagem corretamente)
byte (Oh, olhe! Primeiro byte, 1, diz-nos que estará lendo uma string, integer, double, em seguida, uma outra string)
string
integer
double
string
Isso pode ser difícil de entender no início. Basicamente, no lado do cliente, ele está enviando uma mensagem com os seguintes dados: String, Integer, String, Double ... O servidor não tem idéia do que está dentro da mensagem, de modo que furar em que byte na frente para deixar o servidor sabe. Claro, você tem que programa para o objeto do jogador o que fazer quando recebe o byte. De qualquer forma, o byte de 1, faz a declaração do objeto jogador INTERRUPTOR ir para o CASO 1, que permite que o servidor sabe, "Hey, esse é o caso 1, então esta mensagem terá uma string, um inteiro, um casal, então, uma cadeia! "
Esta é a maneira que eu sempre estruturado lo. O byte de frente é o caso da árvore interruptor. Então, se nós voltarmos para o nosso código:
- Spoiler:
- mid = readbyte();
switch (mid)
{
case 0:
break;
case 1:
break;
//Nada abaixo daqui
}
A Variável "mid" é preenchido com aquele o primeiro byte, em seguida, ele vai para a instrução CASE que lembra o formato da mensagem. Faz sentido? Vou fornecer um exemplo de programa de bate-papo no final do tutorial que eu criei. NOTA: Os comandos DLL reais usados para adicionar dados para a mensagem será explicado depois do Recap.
5. Recap
Então, nós aprendemos que os clientes se conectam a um servidor. O servidor é o centro de todas as operações. Todos os dados que você deseja disponibilizar a todos os clientes precisa ser enviado para o servidor, o servidor irá lidar com ele de lá.
Um objeto Server_Init é necessário para iniciar a DLL, e escutar na porta do seu jogo para incomming conexões. A ligação é feita, no caso de este PASSO mesmo objecto, em seguida, um objecto jogador é criado com o ID do cliente TCP recentemente ligado.
Este objeto novo jogador é específico para apenas um cliente, o cliente que acabou de ser unidos. A variável "tcp", local para o jogador, é o ID do mesmo TCP o cliente ingressou com.
Ao enviar uma mensagem, ela precisa ser enviado exatamente como ele vai ser recebido, com os seguintes dados do byte que rege o servidor / cliente que recebe a mensagem. Este byte determina como a mensagem deve ser lida e tratada.
Então pessoal , terminei aqui a primeira parte do tutorial , talvez hoje ou amanha postarei o restante da tradução deste tutorial os tópicos 6 , 7 , 8 , 9(final) que ensinarão sobre Gravar, e leitura de uma mensagem , Enviando a mensagem e sobre o Client
Ate a próxima , e se deu algum tipo de erro ate aqui , desculpe-me não pode ajuda-los , como disso no inicio , não fui eu que criei
Abç
Tópicos semelhantes
» [Tutorial] 39dll Tutorial - Part II(Final)
» GM RPG - 1º Lição - Criando um char com movimento isométrico de RPG
» Tutorial de gml
» [Tutorial] Partículas
» Como fazer com que a view siga 2 ou mais objeto?
» GM RPG - 1º Lição - Criando um char com movimento isométrico de RPG
» Tutorial de gml
» [Tutorial] Partículas
» Como fazer com que a view siga 2 ou mais objeto?
GMBR :: Ensine & Aprenda :: Tutoriais :: Game Maker
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos