GMBR
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.
Entrar

Esqueci-me da senha

Últimos assuntos
» player não consegue andar
por lovn7 Qui 21 Nov 2024, 13:33

» É possível fazer istó no game maker
por William Lima Qui 21 Nov 2024, 10:56

» Rio Rise - novo launcher do Gta San Andreas SAMP Brasil
por Lua Sáb 16 Nov 2024, 20:22

» (Resolvido) Cenario longo x Texture Pages
por josuedemoraes Sáb 16 Nov 2024, 15:31

» Kids' band
por Adilson Lucindo Santos Sex 15 Nov 2024, 12:23

» (RESOLVIDO) Engasgos-Troca de Sprites/animações
por josuedemoraes Ter 12 Nov 2024, 01:49

» Block Room - DEMO
por Joton Qua 06 Nov 2024, 22:58

» Game Infinito vertical (subindo)
por macmilam Sáb 26 Out 2024, 12:36

» Retorno da GMBR!!!
por Dancity Ter 22 Out 2024, 16:36

» Máquina de estados
por aminaro Qui 10 Out 2024, 13:33

» como faço pra um objeto colidir com o outro e diminuir a vida do player ?
por josuedemoraes Qui 03 Out 2024, 16:51

» RESOLVIDO: Colisão com objetos moveis
por josuedemoraes Qua 02 Out 2024, 20:28

» Crypt of the Blood Moon
por divin sphere Qua 11 Set 2024, 18:18

» como fazer um objeto seguir?
por divin sphere Dom 18 Ago 2024, 18:08

» Procuro de alguém para Modelar/Texturizar/Animar objetos 3D
por un00brn Dom 11 Ago 2024, 11:10

» Destruição de cenário (estilo DD Tank)
por CoronelZeg Sex 09 Ago 2024, 17:16

» RESOLVIDO-Como destruir uma instancia especifica de um objeto
por josuedemoraes Ter 23 Jul 2024, 00:40

» Automatizar a coleta de id
por GabrielXavier Seg 22 Jul 2024, 18:01

» Preciso de ajuda para concluir um pequeno projeto
por lmoura Qui 27 Jun 2024, 15:45

» ANGULO ACOMPANHAR O OBJETO
por Klinton Rodrigues Qui 27 Jun 2024, 08:34

» Musica reinicia quando sala reinicia
por GabrielXavier Ter 18 Jun 2024, 07:28

» como fazer uma copia de gd
por generico_cube Sex 14 Jun 2024, 15:48

» Square Adventure
por guilherme551 Ter 11 Jun 2024, 09:54

» como posso definir limite de uma variavel
por GabrielXavier Sex 07 Jun 2024, 14:14

» [Resolvido] Dúvida, colisão única de objeto
por vdm842 Sex 24 maio 2024, 09:50


[ENGINE - SCRIPT] Método de draw_sprite_part

3 participantes

Ir para baixo

[ENGINE - SCRIPT] Método de draw_sprite_part Empty [ENGINE - SCRIPT] Método de draw_sprite_part

Mensagem por Mr.Rafael Seg 19 Ago 2013, 12:07

Método de draw_sprite_part:
(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 Laughing).

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. Cool

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:
[ENGINE - SCRIPT] Método de draw_sprite_part WHLnVAT50

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. Very Happy

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 Rolling Eyes:

sa_scp (Sub Animation):
Spoiler:

rp_scp (Receive Parameters):
Spoiler:

di_scp (Draw Image):
Spoiler:

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);
Aqui você definirá absolutamente TODOS os parâmetros da figura: quanto ela tem de largura, quanto ela tem de altura, em que Sub ela inicia, de qual Slot faz parte, qual a velocidade dela, etc. Uma observação básica: o script utilizado por mim para meu jogo do CQ é mais básico que isso. No entanto, eu fiz umas melhorias para que ele ficasse mais fácil de ser compreendido e que mais coisas pudessem ser feitas na imagem.

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);
Bem pequeno, não é? Sim, tanto na parte do código do Draw como nos próprios scripts em si.
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:
[ENGINE - SCRIPT] Método de draw_sprite_part PFzlYb

Mas as coisas podem ficar bem divertidas, dependendo do tamanho do seu jogo. Senhoras e senhores: apresentamos os... GLITCHES GRÁFICOS:
[ENGINE - SCRIPT] Método de draw_sprite_part OW9lBxn34

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. Very Happy

Teste a engine:

Ficou curioso para ver esta linda e maravilhosa gambiarra engine? Pode baixá-la:

DOWNLOAD DA ENGINE AQUI!

o/
Mr.Rafael
Mr.Rafael

Games Ranking : Nota A

Notas recebidas : A-C-B-A-A
Data de inscrição : 05/10/2010
Reputação : 94
Número de Mensagens : 502
Prêmios : [ENGINE - SCRIPT] Método de draw_sprite_part Empty

Medalhas x 0 Tutoriais x 2 Moedas x 0

Ouro x 1 Prata x 1 Bronze x 3

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

Ir para o topo Ir para baixo

[ENGINE - SCRIPT] Método de draw_sprite_part Empty Re: [ENGINE - SCRIPT] Método de draw_sprite_part

Mensagem por Kapoty Seg 19 Ago 2013, 19:34

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
Kapoty

Games Ranking : Nota B

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 : [ENGINE - SCRIPT] Método de draw_sprite_part Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 1 Prata x 0 Bronze x 1

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

Ir para o topo Ir para baixo

[ENGINE - SCRIPT] Método de draw_sprite_part Empty Re: [ENGINE - SCRIPT] Método de draw_sprite_part

Mensagem por Livsk Seg 19 Ago 2013, 20:00

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.
Livsk
Livsk

Games Ranking : Nota C

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 : [ENGINE - SCRIPT] Método de draw_sprite_part Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 1 Prata x 0 Bronze x 1

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

Ir para o topo Ir para baixo

[ENGINE - SCRIPT] Método de draw_sprite_part Empty Re: [ENGINE - SCRIPT] Método de draw_sprite_part

Mensagem por Conteúdo patrocinado


Conteúdo patrocinado


Ir para o topo Ir para baixo

Ir para o topo

- Tópicos semelhantes

 
Permissões neste sub-fórum
Não podes responder a tópicos