GML Lição Extra - Conceitos Básicos

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

GML Lição Extra - Conceitos Básicos

Mensagem por GMBR em Seg 12 Maio 2008, 17:49

GML Lição Extra - Conceitos Básicos

GML é uma linguagem de programação, desenvolvida exclusivamente para o Game Maker.
GML é muito parecido com C, só que não tem algumas regras chatas.

Esta lição é sobre conceitos básicos, muita gente tenta aprender GML sem ter idéia de como programar.
Então vou falar rapidamente das coisas mais simples de programação, voltado para a linguagem do GM, GML.
Isto pode ser útil mesmo pra quem já conhece alguma coisa desta linguagem, ou de alguma outra.
Para muitos esta lição será muito chata e cansativa, mas entendendo isso, o resto é decorar nome de funções ...

- Variáveis
Váriáveis são, sem sombra de dúvida, a coisa mais importante de qualquer programa.
Em algumas linguagens, é necessário declará-las, como em C. Em C, pra se usar uma variável que represente, por exemplo, quantos pontos o jogador fez, é necessário declarar a variável, dizendo seu tipo e nome:
Código:
int pontos = 0;
Já em GML, não é necessário dizer o tipo, ele assume automaticamente. Em GML existem apenas dois tipos de variáveis: real e string.
O tipo real representa um número real. Exemplos:
Código:
real1 = 0
real2 = 1.25
real3 = $FFFFFF
real4 = - 1
Veja que este tipo de variável guarda todos os tipos de números: inteiros, nulos, negativos, decimais, hexadecimais, binários, etc.

Já o tipo string, guarda caracteres. Em C é bem complicado lidar com strings, mas em GML isso é bem simples. Em GML, strings podem ser limitadas com ' ' ou " ".
Exemplos:
Código:
string1 = 'Primeira String'
string2 = "2"
string3 = "Número da sorte: 13"
Veja que mesmo contendo números, continua sendo uma string, delimitada por tudo que está dentro das aspas.

É possível em GML, converter variáveis de um tipo para outro. Para isso existem duas funções: string() e real().
Darei exemplos do que elas fazem:
Código:
str = "23"
num = real(str) // real(str) => 23
show_message(str + " " + string(num)) // => "23 23"

Em algumas linguagens, principalmente as mais novas, orientadas a objeto, existe o tipo Boolean, que é usado nos ifs, por exemplo. Os Booleans assumem dois valores: true ou false.
Se você digitar true ou false, em GML, verá que existem essas variáveis. Porém não existe o tipo Boolean. Então você deve estar pensando, como que, em GML, eu digo que 5 > 2 é verdadeiro?
GML usa o tipo real para este tipo de coisa. Qualquer valor maior que 0, é considerado verdadeiro. Qualquer valor menor ou igual que 0 é considerado falso. As variáveis true e false são na verdade constantes (true = 1, false = 0).

Os operadores aritméticos (que fazem contas) em GML são: +, -, *, /, div, mod (somar, subtrair, multiplicar, dividir, divisão de inteiros, resto da divisão).

Em GML, usa-se o sinal de = para atribuir valores.
É possível usar += para somar, -= para subtrair, *= para dividir e /= para multiplicar, como em outras linguagens.
Pra quem gosta de C, em GML não existem os operadores ++ e --.
Pra quem é curioso, existem muitos outros operadores: ~, ||, &&, |, &, Happy, ^, >>, <<, que não tem muita utilidade na maioria dos jogos, e exigem um conhecimento bem maior para que se entenda eles. Um dia eu juro que faço um tutorial explicando isso. ;D

Em GML existem arrays, que podem conter real e string simultaneamente. Para mais informações sobre arrays em GML, veja este tutorial: Tutorial Básico sobre Arrays.

- Testes
Teste é o nome bonitinho do if. A palavra if significa se, isto é, você diz que certa parte do código só será executado caso determinada condição seja verdadeira.
A construção formal do if em GML é:
Código:
if <condição> then
{
<comandos>
}
else
{
<comandos>
}
Isto é:
Código:
SE <condição> ENTÃO
{
<comandos>
}
SENÃO
{
<comandos>
}
Agora, as boas notícias. O then não é necessário em nenhum caso, você só coloca se quiser. O else só é necessário caso você queira que aconteça alguma coisa caso a condição seja falsa.
Em GML a estrutura else if também funciona, como na maioria das linguagens.
Código:
if <condição> then
{
<comandos>
}
else if
{
<comandos>
}
else
{
<comandos>
}
Pra entender as condições, você deve saber da existência dos operadores de comparação (>, <, >=, <=, =, != ou <> -- maior que, menor que, maior ou igual que, menor ou igual que, igual e diferente).
Pra aproveitar mais as condições, você deve saber da existência dos operadores lógicos: E, OU e NÃO. Em GML eles são and, or e not.
Os operadores lógicos servem pra modificar as condições, reduzindo o número de ifs.

Exemplo: o herói do meu jogo só pode atirar se possuir o item arma e se tiver munição.
Código:
//Sem usar operadores lógicos (maneira idiota de fazer :P)
if ja_tem_a_arma
{
  if municao
  {
    <atirar>
  }
}

//Usando operadores lógicos (maneira esperta de fazer :) )
if ja_tem_a_arma and municao
{
  <atirar>
}
Agora ele só vai atirar caso a primeira condição E a segunda condição sejam verdadeiras.
O operador or executa o código caso uma condição OU a outra condição seja verdadeira.
O comando not inverte o valor lógico: verdadeiro vira falso e falso vira verdadeiro.

- Laço
Laço é o que alguns conhecem como loop. Um amigo meu diz que "computadores não travam, entram em loop infinito, sem condição de parada".
O laço é composto de uma condição, e um bloco de código.
A condição é avaliada, e então ele executa o bloco de código. Parece muito com um teste comum, com a diferença de que esse laço pode ser executado várias, ou infinitas vezes.
Em GML existem vários tipos de laço, então vou falar de um por um, porque é difícil dar uma definição geral.

repeat
O laço mais idiota que existe. repeat significa repetir.
Ele repete o mesmo bloco de código várias vezes:
Código:
var = 0
repeat(10)
{
var += 1
}
Ele irá somar 1 à variável var 10 vezes.

while
Esse é o principal laço. Qualquer outro laço pode ser representado através deste. while significa enquanto.
A estrutura é algo assim:
Código:
ENQUANTO <condição> FAÇA <comandos>
Exemplo:
Código:
while not keyboard_check(vk_esc)
{
  <comandos>
}
Esse laço fará os <comandos> enquanto o usuário não apertar a tecla ESC.

do ... until
É um while com a condição invertida. until significa até. Vou usar o do...until pra fazer a mesma coisa que o exemplo anterior:
Código:
do
{
  <comandos>
}
until keyboard_check(vk_esc)
A estrutura é:
Código:
FAÇA <comandos> ATÉ <condição>
Esse laço fará os <comandos> até que o usuário pressione a tecla ESC.
Note que é exatamente a mesma coisa do while, só que dito de um jeito diferente.

for
Esse também é uma espécie de while, só que com coisas a mais. É possível fazer o mesmo laço que é feito no for com o while.
O for é o laço mais usado pra quem usa o Game Maker. Na verdade basta você saber como funciona o for, os outros são desnecessários, você quase nunca vai ter que usar.
A estrutura é a seguinte:
Código:
PARA CONTADOR DE VALOR_INICIAL A VALOR_FINAL FAÇA  <comandos>
Na verdade não é bem assim, mas isso dá uma idéia do for pra várias linguagens.
Em GML, o for é como em C:
Código:
for(<comando1>; <condição>; <comando2>)
{
  <comandos>
}
Funciona assim:
Passo 1 - <comando1> é executado.
Passo 2 - <condição> é testada.
Passo 3 - Se <condição> é verdadeiro, <comandos> são executados. Se for falso, acaba o for.
Passo 4 - <comando2> é executado.
Passo 5 - Volta-se para o 2 passo.

Pode parecer complicado. Vou fazer um exemplo com for, e o mesmo exemplo usando while, que é mais fácil de entender:
Código:
for (i=0; i<3; i+=1)
{
array[i] = 0
}

Código:
i = 0 //Passo 1
while i < 3 //Passo 2
{
  array[i] = 0 //Passo 3
  i += 1 // Passo 4
} //Fim do while, volta-se ao início -> Passo 5

Estes dois laços fazem a mesma coisa. No final deles, o array terá os valores:
Código:
array[0] = 0
array[1] = 1
array[2] = 2

Vejam este outro exemplo:
Código:
for (i=0; i<6; i+=2)
{
array[i] = i
array[i+1] = i - 1
}
Ganha um crédito o primeiro que responder que valores terá o array no final do for. ;) Tente fazer de cabeça, sem ter que digitar esse código no GM pra ver o que acontece. ;D
Código:
array[0] = ?
array[1] = ?
array[2] = ?
array[3] = ?
array[4] = ?
array[5] = ?


- Seleção de casos
Este aqui é só uma maneira de economizar ifs (muitos ifs).
Vamos supor que eu tenha um menu, com três opções: "Novo Jogo", "Carregar Jogo" e "Sair". Pra saber em que posição o cursor do menu está, eu uso uma variável.
Agora, o que acontece quando o usuário aperta ENTER. Depende da posição do cursor:
//posicao_cursor é a variável que indica, adivinhe, a posição do cursor no menu Razz
Código:
if keyboard_check_pressed(vk_enter)
{
switch(posicao_cursor)
{
  case 0: //Novo Jogo
    show_message("Você escolheu a opção Novo Jogo!")
    break
  case 1: //Carregar Jogo
    show_message("Você escolheu a opção Carregar Jogo!")
    break
  case 2: //Sair
    show_message("Você escolheu a opção Sair!")
    break
  default:
    show_message("Você não escolheu nenhuma opção!")
}//Fim do switch
} //Fim do if
Acho que já dá pra entender. Ele procura o valor da variável em um dos cases. Quando ele encontra, ele executa o código até encontrar um break. Caso ele não encontre o valor em nenhum case, ele executa o que está em default.
O comando break pode ser usado também para sair de qualquer um dos loops que eu falei antes. Ele quebra qualquer laço.

-Funções e Scripts
Ambos funcionam da mesma forma. Só que as funções já vem de fábrica, já estão implementadas no GM. Os Scripts você cria, ou copia. ;D
Funções são pedaços de código que podem ser reutilizados, são meio que descartáveis. Além disso você pode passar parâmetros que alteram o modo como a função funciona.
Em GML, você só pode definir Scripts. Então, os parâmetros (ou argumentos) da sua função tem nomes pré-definidos: argument0, argument1, argument2, ... , argument15.
As funções podem apenas executar códigos, mas podem também retornar valores, com o comando return (veremos o exemplo).
Um exemplo de script para calcular distância entre dois objetos:
Script: distancia
Código:
{
  dist = sqrt(power(argument0.x-argument1.x,2)+power(argument0.y-argument1.y,2))
  return dist
}
Agora, em um código de um objeto qualquer, eu posso usar:
Código:
var = distancia(objeto1,objeto2)
Agora a variável var vai ter o valor da distância entre os objetos 1 e 2, já que eu usei o comando return para retornar o valor da variável dist no meu script.
Observação: o comando return encerra a execução do script. Depois que ele retornar o valor ele pára.

- with
with é exclusivo de GML, não conheço nada parecido em nenhuma outra linguagem, não faria muito sentido.
O with executa o código no objeto que eu disser, não necessariamente no objeto em que estou. Se eu coloco no Step do objeto1 assim:
Código:
with(objeto2)
{
direction = 90
}
Esse código irá mudar a direção do objeto2, que é o parâmetro do with, como se o código tivesse sido executado no objeto2.
Façam alguns testes e entenderão.

- Outras coisas mais
Comentários. Comentários em GML são como em C ou C++: precedidos de // ou limitados por /* */.

Constantes. As constantes pré-definidas de GML são:
Código:
true = 1
false = 0
pi = 3.1415...
Além de constantes para cores, efeitos, alinhamento de texto, etc, mas essas você aprende com o tempo.
Lembre-se que em Global Game Settings > Constants você pode definir suas próprias constantes.


Bem, é isso, aproveitem, prometo fazer mais alguns em breve.
E como eu havia dito, é um tutorial longo e cansativo, mas que os deixa mais capazes. Boa sorte com o Game Maker. ;)


Autor KJr

GMBR

Número de Mensagens : 348
Data de inscrição : 26/02/2008
Reputação : 5
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://gmbr.forumeiros.com

Voltar ao Topo Ir em baixo

Re: GML Lição Extra - Conceitos Básicos

Mensagem por Maker em Qui 12 Jun 2008, 20:53

Muito bom Ramon Wadry.

Tem muitas coisas aí que vão me ajudar muito (principalmente o "with"), agora nao vou mais precisar digitar comandos como destruição ou colisão nos 2 objs.


@ Nota 10

Maker

Número de Mensagens : 51
Data de inscrição : 09/06/2008
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Re: GML Lição Extra - Conceitos Básicos

Mensagem por TheLek em Sex 13 Jun 2008, 17:13

aew legal o tutorial mas eu nao consigo entender isso ainda =/ eu so consigo faser por aqueles quadrados que poe nos eventos, desse jeito da algum problema??

TheLek

Número de Mensagens : 16
Data de inscrição : 11/06/2008
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Re: GML Lição Extra - Conceitos Básicos

Mensagem por GMBR em Sex 13 Jun 2008, 17:21

TheLek escreveu:aew legal o tutorial mas eu nao consigo entender isso ainda =/ eu so consigo faser por aqueles quadrados que poe nos eventos, desse jeito da algum problema??
Não, nenhum ^^
Mas quando tu tiver mais avançado os conhecimentos sobre GML serão indispensáveis.

GMBR

Número de Mensagens : 348
Data de inscrição : 26/02/2008
Reputação : 5
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://gmbr.forumeiros.com

Voltar ao Topo Ir em baixo

Re: GML Lição Extra - Conceitos Básicos

Mensagem por TheLek em Sex 13 Jun 2008, 17:55

Ramon vc tem algum tuto pra jogo de plataforma no modo dos quadrados??? Very Happy

TheLek

Número de Mensagens : 16
Data de inscrição : 11/06/2008
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Re: GML Lição Extra - Conceitos Básicos

Mensagem por KinKing em Sex 13 Jun 2008, 18:26

Há o meu tutorial, TheLek, que cobre alguns dos conceitos mais básicos, e é feito com Ícones (seus quadrados). Procure-o Smile

KinKing

Número de Mensagens : 416
Data de inscrição : 29/05/2008
Reputação : 16
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://felipejoys.webnode.com

Voltar ao Topo Ir em baixo

Re: GML Lição Extra - Conceitos Básicos

Mensagem por bruno sxs em Qua 03 Dez 2008, 12:35

O GM realmente é muito bom...
e é o melhor no quesito custo/benefício... baratinho e tão poderoso... eu sempre usei mfx, depois fui pra mmf, e finalmente o mmf2...
Mas, o gm tem funções muito boas...

bruno sxs

Número de Mensagens : 3
Data de inscrição : 18/10/2008
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Re: GML Lição Extra - Conceitos Básicos

Mensagem por Lap1994 em Dom 21 Dez 2008, 10:50

Fico faltano uns aew!
break:
Para o procedimento atual e continua com o proximo procedimento:
Código:
if testanoBreak {
 blahblahblah;
 if blah?
 { break; }//Aki agente pula pro usamoBreak = true
 blahblahblah;
}
UsamoBreak=True;
Isso eh a msm coisa q
Código:
if testanoBreak {
 blahblahblah;
 if NOT blah?
 {
  blahblahblah;
 }
}
UsamoBreak=False;

Tb tem o continue(pra num dah game over XP)
O continue só pode ser usado em procedimentos while-do, do-until e for. Ele faz kinem o break, para de executar o procedimento, mas inves de ele sair do procedimento ele so executa o loop.
Código:
while blah < blahblah {
 if not blahs[blah].ehBlahMsm continue;
 with blahs[blah] do blahblahblah();
}
Eh o msm q
Código:
while blah < blahblah {
 if blahs[blah].ehBlahMsm
 {
  with blahs[blah] do blahblahblah();
 }
}
E por último tem o EXIT;
Se você tiver uma função q tiver EXIT; Qndo chegar no EXIT ela vai parar, mas o código q estava executando a função vai continuar.
Se vc colocar EXIT num código no GM ele vai parar o código. Se vc tiver dois codigos ele só para o primeiro.(Código q eu to falano eh akele negocio de arrasta naum o codigo q vc escreve)
Código:
if (ehPraUsaOEXIT) exit;
blahblahblah;
Bem simples neh? Eh o msm q
Código:
if not (ehPraUsaOEXIT){
blahblahblah;
} // Isso aki vai ateh o final do código por q o exit eh para o código o msm q o break eh pros procedimentos.

Lap1994

Número de Mensagens : 350
Idade : 22
Data de inscrição : 20/11/2008
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

http://lap1994.deviantart.com/

Voltar ao Topo Ir em baixo

Re: GML Lição Extra - Conceitos Básicos

Mensagem por carlos.grand em Seg 15 Nov 2010, 08:31

NO amigão valeu! BEm que vc poderia fazer um curso de GML e posta no site eu ate te pago pra vc me ensina a fazer GML! aguardo resposta! meu email
carlos.grand@hotmail.com

carlos.grand

Número de Mensagens : 7
Data de inscrição : 26/05/2010
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Re: GML Lição Extra - Conceitos Básicos

Mensagem por Mr. Kaleb em Seg 15 Nov 2010, 09:30

O GMBR n acessa mais o forum. Dê uma olhada no ultimo post.
Já que ele reviveu, ótimo tutorial, gostaria de ter visto ele mais cedo Very Happy, vai ajudar muitos outros também.

Mr. Kaleb

Ranking : Nota C
Número de Mensagens : 1400
Idade : 19
Data de inscrição : 07/09/2010
Notas recebidas : C
Reputação : 21
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: GML Lição Extra - Conceitos Básicos

Mensagem por Conteúdo patrocinado Hoje à(s) 14:08


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum