Académique Documents
Professionnel Documents
Culture Documents
GAME MAKER
Versão 1.0
ESCRITORES
fUzEnRaD
Idealizador e editor
fonetico
F. Nizzio
Suadao
Kabeção
matheus.reis
1. Principais Eventos
2. Variáveis globais
I. Onde usar?
II. Nomeando variáveis globais
3. Introdução ao Draw
I. Modificando cores
II. Draw Point
III. Draw Line
IV. Draw Rectangle
V. Draw Circle
VI. Draw Triangle
VII. Draw Text
7. Recursos externos
I. Arquivos de som
II. Imagens/backgrounds
III. Sprites
8. Janelas Dinâmicas
I. Janelas com Informações
II. Adicionando o efeito fade in/out
III. Janela com botões
IV. Inserir dados
V. Efeitos com janelas
VI. Janela móvel
VII. Efeito Fade In/Out
VIII.Movimento horizontal
9. Pausando o jogo
Índice
• Apostila Livre - Game Maker :: 2010
Legendas:
- Capítulo em revisão.
Iniciante
Intermediário
Avançado
Códigos:
1. Objetos (pode ser também sprites, sons, fundos etc)
2. Comandos (qualquer comando ou variável padrão do GM)
3. Dados (número ou texto)
4. Variáveis
5. Funções
6. Comentários (parte ignorada pelo programa)
• Apostila Livre - Game Maker :: 2010
1. Principais eventos
O Game Maker possui muitos eventos, alguns podem ser substituídos por códigos, outros
não, falarei sobre os principais eventos, o básico que será usado por nós, nessa apostila.
Algumas opções abrem uma lista com novas opções, por exemplo o evento “Mouse”, essas
são variações desse evento:
Create – Usado para iniciar as variáveis, todas as variáveis que serão usadas pelo objeto
ao longo do jogo, devem ser indicadas nesse evento para evitar problemas futuros.
Alarm – Indica que determinadas funções serão ativadas em algum momento do jogo, no
Game Maker 8 (versão que trabalhamos nessa apostila) existe 12 eventos Alarm, para
ativar um dele, tem o comando:
Alarm[n]=frames
Outside Room – Aciona as funções quando o objeto sair da room, quando não for mais
visível na janela do jogo.
Game End – Ao sair do jogo, nesse evento comumente usamos funções para apagar
arquivos ou adicionar informações a ele.
Room Start – Quando a room iniciar, executa as funções, esse evento pode acontecer
mais de uma vez no jogo.
Press – Quando uma tecla for pressionada, esse commando tem 3 variações, Keyboard,
executa enquanto a tecla estiver pressionada, Keyboard Press, executa somente 1 vez
quando uma tecla for pressionada, Keyboard Released, executa quando uma tecla for
solta.
• Apostila Livre - Game Maker :: 2010
2. Variáveis globais
Variáveis globais guardam informações que o usuario escolhe. Essas informações são
salvas, podendo serem usadas em qualquer outra room. Por exemplo, o usuario escolhe
um personagem para jogar(é sobre isso que iremos trabalhar), ele clica no personagem, a
informação do personagem escolhido é guardado, e o personagem escolhido é usado em
outra room.
global.variavel
Crie um objeto. Chame-o de "pers_1". Crie o evento Other > Game Start. Agora digite o
seguinte código:
global.pers = 0;
Esse código irá setar a opção "defalt". (é tipo o que está selecionado antes do usuário
escolher)
Agora crie outro evento. O evento Mouse > Left Button. Digite o mesmo código citado
acima. Isso irá alterar o personagem selecionado para ele, se o outro estiver selecionado.
room_goto_next()
Crie outro objeto, e nomeie-o como "pers_2". Coloque o evento Mouse > Left Button,
coloque o seguinte código:
global.pers = 1;
Isso irá alterar o personagem selecionado para ele, se o outro estiver selecionado.
room_goto_next()
• Apostila Livre - Game Maker :: 2010
Crie dois objetos: o sel_1 e o sel_2. O sprite do sel_1 deve ser o sprite do pers_1, o sprite
do sel_2 deve ser do pers_2.
if global.pers = 0 {
instance_create(1,1,sel_1) }
if global.pers = 1 {
instance_create(1,1,sel_2) }
Com isso ao escolher um personagem, ele será criado na room ao iniciar o jogo.
• Apostila Livre - Game Maker :: 2010
3. Introdução ao Draw
Sempre que usarmos alguma função desse grupo, devemos inseri-los dentro do evento
Draw, caso algum dessas funções sejam inseridas em outro evento, simplesmente não
funcionará. É bem parecido com a inicialização de variáveis, onde é preciso que ela seja
criada no evento create para depois ser modificada nos outros eventos.
Atenção: Ao iniciar um evento no Draw, a sprite aplicada ao objeto não será mostrada.
Veremos como resolver isso mais adiante.
As funções de desenho se iniciam sempre com “Draw_”, é possível fazer diversas coisas,
como desenhar um retângulo, uma linha, um triângulo, entre vários outros.
draw_point(x1,y1)
draw_rectangle(x1,y1,x2,y2,linha)
draw_triangle(x1,y1,x2,y2,x3,y3,linha)
draw_circle(x1,y1,raio,linha)
//Entre outros
Quando trabalhamos com o draw, é possível modificar as cor de qualquer coisa que
tenhamos desenhado na tela, seja ele um texto, um triângulo ou um ponto! E é fácil, para
isso, usamos o código abaixo antes de escrever qualquer código de draw:
draw_set_color(cor)
Por padrão do Game Maker, se não for indicado esse comando, a cor dos elementos
desenhados na tela será preta. Para personalizar você pode colocar por exemplo uma
constante ou uma cor em hexadecimal. As cores pré-definidas são:
c_teal //Azul
c_white //Branco
c_yellow //Amarelo
Esse comando é o mais básico do draw e não tem segredos. A estrutura do código é
basicamente essa:
draw_point(x,y)
Como já foi citado, existe o comando draw_set_color que muda a cor dos comandos de
draw abaixo deste, estão, vamos fazer um teste, para que o ponto fique visível:
background_color=c_black
// muda a cor do background para preto
draw_set_color(c_white)
//muda para cor branca
draw_point(320,200)
//desenha um ponto na posição 320, 200
Agora coloque este código no evento draw de um objeto, insera-o na room e execute o
jogo, você perceberá um minúsculo ponto branco no centro da tela.
3.3 draw_line
Como o próprio nome sugere, serve para desenhar linhas com espessura equivalente a um
pixel.
draw_line(x1,y1,x2,y2)
Existe também, uma versão mais avançada dessa função, o draw_line_color, onde são
informados também, duas cores, aplicando em suas extremidades.
É possível configurar a largura da linha, mas não com uma função padrão do Game Maker,
o seguinte código expressa o que acontece (o comando For será explicado mais a frente)
for (linha=0;linha<3;linha+=1) {
draw_line_color(mouse_x+linha,mouse_y+linha,10+linha,10+linha,
c_red,c_green) }
/*linha com a espessura 3 do ponto (10,10) ate o mouse com a
gradação da cor vermelha ate a verde*/
draw_rectangle(x1,y1,x2,y2,linha)
• Apostila Livre - Game Maker :: 2010
draw_rectangle(10,10,110,110,1)
draw_rectangle(24,48,84,108,1)
draw_rectangle_color(10,10,110,110,cor1,cor2,cor3,cor4,1)
Por exemplo:
//Exemplo 1
draw_rectangle_color(0,0,150,150,c_red,c_white,c_green,c_purple,0)
//Exemplo 2
draw_rectangle_color(0,0,150,150,c_red,c_white,c_green,c_purple,1)
• Apostila Livre - Game Maker :: 2010
Exemplo 1 Exemplo 2
draw_circle(x,y,raio,linha)
draw_ellipse(x1,y1,x2,y2,linha)
draw_set_circle_precision(precisao)
O draw_circle é o mais fácil de se compreender. Esse, por sua vez, desenha um círculo
perfeito, nada de algo oval como uma elipse.
Por exemplo:
draw_circle(100,100,10,0)
Resultado:
O draw_ellipse é um pouco mais complicado, mas nem tanto, basicamente, você desenha
um retângulo invisível, e o GM por sua vez, desenha a elipse coerente com as laterais
desse retângulo. E já sabemos como desenhar um retângulo:
//Exemplo 1
draw_set_circle_precision(10)
draw_circle(100,100,10,0)
//Exemplo 2
draw_set_circle_precision(100)
draw_circle(100,100,10,0)
Exemplo 1 Exemplo 2
draw_set_circle_precision(30)
draw_circle_color(100,100,10,c_green,c_red,0)
• Apostila Livre - Game Maker :: 2010
4.1 For
É mais usado quando sabemos a quantidade exata de vezes que será executado, é
recomendado pra variáveis seqüênciais, responsável por localização na tela, mudança de
variáveis entre outros.
Você inicia uma variável em início, como pos=1, condição é responsável por garantir que o
loop continue (pode ser pos<=10), se for uma condição verdadeira (true) o for continua e
inclementa (pos+=1), porém se for falso (false), não faz nada e reinicia a variável de início
(pos=1).
Comentando:
for (pos=1; pos<=10; pos+=1) {
draw_text(x,y+pos*20,string(pos)+". "+highscore_name(pos))}
Aqui foi indicado que cada a posição vertical do texto varie conforme o valor de pos,
evitando que o texto fique sobreposto.
Parte responsável por inserir a posição na lista, cada posição terá sua indicação, ficaria
assim: "1.", "2.", "3." etc.
4.2 While
É bastante usado pra repetições grandes, ou até infinitas, usado para executar comandos
enquanto uma determinada condição for verdadeira. O comando while não é muito
recomendável quando se quer controle, como posição.
Por exemplo:
while instance_number(obj_inimigo)<100 {
instance_create(random(room_width),random(room_height),obj_inimigo)
}
4.3 Do Until
É bastante similar ao comando While, porém funciona de forma diferente, ele executa
funções até que a condição seja verdadeira.
Sua sintax é:
do {
comando
}
until condição
Por exemplo, eu tenho um jogo, onde a vida do meu personagem se regenera sozinha,
porém, bastante lenta, eu poderia resolver com o Do, assim:
do {
vida+=0.01;
}
until vida<100
Nesse exemplo, será executado "vida+=0.01" até que a condição "vida<100" seja falsa.
• Apostila Livre - Game Maker :: 2010
if place_free(x,y+2) gravity=1
//Se estiver livre de colisoes 2 pixels abaixo, a gravidade sera 1
else //caso contrario
gravity=0 //a gravidade será 0
Agora faremos com que o personagem ao andar para a esquerda caso a tecla "esquerda"
seja pressionada, para isso adicione isso ao código do Step do nosso personagem:
Pronto, agora nosso personagem já anda para a direita e esquerda, agora faremos com
que nosso personagem pule, no evento Step do nosso personagem:
Nossa movimentação está feita! Agora para o personagem não passar pelos blocos, no
objeto do bloco marque a opção "Solid" e no objeto do personagem, no evento Collision >
objeto do bloco adicione o código:
move_contact_solid(direction,12)
speed=0
TopDown é um estilo bem comum de jogos, a tradução é ‘visão para baixo’, ou seja a
câmera fica de cima, visualizando os objeto, compondo o cenário como um todo, jogos
nesse estilo são bem usuais pois permitem trabalhar com uma infinidade de jogos além de
fazer efeitos e usar recursos que tornam o jogo bem divertido.
A primeira coisa que faremos é desenhar um carrinho, que é muito simples, até porque, em
jogos Top-Down não há necessidade de desenhar gráficos para todas as posições do
carro. Primeiramente crie um sprite, nomeie-o como quiser, depois clique em Edit Sprite,
crie uma nova imagem com 24x16, como a seguir:
Agora clique duas vezes na imagem e abrirá o editor, ponha Zoom 800% e siga os
templates:
• Apostila Livre - Game Maker :: 2010
1. Faça um retângulo
2. Faça o desenho das rodas
3. Dentro dele faça outros dois, na vertical, que são os vidros do carro
Para seu carro ficar menos "quadradão", faça como nas imagens abaixo:
1. Tire as pontas
2. Ponha fárois
3. Pinte-o como preferir
Resultado:
Crie o objeto do carro, ponha como sprite o que você criou, no evento Create, arraste o
Execute Code para as ações, dentro dela coloque o seguinte:
vel_maxima = 6
aceleracao = 0.2
Define a aceleração do carro, quanto maior, menos tempo levará para alcançar a
velocidade máxima.
freio = 0.2
Define a força do freio do carro, quanto maior, menos tempo ele levará para atingir 0
quando estiver freiando.
curva = 2.5
friction = 0.07
Define quanto tempo ele levará para atingir velocidade 0 quando não estiver acelerando.
vel_maxima = 6
aceleracao = 0.2
freio = 0.2
curva = 2.5
friction = 0.07
Para que as váriaveis criadas acima tenham utilidade, você deve criar o script principal,
para isso, no evento Step, arraste o Execute Code para as ações. Dentro dele deve-se
colocar isso:
O que simplesmente fizemos foi, checar se a tecla esquerda (vk_left) foi pressionada e a
velocidade (speed) do carro é diferente de 0 (Pois um carro não pode virar parado), se sim,
o ângulo da imagem (image_angle) aumentará pela var curva do carro, que definimos no
create.
direction = image_angle
Sem isso, o ângulo da imagem mudará, mas o carro continuará andando na mesma
direção.
if keyboard_check(vk_up)
{if speed < vel_maxima{speed += aceleracao}}
• Apostila Livre - Game Maker :: 2010
Agora checamos se a tecla pra cima foi pressionada, se sim, checamos se a var speed é
menor que a var velocidade máxima (Assim, impedindo que passe do limite), se sim,
aumentamos a var speed pela var aceleração.
if keyboard_check(vk_down)
{if speed > vel_maxima*-1/2{speed -= freio}}
Agora checamos se a tecla baixo foi pressionada, se sim, checamos se a var speed é
maior que a var velocidade máxima multiplicada por -1 dividida por 2 (Se no caso,
velocidade máxima é 6, a negativa é -3), se sim, a var speed é subtraída pela var freio.
Tudo junto:
Agora, faremos uma pista usando tiles, para criar um tile é simples, mas antes criaremos o
background (o chão da room). Vá em Background e crie uma grama, se não souber como,
baixe a imagem abaixo:
Nossa pista terá medida de 128x128. Abra o Paint (ou qualquer programa do tipo) e crie
uma imagem, seu tamanho deverá ser de 128x128, como abaixo:
• Apostila Livre - Game Maker :: 2010
Vá em Resize e dobre o tamanho, para 256x256, agora crie um círculo na imagem, com as
cores que deseja para a pista:
Agora vamos às retas, crie imagens de 128x16 e 16x128, recomendo baixar as de baixo:
Agora no seu projeto, crie um Background, carregue a imagem do círculo, tire o fundo
branco em Image > Erase a Color, e marque a opção Use as tile set, e divida por 4, como
abaixo:
• Apostila Livre - Game Maker :: 2010
Resultado final:
7. Recursos externos
É relativamente fácil usar recursos externos em seus jogos, fazendo-os de forma mais
profissional e dinâmica.
Observação: Ao usar recursos externos lembre-se que mudanças externas podem ser
feitas por qualquer um, entretanto jogos com a possibilidade de modificação de alguns
recursos, podem fazer surgir layouts personalizados, playlist de músicas a escolha do
jogador entre outros.
//Sprites
sprite_add()
sprite_replace()
sprite_delete()
Eu recomendo usar o comando _add() para uso geral, no qual não existe a imagem no
source, dependendo exclusivamente do arquivo externo, o _replace() é recomendado
quando se tem uma imagem padrão caso não exista o arquivo e _delete() pra liberar a
memória do jogo, fazendo-o assim ficar mais rápido. Em geral dominar essas funções com
perfeição e harmonia requer estudo, tentativas e principalmente dedicação.
Esses comandos são muito bons para arquivos grandes, como músicas no formato mp3 ou
wav, imagens de fundo etc.
Pra começar vou carregar uma música apartir de um arquivo e então executá-la. No evento
Create (deve ser nesse evento, caso constrário o arquivo seria carregado eternamente,
travando o jogo):
dir_mus1=working_directory+"\musica.mp3"
if file_exists(dir_mus1) {
musica1=sound_add(dir_mus1,3,1)
if !sound_isplaying(musica1) sound_play(musica1)}
Nesse caso o jogo carrega o som na variável musica1 somente se o arquivo existir e toca
somente se a música já não está. O 3 representa o tipo de som, deve ter muito cuidado,
pois dependendo do formato, não funcionará corretamente. Os tipos são:
0 Sons normais (como explosões, clicks, pulos etc) geralmente no formato .wav
1 Música de fundo, formatos mid
2 Sons 3D (outro tipo de configuração)
3 Reprodução externa (como o mmplayer), formatos wma e mp3
sound_replace(snd_musica1,dir_mus1,3,1)
Tem a mesma finalidade da função anterior, porém agora será substituído o som
snd_musica1 pelo arquivo no diretório.
Em um evento qualquer, você pode indicar para liberar a memória desse arquivo, por
exemplo, Alarm[0], colocando:
• Apostila Livre - Game Maker :: 2010
if !sound_isplaying(musica1) sound_delete(musica1)
7.2 Imagens/backgrounds
Muito útil quando você pretende lançar diferentes layouts pro jogo, mudando muitas vezes
somente o background, isso abre uma enorme ramificação de possibilidades.
Seu funcionamento é muito semelhante aos sons, porém requer um pouco mais de
atenção, já que as imagens devem ter o tamanho da tela e "encaixar" no designer do jogo,
do contrário você terá um resultado "feio" visualmente.
dir_fnd1=working_directory+"\fundo.png"
if file_exists(dir_fnd1)
fundo1=background_add(dir_fnd1,0,1)
background_index[0]=fundo1
Para descartar um background, você pode indicar uma mudança de room, fica a critério,
basta inserir:
background_delete(fundo1)
7.3 Sprites
dir_sp1=working_directory+"\sprite.png"
if file_exists(dir_sp1)
sprite1=sprite_add(dir_sp1,0,0,0,0,0)
sprite_index=sprite1
Trabalha somente no objeto em que o código está, no caso será adicionado uma nova
sprite e a anterior (caso exista) será descartada.
Cuidado ao descartar uma sprite (sprite_delete), você deve indicar uma nova caso
contrário não será mostrado nada.
• Apostila Livre - Game Maker :: 2010
8. Janelas Dinâmicas
8.1 Janelas com Informações
Essa é a área que eu vou trabalhar, é uma imagem de 324x191 pixels, separada em
pequenos quadrados de 10 pixels.
A segunda parte é determinar a área das informações que serão adicionadas nessa janela,
como feito na imagem abaixo:
Feito isso, você atribui algum efeito, imagem de fundo, colorização, enfim, essa parte vai
da criatividade de cada um, nesse caso eu fiz uma montagem bem simples, no próprio
editor de sprites do Game Maker, embora simples, ficou bem agradável.
• Apostila Livre - Game Maker :: 2010
Se você quiser adicionar textos na janela, fica mais fácil pro jogador identificar o que está
contido nas regiões, no meu caso eu vou colocar só "Informações", "Dragão" e
"Personagem", que vai mostrar informações de um RPG (um exemplo):
Informações
Você está no reino de Dacrons. Encontre o treinador do centro da cidade para que ele te
ajude a treinar seu novo dragão.
Personagem
Dragão Glacial
XP: 278/350
Dragão
(Poderia ser uma imagem fixa, mas no caso o dragão será mudada ao passar do jogo, por
isso tem que ser uma imagem separada)
Finalizamos então a parte gráfica da janela, entra agora a programação. Será usado
somente 1 objeto, assim fica mais fácil atribuir efeitos de movimento, fade, ou qualquer
outro.
• Apostila Livre - Game Maker :: 2010
No evento Create do objeto, temos que identificar as variáveis que será usada na janela,
no caso são:
tahoma=font_add("Tahoma",8,0,0,32,127)
tahoma_n=font_add("Tahoma",8,1,0,32,127)
//As fontes da janela
nome_dragao="Dragao Glacial"
exper_atual=278
exper_max=350
img_dragao=sp_glacial
//Personagem
some=0
Essas variáveis são fixas, mas em um jogo elas devem se direcionadas para ler as
informações ao decorrer do jogo. Mudando a missão, a experiencia etc.
Com as variáveis já fixadas, vamos para o evento Draw, que é onde toda a "mágica" é
feita, primeiro vamos mostrar a janela do jogo (é uma sprite chamada sp_janela).
draw_sprite_ext(sp_janela,0,x,y,1,1,0,c_white,image_alpha)
//será mostrada na posição que for colocada na tela
draw_sprite_ext(img_dragao,0,x+209,y+19,1,1,0,c_white,image_alpha)
//agora a imagem do dragão, na área que ele deve aparecer
Atenção: Com o tempo vai ser muito mais fácil determinar a posição dos itens na janela,
uma solução fácil e rápida, é você colocar a janela na posição 0x0 dentro da room e usar
uma função no mouse, pra mostrar a posição X e Y atual:
Com isso você sabe o valor que deve ser adicionado a X e Y da janela para que fique no
lugar correto.
draw_set_font(tahoma)
draw_set_halign(0)
draw_text_color(x+26,y+24,msg_missao_atual,c_white,c_silver,c_white,
c_ltgray,image_alpha)
//As informações sobre a fase
draw_set_font(tahoma_n)
draw_text_color(x+217,y+138,nome_dragao + "#XP: " +
• Apostila Livre - Game Maker :: 2010
string(exper_atual)+ "/" +
string(exper_max),c_white,c_silver,c_white,c_ltgray,image_alpha)
//As informações do personagem
No evento create eu coloquei uma variável (some=0) que eu não havia explicado pra que
seria usada, pois bem, ela entra agora.
No evento Step:
if keyboard_check_pressed(ord('S')) some=1
if keyboard_check_pressed(ord('A')) some=0
if image_alpha<1 and some=0 image_alpha+=0.05
if image_alpha>0 and some=1 image_alpha-=0.05
Esse código fará com que ao pressionar a letra S do teclado, a janela desaparece e ao
apertar A ela reaparece, é um efeito bem simples, mas bem ocasional, pode ser usado em
diversos tipos de jogos.
Agora vou mostrar como posicionar botões de opção, bem parecido com o esquema
padrão do Windows. Um janela com Ok, Ok/Cancelar e Sim/Não.
Antes de tudo, vamos criar a janela, o esquema é o mesmo do outro, fazer primeiramente
um layout, só pra posicionar corretamente os itens nela.
• Apostila Livre - Game Maker :: 2010
Esse é o espaço que será usado para criar a janela, existem diversos programas
especializados para edição e criação de imagens como GIMP e Photoshop, mas é possível
fazer no próprio editor de imagens do Game Maker.
Feito isso e usando seu editor de imagens preferido, crie uma janela com alguma imagem
de fundo, com algum efeito, sombra, iluminação, enfim, aqui a sua imaginação manda.
Nesse exemplo eu fiz um efeito bem simples de metal, com uma textura bem leve, combina
com vários tipos de jogos. O espaço da mensagem da janela eu destaquei para diferenciar
das outras áreas, mas fica a critério de cada um, eu particularmente gosto de efeitos assim,
são simples, mas muito agradáveis.
A mesma coisa foi feita com os botões, colocando o mesmo efeito, mas em um tom
diferente, a terceira imagem é a segunda invertida horizontalmente e verticalmente (textura
aplicada depois).
Ao enviá-las para o Game Maker, configure a região de origem dessas sprites, do botão
para 29x10 e da Janela para 133x46, como mostrado nas imagens abaixo:
• Apostila Livre - Game Maker :: 2010
• Apostila Livre - Game Maker :: 2010
Botão: Ok
Texto: "Para que as configurações sejem aceitas, é necessário reiniciar o Jogo."
Botão: Ok/Cancelar
Texto: "Você tem certeza que deseja encerrar o aplicativo? Seu jogo será perdido."
Botão: Sim/Não
Texto: "O arquivo selecionado já existe. Deseja substituir?"
image_single=0
//Faz com que o objeto inicie com a sprite parada
tahoma_n=font_add("Tahoma",8,1,0,32,127)
//Seta a fonte usada no objeto
draw_set_font(tahoma_n)
//Chama a fonte tahoma_n
draw_set_halign(1)
//Alinhamento horizontal no centro (1)
draw_set_valign(1)
//Alinhamento vertical no centro (1)
draw_sprite_ext(sprite_index,image_single,x,y,1,1,0,c_white,
image_alpha)
//Mostra a sprite do botao
draw_text_color(x+1,y,"Ok",c_gray,c_silver,c_gray,c_silver,
image_alpha)
draw_text_color(x,y-1,"Ok",c_black,c_dkgray,c_black,c_black,
image_alpha)
//Mostra "Ok" em preto com uma sombra cinza
• Apostila Livre - Game Maker :: 2010
O mesmo com os botões Cancelar, Sim e Não, no Gm é possível duplicar um objeto, o que
ajuda bastante, mas lembre-se de alterar o texto que será mostrado no Botão, substituindo
por "Cancelar", "Sim" e "Nao" respectivamente.
É necessário agora fazer um novo objeto, com a sprite da janela para controlar os botões e
posicioná-los corretamente.
instance_create(x,y,botao_ok)
//Cria o botao iniciar
instance_create(x,y,botao_cancelar)
//Cria o botão Cancelar
tahoma_n=font_add("Tahoma",8,1,0,32,127)
//Seta a fonte do objeto
Ao criar os botões eles serão posicionados na posição X e Y da janela, mas não estão
alinhados, isso será feito no evento Step desse objeto:
with instance_nearest(x,y,botao_ok) {
x=other.x-80
y=other.y+61 }
/*Com o objeto botao_ok mais próximo, posicione
em -80 e +61.*/
with instance_nearest(x,y,botao_cancelar) {
x=other.x+80
y=other.y+61 }
/*Com o objeto botao_cancelar mais proximo,
posicione em +80 e +61.*/
• Apostila Livre - Game Maker :: 2010
draw_set_font(tahoma_n)
//Define a fonte
draw_set_halign(1)
draw_set_valign(1)
//Alinhamento horizontal e vertical no centro (1)
draw_sprite_ext(sprite_index,image_single,x,y,1,1,0,c_white,
image_alpha)
//Desenha a sprite da janela
draw_text_color(x,y,mensagem,c_black,c_dkgray,c_black,c_black,
image_alpha)
//Desenha o texto na janela
with instance_nearest(x,y,botao_ok) {
x=other.x
y=other.y+61 }
As outras janelas são exatamente a mesma coisa, só muda o texto e o botão delas, é
possível fazer algum efeito de movimento ou de Fade in/out (como feito no tutorial anterior),
tornando-as mais profissional. O grande diferencial dessas janelas é que elas não
interferem no funcionamento do jogo e é possível atribuir uma grande gama de
possibilidades.
Essa parte do tutorial será a mais usada provavelmente, pode ser usada quando o jogador
perde, para adicionar no Highscore do jogo, ou em um jogo multiplayer onde é necessário
inserir dados como Nick, IP etc. Ou até mesmo para usar em um chat em um jogo online,
tem diversas utilidades.
Atenção: É essencial seguir esse tutorial com a engine aberta, algumas funções será mais
bem entendidas se for feito um acompanhamento (jan_dinamicas3.gmk).
Novamente vamos usar a grade separada em pequenos quadrados, nesse exemplo eu vou
fazer uma janela para conexão de um jogo multiplayer, haverá 3 áreas para inserir dados
(Nick, Seu IP e Conectar ao IP) e 3 botões (Conectar e Cancelar), sobre os botões, foi visto
no exemplo anterior (Janelas com botões), por tanto não vou me aprofundar tanto nessa
parte do tutorial.
Pra finalizar eu usei uma textura de rochas e as áreas de dados um prateado bem discreto
e na janela um sombreamento bem claro (feito no editor do Game Maker), nesse exemplo
eu inseri os botões direto na janela, diferente do exemplo anterior, onde eram sprites, isso
facilita um pouco, mas impede que os botões sejem modificados de posição mais tarde.
Os botões
if image_single=0
draw_text_color(jan_mplayer.x+208,jan_mplayer.x+107,"Cancelar",
c_black,c_dkgray,c_black,c_black,image_alpha)
else
draw_text_color(jan_mplayer.x+208,jan_mplayer.x+107,"Cancelar",
c_red,c_red,c_black,c_red,image_alpha)
E do botão Conectar:
if image_single=0
draw_text_color(jan_mplayer.x+208,jan_mplayer.x+68,"Conectar",
c_black,c_dkgray,c_black,c_black,image_alpha)
else
draw_text_color(jan_mplayer.x+208,jan_mplayer.x+68,"Conectar",
c_lime,c_green,c_black,c_green,image_alpha)
A localização dos pontos foram feitas de forma diferente, nesse exemplo eu criei um objeto,
e no evento draw dele eu coloquei uma função para mostrar a localização do pontos X e Y,
então eu os posicionei no lugar correto, onde deverão aparecer, facilitou bem mais do que
• Apostila Livre - Game Maker :: 2010
a técnica anterior, onde a função para mostrar a coordenada era inserida no mouse_x e
mouse_y, o resultado foi esse:
Com a origem da janela em 0x0 e na posição 0x0 na room, esse é o valor que eu terei que
somar ao x e y da janela, para posicionar corretamente. Os valores seguidos no tutorial são
esses ai.
No evento Create do objeto jan_mplayer, foi indicado várias variáveis, as globais são o
texto que estamos modificando, são: o nick, o ip e o ip para conectar, no caso eu coloquei
uma função para detectar o ip da máquina, esse número você indica ao seu amigo para
jogar em modo multiplayer e o outro ip, é um string fixa, com o ip zero da máquina
(127.0.0.1).
instance_create(x,y,botao_conectar)
instance_create(x,y,botao_cancelar)
instance_create(x,y,barra1)
instance_create(x,y,barra2)
instance_create(x,y,barra3)
//Cria os botoes e as regioes do texto
lucida=font_add("Lucida Console",8,0,0,32,127)
global.nick="Fuzenrad"
global.seuip=mplay_ipaddress()
global.conectar="127.0.0.1"
maximo=15
//Quantidade maxima de caracteres
cursor="|"
t=1
alarm[0]=5
escolhe=0
Eu optei por substituir a fonte pela Lucida Console, pois é uma fonte em que o tamanho
físico que cada letra ocupa é indiferente de que letra seja (W ou l), isso possibilita alinhar
corretamente e determinar o espaço para o número de caracteres.
• Apostila Livre - Game Maker :: 2010
if keyboard_check_pressed(vk_backspace)
global.nick=string_delete(global.nick,string_length(global.nick),1)
if maximo-string_length(global.nick)>0 {
if keyboard_string!="" {
global.nick=string_insert(keyboard_string,global.nick,string_length(
global.nick)+1)
keyboard_string="" }} else
keyboard_string=""
É muito simples, ele só apaga o texto (com a tecla Backspace), ou insere, não é possível
copiar, colar ou selecionar, eu poderia ter me baseado em algum exemplo por ai, mas é
bastante extenso as funções para realizar isso, e acredito que para um tutorial, somente a
função básica de edição de texto já é muito útil (que é apagar e escrever).
Nos 3 objetos da área para inserir texto, ao clica, ele altera o valor da variável jan_mplayer
escolher, para assim selecionar qual janela o cursor irá editar (caso contrário, teríamos um
resultado indesejado).
O evento draw do objeto jan_mplayer é responsável por mostrar todos os itens da janela,
organizando-os de forma mais fácil.
draw_set_font(lucida)
draw_set_halign(0)
draw_set_valign(1)
draw_sprite_ext(sprite_index,image_single,x,y,1,1,0,c_white,image_al
pha)
if escolhe=1 {
mostra_nick=global.nick+cursor } else
mostra_nick=global.nick
if escolhe=2 {
mostra_ip=global.seuip+cursor } else
mostra_ip=global.seuip
if escolhe=3 {
mostra_conectar=global.conectar+cursor } else
mostra_conectar=global.conectar
draw_text_color(jan_mplayer.x+28,jan_mplayer.y+30,mostra_nick,
c_black,c_dkgray,c_black,c_black,image_alpha)
draw_text_color(jan_mplayer.x+28,jan_mplayer.y+68,mostra_ip,
c_black,c_dkgray,c_black,c_black,image_alpha)
draw_text_color(jan_mplayer.x+28,jan_mplayer.y+108,mostra_conectar,
c_black,c_dkgray,c_black,c_black,image_alpha)
• Apostila Livre - Game Maker :: 2010
• Apostila Livre - Game Maker :: 2010
No caso da variável cursor, o evento Alarm é responsável por alterar entre "|" e "" (vazio),
se código é:
switch t=0
{
case 0:{cursor="|" t=0} break;
case 1:{cursor="" t=1} break;
}
alarm[0]=5
Ele alterna a variável t, e para o resultado 0, mostra o cursor, para o resultado 1, oculta.
E por fim, o evento Destroy, é responsável por destruir todos os objetos relacionados a
janela, evitando problemas futuros.
with instance_nearest(x,y,botao_conectar) {
instance_destroy()}
with instance_nearest(x,y,botao_conectar) {
instance_destroy()}
with instance_nearest(x,y,barra1) {
instance_destroy()}
with instance_nearest(x,y,barra2) {
instance_destroy()}
with instance_nearest(x,y,barra3) {
instance_destroy()}
O resultado final, creio eu, foi o melhor dos outros 2 exemplos, o botão ficou bem
personalizado com coloração, com esse sistema é possível fazer, como eu já citei, a área
onde será inserido o nome do jogador para adicionar em um highscore, ou no menu
principal, uma janela pro jogador informar o nome, não sei, fica a critério.
• Apostila Livre - Game Maker :: 2010
Para não estender muito essa parte do apostila, vou pular uma parte da criação das
janelas, pode ser visto em Janelas com botões.
É um recurso muito legal, não só para janelas, mas para objetos em geral do jogo,
dependendo claro do fundamento do jogo, entretanto mover um objeto não é apenas
atribuir x=mouse_y e y=mouse_y no evento Left Button, isso faz com que o objeto "salte"
para a posição do mouse e deve ser evitado.
Para mover de forma correta, é preciso criar uma variável com a posição "relativa" do
objeto ao mouse, onde a diferença das posições é que será adicionada ao objeto quando
este for clicado, dessa forma, seja qual for a área do objeto que você clicar, ele move
considerando-o como ponto de origem.
x_relativo=x-mouse_x
• Apostila Livre - Game Maker :: 2010
y_relativo=y-mouse_y
Atribuimos isso ao evento Step, para que seja uma variável atualizada.
x=x_relativo+mouse_x
y=y_relativo+mouse_y
Para mover vários objetos ao mesmo tempo, temos que usar a função with, que controla
outros objetos:
with instance_nearest(x,y,botao1) {
x=other.x-80
y=other.y+75 }
Com o objeto botao1 mais próximo, mova-o, ao mesmo tempo que o botão é corretamente
posicionado na janela.
Veja jan_movel1.gmk.
É um efeito simples, mas bem usual, para aplicá-lo, basta controlarmos a variável
image_alpha e atribuí-la a todos os objetos envolvidos ao objeto.
image_alpha=-0.5
apaga=0
A variável image_alpha inicia em -0.5 para que tenha uma diferença entre a criação e o
surgimento dela na tela, bem mínima, milisegundos. E iniciamos a variável apaga, que
usaremos mais adiante.
Do mesmo modo que fizemos no exemplo anterior, controlando objetos com o with, mas
desta vez com o image_alpha:
Quando a variável apaga for true (ou 1) e image_single for maior que zero ou quando
apaga for false (ou 0) e image_single for menor que 1.5, a janela desaparecerá e
aparecerá respectivamente.
jan_movel.apaga=1
Faz a janela surgir da esquerda até estar na posição que ela foi criada.
x_antigo=x
move=1
x=room_width+150
Isso indica que enquanto a posição atual do objeto não for menor ou igual a posição inicial
do objeto (associada à x_antigo) será subtraído 10 pixels a cada frame.
9. Pausando o jogo
Em quase todos os estilos de jogos, é necessário ter um Pause, muitas vezes pelo Game
Maker não ter uma função pré-definida pra isso, fica um pouco difícil fazer com outras
funções. Embora não de forma prática, o Game Maker possui uma maneira para
"Travar/Pausar" o jogo:
screen_refresh()
keyboard_wait()
io_clear()
O screen_refresh atualiza a janela do jogo. keyboard_wait faz com que tenha uma
espera do teclado e nenhuma tecla pressionada seja considerada. E por último io_clear,
IO quer dizer Input/Output (Entrada/Saída) e tem a função de zerar a variável de tecla ou
mouse informado anteriormente.
Basicamente, basta adicionar o código acima citado, em um evento do tipo Keyboard (Veja
capítulo 1), preferencialmente P para que ao ser executado, o jogo pause. Para teste,
vamos fazer aparecer uma imagem com a mensagem "Pause", quando o jogo estiver
pausado.
Primeiro criamos um evento qualquer, com algum movimento, apenas para representar que
o jogo está em andamento, pode ser um movimento circular, uma sprite com várias sub-
imagens etc, nesse exemplo eu usei no evento Step o código:
image_angle+=21
direction+=5
speed=3
Isso faz com que o ângulo da imagem aumente constantemente 25º, a direção 5 e o speed
seja constantemente 5, gerando um movimento circular regular.
x=room_width/2
y=room_height/2
mostra=0
• Apostila Livre - Game Maker :: 2010
if keyboard_check(ord('P')) {
mostra=1
draw_sprite(sprite_index,0,x,y)
screen_refresh()
keyboard_wait()
io_clear()}
else mostra=0
Fazendo com que ao pressionar a letra P, mostre tenha agora o valor 1, mostre a sprite e
finalmente pause o jogo, ao soltar a tecla P, mostra volta ao seu valor inicial, que é 0.
if mostra draw_sprite(sprite_index,0,x,y)
O jogo será pausado com a letra P, sem interferir nos objetos e sem complicações, a
imagem pode ser custumizada, pode ser usado em qualquer tipo de jogo, não trás
problemas de execução.
O 3D no Game Maker ainda é bem limitado e falta muitas ferramentas que por padrão
deveriam estar disponíveis. Embora tudo isso possa ser contornado com uso de DLLs e
scripts que tem aos montes feitos pelos próprios usuários do programa, você precisara
sempre pesquisar para expandir o que pode ser feito em seu jogo.
O computador do programador deve ter pelo menos uma boa placa de vídeo pois o uso de
muitas texturas de tamanho grande podem não funcionar causando o famoso erro
“Unexpected error occurred when running the game” que na maioria das vezes é
causado porque o jogo está usando um recurso da placa de vídeo que não existe ou
usando mais memória do computador do que ele realmente tem.
Considerando também que não vamos fazer uma obra de arte que custará milhões e
centenas de pessoas para ser feita em três anos... É como dizem: “O limite e a criatividade
do criador.”
Existem muitos tipos de conceitos para explicar o 3D, mas falarei apenas do mais usado.
A visão da tela apenas com o X e Y aparenta estar de pé, onde X vai para os lados e Y
para cima ou para baixo.
Mas ao inserir a terceira dimensão percebemos que na verdade a visão esta deitada, pois
Z representa a profundidade.
• Apostila Livre - Game Maker :: 2010
Quanto maior o Z mais alto o ponto vai estar e quanto menor mais baixo ou profundo o
ponto.
A terceira dimensão não tem nada de complicado. Basta lembrar que ela é a profundidade,
volume ou altura enquanto as outras duas são a largura e o comprimento.
Agora vamos iniciar uma engine. A cada aula diferente você ira completá-la cada vez mais
até que o resultado final seja algo parecido com um jogo de corrida.
Por enquanto vamos só aprender a desenhar um cubo na tela.
Abra o GM e vamos começar!
Todo jogo precisa de algo que controle o que o jogador irá ver.
Crie um novo objeto e nomeio como objCamera.
Agora temos que ativar o modo 3D e definir as configurações iniciais.
No evento Create do objCamera coloque:
d3d_start();
d3d_set_perspective(true);
d3d_set_hidden(true);
Esse é muito útil pois fará com que todos as superfícies desenhadas atrás de outro objeto
não apareçam.
• Apostila Livre - Game Maker :: 2010
d3d_set_fog(true,c_white,1,1200);
Fog é uma espécie de neblina. Todo que estiver a 1200 pixels da visão do jogador será
escondido por ela.
d3d_set_culling(false);
O culling faz a parte de dentro dos objetos, ou seja, o lado de trás das textura não serem
desenhados. Se a câmera olhar de dentro de um cubo, as paredes do cubo ficam
invisíveis.
d3d_set_shading(false);
Shading significa sombreamento. Ele melhora a qualidade do efeito da luz nos objetos mas
como não usar iluminação nesse exemplo deixe-o como false.
texture_set_interpolation(true);
draw_set_color(c_white)
z=48;
Todos os objetos tem uma variável x e y por padrão. Mas o z terá sempre que ser criado
manualmente. Defina como 48 porque a câmera ficara um pouco acima do chão.
d3d_set_projection(x,y,z,obj1.x,obj1.y,obj1.z,0,0,1);
Vou explicar essa função de um jeito mais completo na próxima aula pois o objetivo aqui é
apenas ensinar a desenhar um cubo na tela.
Agora crie outro objeto. Ele será o cubo. Nomeio como obj1.
No evento Create defina:
z = 0;
A variável z.
tex = background_get_texture(background0);
d3d_draw_block(x-16,y-16,z-16,x+16,y+16,z+16,tex,1,1)
Com isso desenho cada lado com 32 pixels, defino a textura dele e os dois últimos valores
são quantas vezes a textura vai se repetir nas paredes do cubo.
Existem duas funções que usamos para definir como o mundo será visto:
d3d_set_projection(xfrom,yfrom,zfrom,xto,yto,zto,xup,yup,zup);
d3d_set_projection_ext(xfrom,yfrom,zfrom,xto,yto,zto,xup,yup,zup,ang
le,aspect,znear,zfar);
Fazer com que entendam cada argumento será bem complicado, mas eu gosto que tudo
seja explicado então prestem bastante atenção e façam testes com cada parâmetro..
d3d_set_projection_ext(xfrom,yfrom,zfrom,xto,yto,zto,xup,yup,zup,ang
le,aspect,znear,zfar)
xup,yup,zup – esses argumentos são definidos apenas como false ou true. Neles você
especifica o eixo em que a projeção gira. Exemplo:
Você ainda está olhando para o computador.
Levante ou abaixe a cabeça. Pronto! Você acabou de girar a visão em torno do eixo y.
Agora mexa a cabeça para direita ou para a esquerda. Pronto! Você acabou de girar a
visão em torno do eixo z.
Girar em torno do eixo x seria como rodar a cabeça em torno de si mesma olhando sempre
pra fentre.
angle – este não tem nada a ver com o ângulo da visão e muita gente se confundi com ele.
Aqui você deve definir a largura da câmera em graus. Exemplo:
As lentes dos óculos são medidas em graus lembra? Quanto maior o grau, mas as
imagens são aumentadas.
Você já viu aquelas câmera que quanto se gira a lente o zoom aumenta ou diminui? Então!
O efeito desse argumento é o mesmo.
Quanto maior o valor de angle, maior vai ser o zoom “natural” da projeção.
Um padrão razoável é 45° mas eu estou usando 90° em meus projetos.
znear,zfar – de znear a zfar é a região que será desenhada pela câmera. Por exemplo:
znear é 1 e zfar é 10000. Tudo que estiver entre o pixel 1 e o pixel 10000 da projeção será
desenhado. Tudo que estiver fora dessas coordenadas não será desenhando.
Nessa figura a primeira linha vertical representa o znear e a segunda linha vertical o zfar.
Tudo o que há na parte azul será desenhado e tudo o que há na parte cinza não será
desenhando.
Essa função é extremamente útil, pois podemos desenhar textos e imagens na tela sem
dificuldades.
d3d_set_projection_ortho(x,y,w,h,angle)
x,y,w,h – essa é a região ou tamanho da tela. Note que se for diferente do tamanho da
view o que for desenhado na tela vai se esticar em relação a view.
angle – gira o que for desenhado. O ponto de origem é por padrão o meio da area que
você definiu.
draw_set_color(c_black);
d3d_set_projection_ortho(0,0,view_width,view_height,0);
d3d_set_hidden(false);
draw_text(10,10,'FPS: ' + string(fps));
d3d_set_hidden(true);
Essa função deve vir sempre antes de d3d_set_projection_ext ou a cena não será
desenhada direito.
Abra a engine que começamos na aula 1. Você também pode baixar o source clicando
aqui.
tex2 = background_get_texture(background1);
No evento Draw:
• Apostila Livre - Game Maker :: 2010
d3d_draw_floor(0,0,0-16,room_width,room_height,0-16,tex2,5,5);
Agora abra o objCamera e vamos definir todos as variáveis necessários para controlar o
movimento no evento Create:
// Movimento da camera
z = 0; // ponto z
dx = 0; // armazena movimento x da câmera
dy = 0; // armazena movimento y da câmera
dz = 0; // armazena movimento z da câmera
px = 0; // ponto x para onde se esta olhando
py = 0; // ponto y para onde se esta olhando
pz = 0; // ponto z para onde se esta olhando
zoom = 400;
zang = 0; // angulo horizontal da camera
yang = 0; // angulo vertical da camera
// Definir posição do mouse
window_mouse_set(200,200);
// Sem cursor
window_set_cursor(cr_none);
zang é igual a posição x do mouse -200 dividido por 8. Isso retorna quantos pixels o mouse
se moveu em x.
yang é igual a posição y do mouse -200 dividido por 8. Isso retorna quantos pixels o mouse
se moveu em y.
O valor 8 é a sensibilidade do mouse. Quanto menor mais rápido o movimento vai ficar.
A função window_mouse_set defini a posição do mouse novamente depois de já achar os
ângulos.
A ultima linha de código faz com que yang nunca passe de -89 a 89, ou seja, quanto a
câmera estiver em cima ou embaixo do objeto seu ângulo vertical não mudará mais.
// Animação da camera
// normalizar vetores
// torna movimento da camera totalmente esferico.
m=sqrt(sqr(dx)+sqr(dy)+sqr(dz));
dx/=m;
dy/=m;
dz/=m;
Coseno, seno e tangente são operações matemáticas para achar pontos de acordo com
um ângulo.
cos retorna quantos pixels o x terá que se mover para estar naquele ângulo.
sin retorna quantos pixels o y terá que se mover para estar no mesmo ângulo que x (ângulo
vertical).
E tan retorna quantos pixels o z terá que se mover para estar de acordo com o ângulo
vertical.
Por ultimo em tenho que normalizar dx, dy e dz para que o movimento gire de forma
perfeitamente esférica em torno do personagem.
Não tem muito o que explicar disso. Aquilo é uma operação para não deixar que o zoom
mude automaticamente dependendo do ângulo.
// Zoom
if keyboard_check(vk_add) zoom += 4;
if keyboard_check(vk_subtract) zoom -= 4;
Ao multiplicar os valores que acho com cos, sin e tan eu estou adicionando uma distancia
ao movimento. Essa distancia é o zoom que vale 400 pixels. A câmera ficará a 400 pixels
do personagem.
Adicionei também algo para aumentar e diminuir o zoom apertando “+” ou “-“ no teclado.
• Apostila Livre - Game Maker :: 2010
Finalize o código do evento Step definindo o lugar para onde o câmera vai olhar que no
caso é a posição do obj1.
// Movimento no personagem
px = obj1.x;
py = obj1.y;
pz = obj1.z;
Abra o evento Draw do objCamera, apague o código lá e defina uma nova projeção:
d3d_set_projection_ext(x,y,z,px,py,pz,0,0,1,90,1.3,1,32000);
if keyboard_check(ord('W')) y -= 4;
if keyboard_check(ord('S')) y += 4;
if keyboard_check(ord('A')) x -= 4;
if keyboard_check(ord('D')) x += 4;
d3d_set_projection_ext(px,py,pz,x,y,z,0,0,1,90,1.3,1,32000);
Não se esqueça de tirar o código que desenha o cubo porque senão a visão vai ficar
tampada pela parte de dentro do cubo.
12.1 Transformações
Para rotacionar ou escalar um objeto você precisara usar as transformação D3D. Todas as
suas funções começam com a expressão “d3d_transform_”.
Primeiro você precisa definir o que será transformado senão os efeitos serão aplicados no
mundo todo.
Para isso existe uma função que identifica o que esta sendo desenhado e aplica os efeitos
apenas neles. Ela é a “d3d_transform_set_identity()”.
Outra coisa importante é que as transformação são aplicadas usando o ponto de origem da
room (que é 0,0,0 para x,y,z) e não o do objeto, ou seja, quanto você rodar um modelo ele
vai girar em torno do ponto 0 da room e não em torno de si mesmo (como a Terra girando
em torno do Sol).
Para resolver isso alem de usar “d3d_transform_set_identity” você também usará a função
“d3d_transform_add_translation(x,y,z);” que defini que a transformação será aplicada em
torno dos argumentos x,y,z.
Veja um exemplo:
d3d_transform_set_identity();
d3d_transform_add_translation(x,y,z);
d3d_draw_model(modelo,0,0,0,textura);
d3d_transform_set_identity();
d3d_transform_add_translation(x,y,z);
d3d_draw_model(modelo,10,15,8,textura);
Abra a engine que fez seguindo as outras aulas ou baixe por este link.
// Movimento no personagem
px = obj1.x;
py = obj1.y;
pz = obj1.z;
// Animação da camera
• Apostila Livre - Game Maker :: 2010
// Zoom
if keyboard_check(vk_add) zoom += 4;
if keyboard_check(vk_subtract) zoom -= 4;
// Movimento no personagem
px = obj1.x;
py = obj1.y;
pz = obj1.z;
d3d_set_projection_ext(x,y,z,px,py,pz,0,0,1,90,1.3,1,32000);
Mude o desenho do cubo para uma forma mais achatada para dar uma impressão de ser
um carro.
Troque os valores no código que desenha o cubo no evento Draw do obj1:
d3d_draw_block(-16,-32,-10,16,32,10,tex,1,1);
rx = 0;
ry = 0;
rz = 0;
No evento Step adicione isso para mudar os ângulos com os números do teclado numérico:
if keyboard_check(vk_numpad1) rx += 1;
if keyboard_check(vk_numpad4) rx -= 1;
if keyboard_check(vk_numpad2) ry += 1;
if keyboard_check(vk_numpad5) ry -= 1;
if keyboard_check(vk_numpad6) rz += 1;
if keyboard_check(vk_numpad3) rz -= 1;
d3d_transform_set_identity()
d3d_transform_add_rotation_x(rx);
d3d_transform_add_rotation_y(ry);
d3d_transform_add_rotation_z(rz);
d3d_transform_add_translation(x,y,z);
d3d_draw_block(-16,-32,-10,16,32,10,tex,1,1);
d3d_transform_set_identity()
Teste o jogo e aperte 1 e 4 para girar no eixo x, 2 e 5 para girar no eixo y e 3 e 6 para girar
no eixo z.
sx = 1;
sy = 1;
sz = 1;
if keyboard_check(vk_delete) sx += 0.1;
if keyboard_check(vk_insert) sx -= 0.1;
if keyboard_check(vk_end) sy += 0.1;
if keyboard_check(vk_home) sy -= 0.1;
if keyboard_check(vk_pagedown) sz += 0.1;
if keyboard_check(vk_pageup) sz -= 0.1;
No evento Draw adicione a função para escalar o modelo também sempre antes de
d3d_transform_add_translation.
d3d_transform_set_identity()
d3d_transform_add_rotation_x(rx);
d3d_transform_add_rotation_y(ry);
d3d_transform_add_rotation_z(rz);
d3d_transform_add_scaling(sx,sy,sz);
d3d_transform_add_translation(x,y,z);
d3d_draw_block(-16,-32,-10,16,32,10,tex,1,1);
d3d_transform_set_identity()
Teste e use Delete e Insert para mudar o eixo x, End e Home para o eixo y, Page Up e
Page Down para o eixo z.
12.4 Movimentação
Apague as novas variáveis que criamos e faça apenas uma para a rotação r, y_speed para
a velocidade e mude o valor z para 16.
Evento Create Completo:
z = 16;
tex = background_get_texture(background0);
tex2 = background_get_texture(background1);
x = 96;
y = 96;
r = 0; // rotação z
y_speed = 10; // velocidade
Apague todo o código no evento Step e coloque este para girar o carro para os lados:
if keyboard_check(ord('A')) r += 2;
if keyboard_check(ord('D')) r -= 2;
• Apostila Livre - Game Maker :: 2010
O carro tem que andar na direção que esta virado então temos que usar cos e sin para
achar x e y de acordo com o ângulo.
No evento Step adicione este código:
if keyboard_check(ord('W'))
{
x += cos(degtorad(r+90))*y_speed;
y -= sin(degtorad(r+90))*y_speed;
}
if keyboard_check(ord('S'))
{
x -= cos(degtorad(r+90))*y_speed;
y += sin(degtorad(r+90))*y_speed;
}
d3d_transform_set_identity()
d3d_transform_add_rotation_z(r);
d3d_transform_add_translation(x,y,z);
d3d_draw_block(-16,-32,-10,16,32,10,tex,1,1);
d3d_transform_set_identity()
d3d_draw_floor(0,0,0,room_width*3,room_height*3,0,tex2,10,10);
0. Definitions.
1. Basic Permissions.
All rights granted under this License are granted for the term
of copyright on the Program, and are irrevocable provided the
• Apostila Livre - Game Maker :: 2010
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise
remains in force. You may convey covered works to others for the
sole purpose of having them make modifications exclusively for
you, or provide you with facilities for running those works,
provided that you comply with the terms of this License in
conveying all material for which you do not control copyright.
Those thus making or running the covered works for you must do so
exclusively on your behalf, under your direction and control, on
terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
2. Termination.