Autor Tópico: Introdução ao Game Maker + Iniciando ambientação de fase em 3d  (Lida 7672 vezes)

Azrael

  • Newbie
  • *
  • Posts: 6
Introdução ao Game Maker + Iniciando ambientação de fase em 3d
« Online: Março 30, 2018, 05:18:20 pm »
O Game Maker é uma ferramenta de criação de jogos super completa feita por Mark Overmars capaz de fazer jogos em 2d ou em 3d. A ferramenta possui sua própria linguagem baseada em Delphi e blá blá blá... Vamos ser sinceros: em quase todo tutorial que procuramos na net sobre o Game Maker vemos essa introdução tediosa e irritante.
Que tal pularmos isso e irmos direto ao que interessa? A gente pega o Game Maker porque queremos criar nossos próprios códigos para uma versão de DOOM, de Quake, ou pro nosso próprio jogo original em 3d. Mas o que a maioria dos negos no fórum GMBR faz é dizer "faça algo em 2d e quando tiver pleno domínio disso passe para o 3d". Bem, até que eles podem ter razão, mas... Eu não estou aqui para tentar ensinar a fazer um super mário. Eu estou aqui para ensinar a fazer 3d.
E o que é melhor para dar os primeiros passos no 3d do Game Maker do que uma criação própria como Wolfenstein?

Pois bem, amigos. Vamos começar pela ambientação e movimentação 3d, já de forma que não tenhamos problemas com os próximos tutoriais:

Citação de: Pré-requisitos para o tutorial de hoje (e os seguintes)
Game Maker ( 6.1a / 7.5 / 8 ) pró
Paciência
E...
E...
E é só isso mesmo.

Primeiro de tudo, abra o seu Game Maker. (Nossa, é sério?)
Note a árvore de pastas à esquerda. É ali que são organizados todos os recursos usados para o seu jogo.
Primeiro de tudo, vamos criar de cara os objetos (objects) usados nesse tutorial.

Citação de: Objetos para criar na pasta Objects
Citação de: Para o personagem
obj_player => Esse será o seu jogador. É nele que faremos a maioria dos eventos, como movimentação e colisão
obj_camera => Apesar de sabermos que é um FPS, temos a câmera separada do jogador por alguns motivos, como poder mudar a perspectiva do personagem quando quiser, substituir a câmera por outro modelo, tipo aquelas grudadas na parede que seguem o personagem, alterar algo na visão e essas coisas.
Citação de: Para as paredes
obj_cubo_basic => Ao contrário do que vocês podem ter visto em tutoriais do próprio Mark Overmars, nós vamos trabalhar com "cubos" para as paredes. É menos intuitivo à primeira vista, mas vai se tornar bem mais prático para os próximos tutoriais.
obj_parede_v => Para montar o mapa no game maker usamos uma tela 2d. Isso porque o game maker suporta o 3d, mas não foi feito para isso. Logo, tudo o que usarmos em 3d será na base da gambiarra. Logo, v de vertical.
obj_parede_h => Pelos mesmos motivos do objeto anterior, h de horizontal.
Citação de: Para o chão
obj_floor_basic => O tutorial do Overmars nos ensina que deveríamos desenhar o chão junto com a câmera, mas... Não. Vamos fazer isso diferente pelo simples motivo de organização.
obj_floor_e1m1 => Esse será de fato o chão


Citação de: Backgrounds / texturas para criar na pasta backgrounds(nome para colocar no arquivo logo abaixo de cada imagem)
Tendo em mãos os objetos criados, vamos aos backgrounds:
Você vai pegar uma imagem para parede, uma para chão e uma para teto. Para fins de aprendizado, vou disponibilizar essas aqui:


back_wall


back_floor_and_ceiling

Tendo isso pronto, hora de criarmos os sprites para ajudar nas colisões e poder montar os mapas na room.
Citação de: Sprites
spr_player: crie um sprite nas dimensões 10x10 (em pixels). Pinte de qualquer cor. clique em "center" para o sprite desenhar a partir do centro.
spr_parede_h: crie um sprite nas dimensões 32x3 (em pixels). Pinte de qualquer cor. Clique em "center" para o sprite desenhar a partir do centro.
spr_parede_v: crie um sprite nas dimensões 3x32 (em pixels). Pinte de qualquer cor. Clique em "center" para o sprite desenhar a partir do centro.

Com os sprites prontos, vamos ajustar as configurações iniciais:
Abrir o obj_player e, onde diz "sprite", você clica e seleciona o "spr_player". Dê OK para confirmar.
Em "depth" vocês colocam "100".

Abrir o obj_camera e, em "depth", vocês colocam "1000"

Abrir o obj_floor_e1m1 e, onde diz "parent", clicar e selecionar "obj_floor_basic".
Em "depth", vocês colocam "10".

No obj_parede_h você faz a mesma coisa com o "spr_parede_h".
Onde diz "parent", vocês vão clicar e selecionar "obj_cubo_basic".
Em "depth" vocês colocam "10".

No obj_parede_v você faz a mesma coisa com o "spr_parede_v".
Onde diz "parent", vocês vão clicar e selecionar "obj_cubo_basic".
Em "depth" vocês colocam "10".

Com isso temos todos os recursos visuais para montar a nossa fase. Mas, onde montamos a fase? Vá na pasta room e crie uma room. Nomeie-a como quiser... Particularmente recomendo nomearem de e1m1, mas isso é preferência pessoal.
Nela vocês vão:
1 - Colocar o obj_camera(vai aparecer uma bolinha com interrogação. Normal, isso é porque não tem sprite... E nem precisa ter.
2 - Colocar o obj_player onde queira começar a fase.
3 - Com os objetos "obj_wall_h" e "obj_wall_v" vão cercar a room no maior quadrado que puderem. Logo depois disso, montem a fase do jeito que quiserem, usando esses dois objetos.
4 - Colocar o obj_floor_e1m1 no cenário em qualquer lugar.

Salvem o projeto e rodem.
Notem que:
1 - Você não consegue mover o personagem. porque ainda não programamos sua movimentação.
2 - Você não tem visualização 3d, você só vê os sprites dos objetos. Isso porque não programamos a câmera e os desenhos dos objetos ainda.
3 - O obj_camera e o obj_floor_e1m1 não aparecem na fase. Isso porque eles não têm sprites.

(Continua, nesse mesmo tópico, no próximo post)
« Última modificação: Março 30, 2018, 06:45:09 pm por Azrael »

Azrael

  • Newbie
  • *
  • Posts: 6
Re:Introdução ao Game Maker + Iniciando um jogo em 3d
« Resposta #1 Online: Março 30, 2018, 06:14:59 pm »
(Continuando agora)

Como dito no post anterior, faltam coisas para que funcione. E é aqui que entra a coisa mais difícil do programa: os scripts.
Mas não se preocupem, tenho preparados alguns scripts básicos para esse tutorial que vão servir bem para o que queremos agora:

Vocês vão preparar os seguintes scripts, na pasta scripts (cujos nomes serão os das citações onde os colocarei):

Citação de: Scripts para a câmera
Citação de: scr_start_3d
d3d_start()
d3d_set_hidden(true)
d3d_set_perspective(true)
d3d_set_lighting(false)
draw_set_color(c_white)
draw_set_alpha(1)
d3d_set_fog(true,c_black,1,320)
texture_set_interpolation(true)
Citação de: scr_create_camera
zdir=0
distancia=128
Citação de: scr_move_camera
if joystick_zpos(id) !=0 then {
direction-=5*joystick_zpos(id)
}

display_x=display_get_width()
display_y=display_get_height()

change_x = (display_mouse_get_x()-display_x/2)/16
change_y = (display_mouse_get_y()-display_y/2)/12

direction-=change_x
zdir-=change_y


if zdir<=-90 then zdir=-90
if zdir>=90 then zdir=90

display_mouse_set(display_x/2,display_y/2)
Citação de: scr_draw_camera
xf = obj_player.x
yf = obj_player.y
zf = obj_player.z+20

xt = xf+lengthdir_x(distancia,direction)
yt = yf+lengthdir_y(distancia,direction)
zt = zf+zdir

d3d_set_projection(xf,yf,zf,
xt,yt,zt,
0,0,1)

Citação de: Scripts para o personagem
Citação de: scr_create_player
friction=5
velocidade_x=0
velocidade_y=0

z=0
zmax=10
Citação de: scr_player_geral
scr_hspeed(velocidade_x)
scr_vspeed(velocidade_y)

if velocidade_x>=4 then {velocidade_x=4}
if velocidade_y>=4 then {velocidade_y=4}

UD = keyboard_check(ord('W')) - keyboard_check(ord('S'))
RL = keyboard_check(ord('D')) - keyboard_check(ord('A'))


if UD!=0 then {
    if UD=1 then {
        motion_add(obj_camera.direction,1)}
    if UD=-1 then {
        motion_add(obj_camera.direction-180,1)}
    velocidade_x+=0.5
    velocidade_y+=0.5
}

if RL!=0 then {
    if RL=1 then {
        motion_add(obj_camera.direction-90,1)}
    if RL=-1 then {
        motion_add(obj_camera.direction+90,1)}
    velocidade_x+=0.5
    velocidade_y+=0.5
}

if UD=0 && RL=0 then {
velocidade_x=0
velocidade_y=0}
Citação de: scr_hspeed
//PONTAS PERFEITAS:
if direction=0||direction=360 then {direcao_x=1}//CERTO
if direction=90 then {direcao_x=0}//CERTO
if direction=180 then {direcao_x=-1} //CERTO
if direction =270 then {direcao_x=0}//CERTO
//DIAGONAIS
if direction >0 && direction <90 then {
direcao_x=1-((1/90)*direction)} //CERTO
if direction >90 && direction <180 then {
direcao_x=(-1/90)*(direction-90)} //CERTO
if direction >180 && direction <270 then {
direcao_x=-1 -((-1/90)*(direction-180))}//CERTO
if direction >270 && direction<360 then {
direcao_x=(1/90)*(direction-270)} //CERTO

repeat(velocidade_x){
if place_free (x+1*sign(direcao_x),y) then {
x+=1*direcao_x}
else
{return false}
}
return true
Citação de: scr_vspeed
//PONTAS PERFEITAS:
if direction=0||360 then {direcao_y=0}//CERTO
if direction=90 then {direcao_y=-1}//CERTO
if direction=180 then {direcao_y=0} //CERTO
if direction =270 then {direcao_y=1}//CERTO
//DIAGONAIS
if direction >0 && direction <90 then {
direcao_y=(-1/90)*direction} //CERTO

if direction >90 && direction <180 then {
direcao_y=-1-(-1/90)*(direction-90)} //CERTO

if direction >180 && direction <270 then {
direcao_y=(1/90)*(direction-180)}//CERTO

if direction >270 && direction<360 then {
direcao_y=1-(1/90)*(direction-270)} //CERTO

repeat(velocidade_y){
if place_free (x,y+1*sign(direcao_y)) then {
y+=1*direcao_y}
else
{return false}
}
return true

Citação de: Scripts para as paredes
Citação de: scr_draw_wall
textura=background_get_texture(back_wall)
d3d_draw_block(x1,y1,z,x2,y2,zmax,textura,1,1)
Citação de: scr_create_wall_h
x1=x-16
x2=x+16
y1=y-1
y2=y+1
z=0
zmax=32
Citação de: scr_create_wall_v
x1=x-1
x2=x+1
y1=y-16
y2=y+16
z=0
zmax=32
Citação de: collision_wall
if obj_player.z>zmax-5 || obj_player.zmax<z then {
solid=false}
else
{solid=true}

Tendo todos esses scripts prontos, salve o seu arquivo e rode-o. Notará que continua exatamente a mesma coisa que quando rodou da primeira vez... Isso porque ainda não aplicamos os scripts aos devidos lugares.
(continua, nesse mesmo tópico, na próxima postagem)
« Última modificação: Março 30, 2018, 07:35:33 pm por Azrael »

Azrael

  • Newbie
  • *
  • Posts: 6
Re:Introdução ao Game Maker + Iniciando um jogo em 3d
« Resposta #2 Online: Março 30, 2018, 06:29:54 pm »
(Continuando)

Hora de aplicar os scripts aos seus devidos objetos para que as coisas funcionem direito:

Citação de: Aplicando os scripts
1 - Abra o obj_player.
Evento create => coloque o script "scr_create_player"
Evento step => coloque o script "scr_player_geral"

Desmarque a opção "visible" e marque a opção "solid"
Dê OK.

2 - Abra o obj_camera.
Evento create => coloque os scripts "scr_start_3d" e "scr_create_camera"
Evento step => coloque o script "scr_move_camera"
Evento draw => coloque o script "scr_draw_camera"

Dê OK.

3 - Abra o obj_cubo_basic.
Evento step => coloque o scriot "scr_collision_wall"
Evento draw => coloque o script "scr_draw_wall"

Dê OK.

4 - Abra o obj_parede_h.
Evento create => coloque o script "scr_create_wall_h"

Dê OK.

5 - Abra o obj_parede_v.
Evento create => coloque o script "scr_create_wall_v"

Dê OK.

Salve e dê o play no seu projeto.
Notaram alguma diferença? ... É. Com W,A,S,D você anda, com o mouse você mexe a câmera. Você tem uma boa colisão com as paredes que estão desenhadas. Mas, pera... Cadê o chão?
Não tem chão e não tem teto. Por que? Por que não configuramos, oras! E essa, acreditem ou não, é a parte mais simples.
(Continua, nesse mesmo tópico, no próximo post)

Azrael

  • Newbie
  • *
  • Posts: 6
Re:Introdução ao Game Maker + Iniciando um jogo em 3d
« Resposta #3 Online: Março 30, 2018, 06:43:36 pm »
(Continuando)
Enfim, a última parte:
Chão e teto.

Para eles, nós vamos criar dois scripts:

Citação de: Scripts para chão e teto
Citação de: scr_draw_floor_ceiling
d3d_draw_floor(0,0,0,room_width,room_height,0,textura,25,25)
d3d_draw_floor(0,0,32,room_width,room_height,32,textura,25,25)
Citação de: scr_create_floor_ceiling_e1m1
textura=background_get_texture(back_floor_and_ceiling)

Tendo esses dois scripts prontos, vamos configurar em seus respectivos objetos:
Citação de: Configurando o chão e o teto
1 - Abra o obj_floor_basic.
Event Draw => colocar o script "scr_draw_floor_ceiling"

Dê OK.

2 - Abra o obj_floor_e1m1.
Event Create => colocar o script "scr_create_floor_ceiling_e1m1"

Dê OK.

Salve e rode o seu projeto.
E... Pronto! Fim do primeiro tutorial. Você tem sua primeira fase feita ao estilo Wolfenstein. (Claro. HUD, a "mão com a arma", HP e essas coisas ficam para a próxima. Esse tutorial é para configurar colisão básica e ambientação 3d.)

Se seguiu todos os passos corretamente, você terá um resultado semelhante a esse:
4SHARED >>>> https://www.4shared.com/rar/DW3zhmKgei/Amostra_de_tutorial.html]https://www.4shared.com/rar/DW3zhmKgei/Amostra_de_tutorial.html]https://www.4shared.com/rar/DW3zhmKgei/Amostra_de_tutorial.html
MEGA >>>> https://mega.nz/#!IQQzVDqJ!UsYEuyb4tLD4S3HJRLlB0ToUmdr9peDICViwuDYhv28
« Última modificação: Março 30, 2018, 08:06:06 pm por Azrael »