[Tutorial] FPS + Sistema de Gravidade + Escada

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

[Tutorial] FPS + Sistema de Gravidade + Escada

Mensagem por Thiago_o_programador em Qua 18 Jul 2012, 16:33

Nome: Câmera estilo FPS e um sistema simples de gravidade
Nível de dificuldade: mediano
Requerimentos: Versão do GM 8 - Pro

Bem pessoal boa tarde, hoje irei ensinar como fazer uma câmera no estilo de Fisrt Personal Shooter (Tiro em Primeira Pesooal) e também um sistema de gravidade simples e uma escada.

Câmera


Vamos começar pela parte mais importante do jogo, a câmera, crie um objeto e nomeio de 'obj_cam', no evento CREATE dele adicione:

Código:
d3d_start()
Inicia o modo 3D

Código:
texture_set_interpolation(true)
Melhora significativamente a qualidade das texturas.

Código:
draw_set_color(c_white)
draw_set_alpha(1)
Seta a cor padrão de desenho em branco e o valor de alpha em 1

Código:
z=0
zspeed=0
zgravity=0
Variaveis de 'Localização' no mundo 3d, mesmo x e y já sendo variaveis padrão no game maker, z não é, o que obriga o programador a declara-la.

Código:
friction=.4
Seta a fricção absoluta do objeto

Agora no STEP adicione:

Código:
if keyboard_check(vk_left) {direction+=4}
if keyboard_check(vk_right) {direction-=4}
if keyboard_check(vk_up) {if speed<7 {speed+=.5}}
if keyboard_check(vk_down) {if speed>-7 {speed-=.5}}
Movimentos baseados nas teclas de navegação.

Posteriormente vamos criar um sistema de grids mas já vamos adiantando para ajustarmos a gravidade...

Código:
if z>global.grid*16&&zspeed=0 {zgravity+=.5}
Gravidade simples levando em conta a variavel global.grid que será explicada mais tarde...

Código:
if z<=global.grid*16 {zgravity=0 z=global.grid*16}
if zspeed>0 {zspeed-=.5}
if keyboard_check_pressed(vk_space) {zspeed=12}
if distance_to_object(obj_block)>1 {global.grid=16*-16}
if z<=16*-16 {room_restart()}
Restante do código de gravidade em função de global.grid e do obj_blcok que será criado posteriormente.

Bem, vamos agora passar para o END STEP:

Código:
z+=zspeed
z-=zgravity
z estará sempre em função de zspeed e zgravity.

No DRAW coloque:

Código:
xto=x+cos(direction*pi/180)
yto=y-sin(direction*pi/180)
zto=z+40
Faz com que a câmera carregue os valores de para onde ela olhara (xto,yto,zto) atravez da variavel direction, e o zto será uma pequena altura implementada para não dar a sensação que o player está deitado

Código:
d3d_set_projection(x,y,z+40,xto,yto,zto,0,0,1)
Projeta o horizonte de acordo com os valores encontrados antes.

Grid


Agora crie um script e chame-o de 'grade', adicione:

Código:
if z=0 {global.grid=0}
if z=16 {global.grid=1}
if z=16*2 {global.grid=2}
if z=16*3 {global.grid=3}
if z=16*4 {global.grid=4}
if z=16*5 {global.grid=5}
if z=16*6 {global.grid=6}
if z=16*7 {global.grid=7}
if z=16*8 {global.grid=8}
if z=16*9 {global.grid=9}
if z=16*10 {global.grid=10}
A variavel falada anteriormente (global.grid) será definida a partir daí ela servira para informar ao player onde está o chão, é interessante notar que serão todos multiplos de 16 então nesse caso quando for usa-la é só multiplicar por 16, ex:

Código:
if z>global.grid*16&&zspeed=0 {zgravity+=.5}
Se o valor z for maior que o valor de global.grid*16 e zspeed estiver igual a zero vai haver gravidade.

Por exemplo se z for igual a 64 e global.grid*16 for igual a 16 o player vai saber que está acima do chão então vai acionar a gravidade.

Chão


Crie um obj_up, ele vai fazer o chao subir, no END STEP adicione:

Código:
if distance_to_object(obj_block)<1 {instance_destroy()}
No contato com o obj_block ele será destruido.

Crie um objeto chamado: obj_block, ele vai ser nosso 'chão'.

No CREATE defina a variavel z:

Código:
z=0

E a grade:
Código:
global.grid=0

Na colisão com a câmera coloque:
Código:
if z>obj_cam.z+16 {with (obj_cam) {
  x = xprevious;
  y = yprevious;
  if (abs(hspeed) >= abs(vspeed) && not place_meeting(x+hspeed,y,obj_block))
    { x += hspeed; exit;}
 if (abs(vspeed) >= abs(hspeed) && not place_meeting(x,y+vspeed,obj_block))
    { y += vspeed; exit;}
  speed = 0;}}
Se o obj_block estiver com o valor z muito maior que o do obj_cam então o ele vai parar.

Código:
else{grade()}
Caso contrario ele vai chamar nosso script e o obj_cam vai subir.

Na colisão com o obj_up adicione:

Código:
z+=16
Ele vai subir um nivel

No DRAW coloque:

Código:
d3d_draw_block(x,y,z,x+64,y+64,-2,sprite_get_texture(sprite_index,0),1,1)
Desenha um paralelepípedo que vai da posição -2 até sua posição z. (seja ela qual for)

Texturas


Agora só falta as texturas, utlize essa para o sprite do obj_block:


Use essa para a câmera e para o obj_up:


Pronto!
Agora basta criar uma room e adicionar os objetos.
Obs.: Crie primeiro o obj_cam (Importante); quanto mais obj_up você colocar sobre o obj_block mais alto ele ficara.

Bem gente é isso, espero que tenham gostado, e para quem quiser clique aqui e obtenha a engine pronta.

Flw!


Última edição por Thiago_o_programador em Sab 25 Ago 2012, 09:03, editado 1 vez(es)

Thiago_o_programador

Ranking : Nota D
Número de Mensagens : 709
Idade : 19
Data de inscrição : 14/05/2009
Notas recebidas : D - C - D - C
Reputação : 6
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 1

http://www.jogosdahora.maisblog.net

Voltar ao Topo Ir em baixo

Re: [Tutorial] FPS + Sistema de Gravidade + Escada

Mensagem por GMaker 81 em Dom 19 Ago 2012, 12:54

modifica o topico, ai. isso só pega na versão Pro

GMaker 81

Número de Mensagens : 26
Idade : 16
Data de inscrição : 27/07/2012
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Tutorial] FPS + Sistema de Gravidade + Escada

Mensagem por Thiago_o_programador em Qua 26 Set 2012, 17:23

É, realmente, valeu cara, tinha esquecido isso.

Thiago_o_programador

Ranking : Nota D
Número de Mensagens : 709
Idade : 19
Data de inscrição : 14/05/2009
Notas recebidas : D - C - D - C
Reputação : 6
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 1

http://www.jogosdahora.maisblog.net

Voltar ao Topo Ir em baixo

Re: [Tutorial] FPS + Sistema de Gravidade + Escada

Mensagem por Conteúdo patrocinado Hoje à(s) 04:02


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