segunda-feira, 7 de maio de 2012

[pinpi] Fazendo um jogo de tiro

Qualidade
Nome: Fazendo um jogo de tiro
Blogueiro: pinpi
Descrissao: E ai blz galera ? Bom eu tava sem nada pra faze e resolvi faze um tuto, ai veio a ideia de fazer um sobre jogos de tiro top view. Esse ensina mais a parte de fazer a arma mesmo, então se tiver interesado le ai, é no minimo interesante...
Versao: Pro
Foto(s): (Jogo se aproxima de CS 2D, depende dos gráficos que cada um usar)

Tutorial:

Introdução

E ai blz galera ? Bom eu tava sem nada pra faze e resolvi faze um tuto, ai veio a ideia de fazer um sobre jogos de tiro top view. Esse ensina mais a parte de fazer a arma mesmo, então se tiver interesado le ai, é no minimo interesante.

Fazendo sua arma atirar e mirar

Vamo começa então né, bom... fassa uma sprite de uma pessoa com uma arma,vista top view, centralizada no meio do player.

Exemplo tipo essa:



Agora crie o obj_player com a sprite dele é claro.
Em seu create coloque:
CÓDIGO:
atirar=true
cartucho=10
cartuchoo=10
municao=50
forca=35
veloci=14
velocii=15
recarrega=15
mira=15
arma=1
a=0
carregando=false


Aqui criamos as variveis da arma, muitas para facilitar na hora de criar varias armas ai você só precisa alterar essas variaveis e não o codigo inteiro. agora a tradução:
atirar=true // essa var é a que define se pode atirar ou não, para não fica aquela rajada de tiros que nunca para
cartucho // esse é o tanto de tiro que tem na arma
cartuchoo // esse é o maximo de tiros que cabe na arma
municao // é o tanto de tiros que ainda pode usar
forca // o tando de vida que o tiro vai tirar do inimigo
veloci // velocidade do tiro
velocii // velocidade entre um tiro e o outro, EX: de uma pistola é 15, de uma metralha é 4
recarrega // tempo que leva para recarregar
mira // é o tanto de chance que tem de errar o tiro. O de uma sniper por exemplo é 0
arma // essa é a var que define com qual arma ele está tipo assim ARMA 1 = pistola, ARMA 2= AK47
a // esse é o valor que tem de balas sem nada, vc vai entender depois.
carregando=false // verifica se ta carregando.




Alguma duvida ? Então vamo lá


Agora no step coloque:
CÓDIGO:
direction=point_direction(x,y,mouse_x,mouse_y)
image_angle=direction

Isso é para a imagem, faz com que a direção do player mire para o mouse junto com o angulo da sprite.

Agora no mesmo codigo:
CÓDIGO:
if keyboard_check(vk_left) and place_free(x-4,y)
x-=4
if keyboard_check(vk_right) and place_free(x+4,y)
x+=4
if keyboard_check(vk_up) and place_free(x,y-4)
y-=4
if keyboard_check(vk_down) and place_free(x,y+4)
y+=4

E não se esqueça para nao dar o bug da arma presa na parede coloque uma mask do tamanho do corpo do player, um circulo de 32x32. Esse codigo se você não entendeu va ler as aulas do redragon.

Pronto agora o nosso player já mira e anda. Mas e os tiros ?

Antes de tudo crie um obj_tiro com uma sprite de tiro. Nele coloque assim no create:
CÓDIGO:
forca=0


Isso cria a var forca, que é a força do tiro. E na colisão com o inimigo, que eu não vou ensinar a fazer coloque assim:
CÓDIGO:
other.vida-=forca
instance_destroy()

Isso tira da vida dele a sua força, e destroi a bala.

Agora no step:
CÓDIGO:
image_angle=direction

Isso eu já expliquei.Deixa o angulo da sprite igual ao da direção.

Agore vamos voltar ao step do player que deve estar assim:
CÓDIGO:
direction=point_direction(x,y,mouse_x,mouse_y)
image_angle=direction
//
if keyboard_check(vk_left) and place_free(x-4,y)
x-=4
if keyboard_check(vk_right) and place_free(x+4,y)
x+=4
if keyboard_check(vk_up) and place_free(x,y-4)
y-=4
if keyboard_check(vk_down) and place_free(x,y+4)
y+=4

Agora nesse codigo adicione mais isso:
CÓDIGO:
if mouse_check_button_pressed(mb_left) and atirar=true and cartucho>=1 and arma=1 and carregando=false
{
cartucho-=1
atirar=false
alarm[0]=velocii
tiro=instance_create(x,y,obj_tiro)
tiro.speed=veloci
tiro.forca=forca
tiro.direction=direction
tiro.direction+=random_range(-mira,mira)
}

TRADUZINDO...
Caso o mouse sejá precionado e possa atirar e tenha bala, e a arma seja 1 e não estaja carregando:
perde uma bala
não pode atirar
ativa o alarm 0 de acordo com o tempo entre os tiros da arma
cria o tiro
tiro fica na velocidade dele
tiro fica com a força dele
tiro vai para a direção da direção do player (o mouse)
tiro aumenta a direção entre a mira negativa e a mira positiva, fazendo assim com que de aquela erradinha.
OBS1: Não esqueça o depth do player tem que ser menor que o da bala.
OBS2: Não esquece de marcar "Interpolate colors between pixels" lá em "Global Game Settings"


Seu codigo do step do player deve estar assim:
CÓDIGO:
direction=point_direction(x,y,mouse_x,mouse_y)
image_angle=direction
//
if keyboard_check(vk_left) and place_free(x-4,y)
x-=4
if keyboard_check(vk_right) and place_free(x+4,y)
x+=4
if keyboard_check(vk_up) and place_free(x,y-4)
y-=4
if keyboard_check(vk_down) and place_free(x,y+4)
y+=4
//
if mouse_check_button_pressed(mb_left) and atirar=true and cartucho>=1 and arma=1 and carregando=false
{
cartucho-=1
atirar=false
alarm[0]=velocii
tiro=instance_create(x,y,obj_tiro)
tiro.speed=veloci
tiro.forca=forca
tiro.direction=direction
tiro.direction+=random_range(-mira,mira)
}

Agora no alarm 0 coloque:
CÓDIGO:
atirar=true

Pronto agora o player atira anda e mira. Mas e a munição ? Vamo faze o player recarregar.

Lembra daquele varsinha chamada "a" ? Então vamu usa ela agora, coloca assim no step:
CÓDIGO:
a = cartuchoo - cartucho


ou seja
10 - balas da arma = a

Isso é, "a" é o tanto de balas que cabe na arma.

Ai vc coloca mais assim:
CÓDIGO:
if keyboard_check_pressed(vk_space) and carregando=false
{
alarm[1]=recarrega
carregando=true
}

Isso é caso spaço seja apertado, e não esteja carregando, ele vai recarrega (ativa o alarm 1 de acordo com a var recarrega e diz que ta carregando)

Agora seu step deve estar assim:
CÓDIGO:
direction=point_direction(x,y,mouse_x,mouse_y)
image_angle=direction
//
if keyboard_check(vk_left) and place_free(x-4,y)
x-=4
if keyboard_check(vk_right) and place_free(x+4,y)
x+=4
if keyboard_check(vk_up) and place_free(x,y-4)
y-=4
if keyboard_check(vk_down) and place_free(x,y+4)
y+=4
//
if mouse_check_button_pressed(mb_left) and atirar=true and cartucho>=1 and arma=1 and carregando=false
{
cartucho-=1
atirar=false
alarm[0]=velocii
tiro=instance_create(x,y,obj_tiro)
tiro.speed=veloci
tiro.forca=forca
tiro.direction=direction
tiro.direction+=random_range(-mira,mira)
}
//
a = cartuchoo - cartucho
if keyboard_check_pressed(vk_space) and carregando=false
{
alarm[1]=recarrega
carregando=true
}


Agora coloque assim no alarm 1:
CÓDIGO:
municao -= a
cartucho +=a
carregando=false


Isto é:
tira o valor "a" da municao e aumenta o valor "a" do cartucho. e diz que não ta mais carregando
Pronto agora ele carrega e tudo mais. Mais falta mostrar as balas. Crie um obj_controle e em seu draw coloque:
CÓDIGO:
draw_text(0,0,"Balas: " + string(obj_player.cartucho) + " / " + string(obj_player.municao))


Esse é um draw_text normal só que ficou meio extenso pq vem "texto + string + texto + string"
Então só o ultimo recadinho pessoal.
Eu demorei tempo para fazer esse tuto, e posso ter errado em alguma coisa, então se ver algo errado avisa ae que eu arrumo, eu fui fanzendo e testando, deu tudo certo aqui. Proxima aula vou ensinar a usar aquele var "arma"

FLW COMENTA AE.
Creditos: pinpi

Um comentário: