Entrar
Últimos assuntos
» Como ajustar velocidade de cada frame da animação no game makerpor Ralphed Ontem à(s) 18:28
» PROBLEMAS COM FÍSICAS DE ÁGUA
por aminaro Ter 16 Abr 2024, 10:07
» Retorno da GMBR!!!
por Ralphed Sex 12 Abr 2024, 22:45
» JOGADOR PARANDO NO AR QUANDO ATACA
por aminaro Qua 10 Abr 2024, 13:51
» Problemas com texto interativo
por Kaaru72 Dom 07 Abr 2024, 11:31
» Erro escondido e indecifrável
por dev_gabize.azv Qui 04 Abr 2024, 10:11
» Mudar cor de apenas uma palavra
por Ralphed Sáb 30 Mar 2024, 00:39
» Procuro Programador de game maker
por Wou Sex 15 Mar 2024, 10:27
» Mod APK
por gamerainha Qua 13 Mar 2024, 06:30
» Aceito pedidos de sprites (Com exemplos meus)
por Sevilha Qua 28 Fev 2024, 12:17
» Inventário simples
por Isquilo_Roedor Qui 22 Fev 2024, 15:18
» Problemas na programaçnao de inimigo [jogo DOOM LIKE]
por Black Mirror Dom 11 Fev 2024, 13:34
» ANDROID MULTI TOUCH
por DiegoBr Dom 04 Fev 2024, 12:13
» Servidor de Discord do fórum?
por Lighter Sáb 27 Jan 2024, 17:18
» Save e Load Json
por Klinton Rodrigues Qui 25 Jan 2024, 11:12
» Colisão com mais de um objeto
por aminaro Seg 22 Jan 2024, 15:02
» Oi sou novo aqui
por Thiago Silveira Alexandre Sáb 20 Jan 2024, 20:55
» Como acessar conteudo comprado no marketplace
por macmilam Sex 19 Jan 2024, 07:42
» Devlogs em vídeos do Block Room
por Joton Seg 15 Jan 2024, 16:56
» Alguém aqui já ganha dinheiro com seus games?
por Joton Seg 15 Jan 2024, 16:49
» ACERVO GMBR MAGAZINE
por Joton Qui 11 Jan 2024, 19:21
» como aumentar o obj sem aumentar a colisão??
por GabrielXavier Qua 10 Jan 2024, 07:21
» Asteroid Core - Early Acesse Update [0.2.0.0]
por JOZ. Seg 08 Jan 2024, 14:39
» Versionamento de código com GitHub
por GabrielXavier Seg 08 Jan 2024, 07:32
» Rio Rise - novo launcher do Gta San Andreas SAMP Brasil
por kolesovsup Sex 29 Dez 2023, 07:16
[ENGINE - SCRIPT] Método de draw_sprite_part
3 participantes
GMBR :: Ensine & Aprenda :: Exemplos :: Game Maker (engines)
Página 1 de 1
[ENGINE - SCRIPT] Método de draw_sprite_part
Método de draw_sprite_part:
(Com o CQ #16 encerrado, nada mais justo do que eu compartilhar meu segredo, né?)
(Com o CQ #16 encerrado, nada mais justo do que eu compartilhar meu segredo, né?)
Estava eu todo empolgado com o CQ #16, até que, em um momento muito antes de começar a fazer meu jogo, pensei: "Como eu poderia manter múltiplas imagens no jogo usando só um sprite?". A resposta de usar subimages e o "image_index" era óbvia. No entanto, eu quis ser Do Contra, igual ao CQ de formas (todo mundo usando Surface e eu fiz meu jogo inteiro em Drag n' Drop ).
Então, comecei a queimar alguns neurônios pensando em como eu poderia fazer isso sem me perder com trocentas ID's de subimages e sendo diferente da possível maioria. Achei uma função do draw chamada draw_sprite_part, e lá estava a resposta para tudo.
Entendendo um pouco:
Este método que eu vou apresentar para vocês é um pouquinho diferente do que eu fiz para o CQ em si. Enquanto para o meu jogo do CQ eu utilizei a função draw_sprite_part, nesse aqui eu usei o draw_sprite_part_ext. Isso deixou a engine consideravelmente mais difícil de mexer, pois agora você tem a oportunidade de mexer em mais parâmetros, além de não precisar modificar quase nada para mexer com outras coisas (como alpha e image_xscale). Além disso, eu também fiz algumas pequenas alterações para que ela se tornasse pelo menos um "alterador-de-valores". Ou seja, você só precisará alterar os valores de algumas variáveis no Create para mudar cada simples parâmetro.
Uma coisa muito interessante é que ela é muito semelhante ao formato CHR, usado em jogos antigos. O CHR funciona(va) basicamente como um WinRAR, só que utilizando imagens: cada figura era indexada em uma determinada posição, e o software (jogo) apenas precisava "recortá-la" e exibir aquele pedaço. Os tilesets também funcionam assim.
Como implementar:
Bom, a primeira coisa é criarmos a nossa spritesheet. Nesse caso, tenho aqui uma imagem que servirá muito bem de explicação:
O método gira em torno de Slots e Subs. Calma, eu vou explicar:
- Os Slots são um pedaço horizontal, e consomem uma parte inteira. Basicamente, funciona da mesma maneira de quando você salva um sprite animado em PNG no GM. No caso, temos 4 subs, então pode-se dizer que isso seria o equivalente a figura_strip4.
- As Subs são as suas subimages normais. Leve em consideração que eu estou usando 16x16 para explicar, mas é possível alterar o tamanho ao seu gosto. No caso, temos 4 subimages, que eu posso utilizar como animação de algum objeto ou como itens separados. Explicarei isso no script.
- O Slot 0 sempre é reservado para indicar a máscara. Você deverá criar um quadrado/retângulo preto e então definir apenas esta parte como máscara do sprite. Você fará isso clicando no botão "Modify Mask" e mexendo apenas nos valores do Right e do Bottom.
- Por conta do motivo acima: Os Slots das suas figuras sempre começarão a partir do 1. As Subs podem começar naturalmente do 0, mas como eu desenhei aquelas letras ali para indicar, acabaremos tendo que usar 1 também.
Scripts:
Feito isso, agora criamos nosso objeto. Uma coisa importante: não coloque nenhum sprite diretamente nele. Não que tenha problemas, mas você vai se perder todo.
Mas espere: primeiro, vamos criar logo os scripts. Por favor, use os nomes sugeridos :
sa_scp (Sub Animation):
- Spoiler:
- Código:
/*---------------------------------------------------------------------*/
/* sa_scp: Sub Animation */
/*---------------------------------------------------------------------*/
/*--------------SCRIPT DE ANIMAÇÃO POR DRAW_SPRITE_PART----------------*/
/* (By: Mr.Rafael) */
/* (2013 - GMBR | Direitos reservados a mim e ao meu cachorro! :D) */
/* */
/* VISITE MEU PERFIL NA GAME MAKER BRASIL: */
/* http://gmbr.forumeiros.com/u3158) */
/* (http://gamemakerbrasil.com.br/forum/index.php?action=profile;u=12) */
/* */
/* E eu sei que uma boa galera vai falar que eu podia ter optimizado */
/* Isso, aquilo e aquilo outro. Vão me fazer parecer um noob. ;-; */
/*---------------------------------------------------------------------*/
if (run_spd == 0)
{
// Voltar a posição original de contagem
run_spd = sub_spd;
if (sub_actual == sub_end)
{
// Retornar ao início
sub_actual = sub_start;
}
else
{
// Mover a figura
sub_actual += width_slot;
}
}
else
{
// Diminuir contagem do tempo
run_spd -= frame_vel;
}
rp_scp (Receive Parameters):
- Spoiler:
- Código:
/*---------------------------------------------------------------------*/
/* rp_scp: Receive Parameters */
/*---------------------------------------------------------------------*/
/*--------------SCRIPT DE ANIMAÇÃO POR DRAW_SPRITE_PART----------------*/
/* (By: Mr.Rafael) */
/* (2013 - GMBR | Direitos reservados a mim e ao meu cachorro! :D) */
/* */
/* VISITE MEU PERFIL NA GAME MAKER BRASIL: */
/* http://gmbr.forumeiros.com/u3158) */
/* (http://gamemakerbrasil.com.br/forum/index.php?action=profile;u=12) */
/* */
/* E eu sei que uma boa galera vai falar que eu podia ter optimizado */
/* Isso, aquilo e aquilo outro. Vão me fazer parecer um noob. ;-; */
/*---------------------------------------------------------------------*/
// Receber parâmetros (PELAMORDEDEUS NÃO MEXA NISSO! Ò_Ó):
sprite_index = choose_spr;
mask_index = choose_msk;
image_index = choose_sub;
image_speed = choose_spd;
sub_start = width_slot * frame_start;
sub_actual = sub_start;
sub_end = width_slot * (frame_start + frame_end);
sub_spd = frame_spd;
run_spd = sub_spd;
di_scp (Draw Image):
- Spoiler:
- Código:
/*---------------------------------------------------------------------*/
/* di_scp: Draw Image */
/*---------------------------------------------------------------------*/
/*--------------SCRIPT DE ANIMAÇÃO POR DRAW_SPRITE_PART----------------*/
/* (By: Mr.Rafael) */
/* (2013 - GMBR | Direitos reservados a mim e ao meu cachorro! :D) */
/* */
/* VISITE MEU PERFIL NA GAME MAKER BRASIL: */
/* http://gmbr.forumeiros.com/u3158) */
/* (http://gamemakerbrasil.com.br/forum/index.php?action=profile;u=12) */
/* */
/* E eu sei que uma boa galera vai falar que eu podia ter optimizado */
/* Isso, aquilo e aquilo outro. Vão me fazer parecer um noob. ;-; */
/*---------------------------------------------------------------------*/
// Desenhar figura (Não precisa entender... apenas deixe isso aí. ._.):
draw_sprite_part_ext(choose_spr,choose_sub,sub_actual,top_slot,width_slot,height_slot,self.x,self.y,sub_xscale,sub_yscale,sub_color,sub_alpha);
Ok, estes são os scripts. Agora, no Create de cada objeto que você queira colocar, use isto:
- Código:
choose_spr = all_spr; // [X] Definir sprite real (caso haja mudanças)
choose_msk = all_spr; // [X] Definir máscara real (obrigatório para colisões)
choose_sub = 0; // [X] Definir subimage do sprite real (para múltiplos tilesets)
choose_spd = 0; // [X] Definir velocidade do sprite real (para possíveis "swaps" de animação)
sub_xscale = 1; // [X] Definir Xscale da figura (use "1" ou "-1" | caso não queira usar, deixe "1")
sub_yscale = 1; // [X] Definir Yscale da figura (use "1" ou "-1" | caso não queira usar, deixe "1")
sub_color = c_white; // [X] Definir coloração da figura (use c_algumacoisa | caso não queira usar, deixe "c_white")
sub_alpha = 1; // [X] Definir alpha da figura (entre 0 e 1 } caso não queira usar, deixe "1")
width_slot = 16; // [X] Definir largura da figura
height_slot = 16; // [X] Definir altura da figura
top_slot = 16 * 1; // [X] Definir slot das figuras em Top
frame_start = 1; // [X] Definir em qual subimage a animação inicia (caso haja)
frame_end = 0; // [X] Definir em qual subimage a animação termina (frame_start + frame_end)
frame_spd = 0; // [X] Definir a velocidade da subimage (deixe 0 para estático)
frame_vel = 0; // [X] Quantos segundos para completar cada "ciclo de frame". (deixe 0 para estático)
// Receber parâmetros:
script_execute(rp_scp);
Bom: feito isso, agora só precisamos executar os scripts apropriados no Draw. Na engine de exemplo, usei este código aqui:
- Código:
// Script de animação:
script_execute(sa_scp);
// Desenhar figura:
script_execute(di_scp);
Mas algumas coisas importantes: apesar de parecer legal, este recurso usa e abusa do Draw. Então pode ser que seu jogo fique meio pesado. Para finalizar, veja uma diferença entre a room no modo edição e o jogo rodando:
Mas as coisas podem ficar bem divertidas, dependendo do tamanho do seu jogo. Senhoras e senhores: apresentamos os... GLITCHES GRÁFICOS:
Eles representam mais ou menos a forma que os jogos que usavam CHR (jogos em cartucho, principalmente) se comportavam quando seus gráficos corrompiam. Você pode conseguir estes efeitos rabiscando a sua spritesheet ou trocando Slots ou Subs de lugar.
Teste a engine:
Ficou curioso para ver esta linda e maravilhosa
DOWNLOAD DA ENGINE AQUI!
o/
Mr.Rafael- Games Ranking :
Notas recebidas : A-C-B-A-A
Data de inscrição : 05/10/2010
Reputação : 94
Número de Mensagens : 502
Prêmios :
x 0 x 2 x 0
x 1 x 1 x 3
x 0 x 0 x 0
Re: [ENGINE - SCRIPT] Método de draw_sprite_part
Realmente muito bom, meio que em outras linguagens teríamos que fazer isso, desenhar partes da imagem (que é o seu caso), ou desenhar frame por frame (como funciona no Game Maker).
Kapoty- Games Ranking :
Notas recebidas : E + D + C + B + D +B + A
Data de inscrição : 05/11/2011
Reputação : 22
Número de Mensagens : 635
Prêmios :
x 0 x 0 x 0
x 1 x 0 x 1
x 0 x 0 x 0
Re: [ENGINE - SCRIPT] Método de draw_sprite_part
Gostei do método que você utilizou, não é muito difícil e enquanto a maioria iria utilizar image_index você pensou em algo diferente. Parabéns.
Flw.
Flw.
Livsk- Games Ranking :
Notas recebidas : C + C + D + D + D + D + B + B + A + C + B
Data de inscrição : 02/06/2011
Reputação : 13
Número de Mensagens : 365
Prêmios :
x 0 x 0 x 0
x 1 x 0 x 1
x 0 x 0 x 0
Tópicos semelhantes
» [ATUALIZADO][Engine]Novo metodo de colisão!
» HUD Engine [Tululoo Script]
» [Script] + Engine terreno destruivel
» Menu Engine [Tululoo Script]
» [Script]Script de conversão de formato de texto ANSI <--> UTF-8
» HUD Engine [Tululoo Script]
» [Script] + Engine terreno destruivel
» Menu Engine [Tululoo Script]
» [Script]Script de conversão de formato de texto ANSI <--> UTF-8
GMBR :: Ensine & Aprenda :: Exemplos :: Game Maker (engines)
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos