Conectar-se

Esqueci minha senha

Últimos assuntos
» colisão de queda após outra colisão dando problema
Ontem à(s) 18:08 por Lighter

» [Duvida] O que aprender
Ontem à(s) 15:32 por Markituh

» BUILD FAILED: Cannot find BUILD.xml
Ontem à(s) 14:50 por ReisBlender

» Nota de esclarecimento - GMBR voltou!
Sex 23 Jun 2017, 20:33 por Willy

» Regras do Fórum
Sex 23 Jun 2017, 19:02 por GMBR

» Retorno da GMBR!!!
Ter 24 Jan 2017, 15:43 por GMBR

» Jogo Dengue HTML
Seg 30 Nov 2015, 16:17 por guga

» Criando IA Simples para inimigos
Qua 25 Nov 2015, 19:22 por DJDAVYD

» Ordenar variavel em ordem decrescente
Sex 28 Ago 2015, 21:09 por Kodained

» Crio Trilha Sonora para Games!
Qui 27 Ago 2015, 13:50 por Isaias Malafaia

» Problema com Colisão
Qui 27 Ago 2015, 12:30 por The_Game

» Quem quer Uma Engine, e de Quê?
Qui 27 Ago 2015, 09:22 por theguitarmester

» [RESOLV]Como adicionar 2 objetos na mesma posição?
Qua 26 Ago 2015, 11:38 por Bhryenno Kelvyn Carlson

» Sistema de porta!!!
Ter 25 Ago 2015, 21:29 por theguitarmester

» Venda de objetos em Inventário - Multiplicado
Seg 24 Ago 2015, 18:33 por AG Hydra

» Atirar na direção certa
Seg 24 Ago 2015, 09:03 por theguitarmester

» Western Duels
Seg 24 Ago 2015, 07:47 por theguitarmester

» Problemas na compilação android
Dom 23 Ago 2015, 23:43 por Zero.

» Dúvida sobre strings, lendo txt
Sab 22 Ago 2015, 20:31 por Pai véi

» Como estabilizar um som
Sab 22 Ago 2015, 19:03 por Isquilo_Roedor

» Janela Modal
Sab 22 Ago 2015, 09:23 por Pai véi

» Sobre instance Creation Code
Sab 22 Ago 2015, 08:39 por Pai véi

» LudumDare #33
Sex 21 Ago 2015, 21:17 por WellingtonBecker

» Como fazer um temporizador
Sex 21 Ago 2015, 19:02 por Isquilo_Roedor

» GMS sempre salva projeto ao compilar?
Sex 21 Ago 2015, 12:32 por Pai véi

Quem está conectado
14 usuários online :: Nenhum usuário registrado, Nenhum Invisível e 14 Visitantes

Nenhum

[ Ver toda a lista ]


O recorde de usuários online foi de 324 em Ter 05 Out 2010, 13:36

[Tutorial] HUD com Corações de Health/Vida/Sangue

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

[Tutorial] HUD com Corações de Health/Vida/Sangue

Mensagem por dharrison em Sex 19 Nov 2010, 19:10

Objetivo: Fazer com que Sprites de Corações aumentem ou diminuam conforme a Vida do Heroi aumenta ou diminui.
Dificuldade: Médio (Para mim foi, pq usa a função for que é meio chatinha de mexer)
Ferramenta: GM7 GM7

Agradecimentos:
SIGILOSO (por sua tuto "Que venham as HUDs")
Alex FC (por sua "Aula 6 - Introdução a GML - For")


MATERIAL:
Qualquer coisa, pode ser um sprite de coração, ou até bolinhas ou quadradinhos. Crie algum vc mesmo no GM ;)
Se possivel mantenha o tamanho do seu sprite em 16x16, senão terá que modificar os valores respectivos ao tamanho do sprite depois.

Eu fiz um Coração no Editor do GM, com 16x16 de tamanho, centralizado em 8x8.


MODO DE PREPARO:

Primeiramente sigamos a dica do SIGILOSO do tutorial "Que venham as HUDs":
Crie um Obj, aqui nós o chamaremos de "obj_declarador", nele coloque um Evento Create com o seguinte conteúdo:
Código:
global.life = 30 //Eu usei 30 porque usei apenas 3 Corações, coloque 100 depois para experimentar
room_goto(room1) //Coloque o nome da próxima room que criaremos, se vc começo um 'jogo' do zero pra fazer o tudo, será a room1

Isso vai tornar nossa variavel global.life 'fixa', de modo que não importa quantas vezes vc mude de room futuramente, ela vai conservar o valor que tinha anteriormente. (por exemplo, se vc começa o jogo com 3 corações, mas passou a 1ª fase apenas com 1, na 2ª fase você vai continuar com 1)
Obs: é importante que essa room seja a primeira da lista.

Agora crie um novo Obj, chamado obj_hud, adicione um Evento Draw nele e coloque o seguinte Piece of Code:
Código:
{
HUDdraw(); //isso simplesmente vai fazer uma chamada ao Script HUDdraw (que faremos a seguir), com todo seu conteudo.
}

Crie uma nova room (que será a room1), o coloque o obj_hud nela.

E para finalizar, Crie um Script e chame-o de HUDdraw. Coloque isso nele:
Código:
{
global.hearts = global.life*100/1000
    if global.hearts >= 1
    {
        for (xx=view_xview+16; xx<global.hearts*16+4; xx+=16)
        {   
        draw_sprite(s_hearth,0,xx,view_yview+30)
        }
    }
}

Rode o Jogo e veja o que acontece Happy


"Tá.. apareceu os corações, idai? '-' "
Calma '^_^
Antes de continuar vamos entender o código:

Código:
global.hearts = global.life*100/1000
Aqui definimos uma nova variavel global, chamada Global.Hearts, que é igual a 1 Décimo de Global.Life (se Life = 100, Hearts = 10). Nós multiplicamos Global.Life por 100, e depois dividimos por 1000. "Pra que?" Boa pergunta... O GM não aceitou uma divisão por 10, então fiz isso e deu certo. E creio que assim mesmo que sejam usados numéros decimais futuramente (por exemplo, inimigo tira 0,5 de Life do Heroi), não vai bugar.

Código:
if global.hearts >= 1

SE global.hearts for Igual ou Maior que 1.

Código:
for (xx=view_xview+16; xx<global.hearts*16+4; xx+=16)
Isso que deu trabalho. Vamos distrinchar o código pra entender:

Primeira Declaração:
Código:
xx=view_xview+16;

Aqui dizemos que XX vai significar view_xview+16 (ou seja, o Eixo X da View, mais 16)


Segunda Declaração:
Código:
xx<global.hearts*16+4;
Na segunda declaração de For, temos que dizer o que queremos, como se fosse a função If. Nesse caso "traduzindo para IF" seria:
Código:
If xx <= global.hearts*16+4;
traduzindo para o portugues: "Se xx for menor que global.hearts*16+4".
"Porque 16?" -- Porque é o mesmo numero que usamos na view_xview (eu acho).
"Porque +4?" -- Porque dá um total de 20, que divindindo 100 gera o produto 5. (Nesse caso, se você colocou global.life = 100 no começo do tuto, apareceram 5 corações; se colocou 30 igual eu, apareceram 3)
"Porque num colocou 20 intao seu burro?!" -- Sei lá!, GM num aceitou... ele tá neurótico hj comigo.


Terceira Declaração:
Código:
xx+=16;
Na Terceira Declaração nós dizemos o que deve acontecer até que a Segunda Declaração possa ser completa. Nesse caso, até que XX seja Maior que global.hearts*16+4.
Nós dizemos aqui que XX deve aumentar em 16 até que isso aconteça.
"E como isso fez aparecer mais corações?" -- Só apareceram mais corações, porque dizemos no código abaixo demos uma ordem de draw_sprite, mas os corações foram mudando de lugar porque declaramos que XX é o valor x da view. Se tivessemos dito, por exemplo, que XX é SCORE, ele aumentaria o SCORE até ele ser maior que global.hearts*16+4... (e isso ficaria totalmente senseless, mas é só um exemplo).
Capiche?


Código a ser Executado:
Código:
draw_sprite(s_hearth,0,xx,view_yview+30);
E por ultimo, declaramos o que deveria acontecer cada vez que XX aumentasse seu valor em +16 (a cada passo do For). Nesse caso, nós declaramos que deveria ser desenhado um novo sprite, usando o valor XX para o eixo x do draw. Ou seja, que cada novo sprite seria desenhando a cada nova posição de view_xview(XX), que foram 16 (inicial), 32, 48, 64... e assim por diante.


É assim mais ou menos que consegui explicar o funcionamento do For como nós o usamos, para entender melhor veja a Aula 6 do Alex FC.
(desculpa a bagunça de caixas de códigos acima, é que o forum tava fazendo ela sumirem se tivessem apenas escritas... to sortudo hj ¬¬)


Para finalizar, se quiser fazer um teste de aumentar ou diminuir corações. Crie um novo Obj e chame-o de obj_controle, nele adicione um evento Step e coloque o seguinte código:
Código:
//teste
if keyboard_check_pressed(ord('X'))
{
global.life -= 10
}

if keyboard_check_pressed(ord('C'))
{
global.life += 10
}

//limitador
if global.life >= 120
{
global.life = 120
}

Aperte X para dimunir a vida, e C para aumentar. O ultimo trecho do código com titulo de limitador, limita a quantidade máxima de corações. Se quiser mais corações ou menos corações, altere o numero baseado em valores multiplos de 10. (10, 20, 30 ... 150, 300, etc).


É isso, espero que tenham gostado.
Não vou postar engine pq criei isso num jogo que estou desenvolvendo, e apenas isolei isso do jogo em questão para trazer a vocês Happy

Próximo Tuto:
Criando um Pause Personalizado (Sem usar show_message).


Abração! Até mais galera.
Atencionsamente, DHarrison.
avatar
dharrison

Ranking : Nota B
Notas recebidas : A - B
Data de inscrição : 04/02/2009
Número de Mensagens : 1243
Insígnias de JAM :

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 1

Prêmios
   : 0
   : 1
   : 0

Ver perfil do usuário

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