[Resolvido]Vestuario!

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

Resolvido [Resolvido]Vestuario!

Mensagem por Witen em Qui 14 Jun 2012, 19:39

Bom minha duvida é simples ( Eu acho!), Como fazer trés spriters ( Ou mais) abrirem no mesmo objeto?

Aguardando respostas lendo jornal

Edit:

Tive uma ideia, que tal fazer uma objeto para cada parte do corpo do player, é as vestes de cada parte do corpo ser controladas por globais, EX:
Código:
if global.perna=0{
sprite_index=spr_perna
if global.lado=0{
image_single = 0}}

Global.perna são os tipos de perna que o usuário pode vestir
Global.lado são as direções que o player esta

Cada parte do corpo tem 6 spriters de frente, lado, de costas, inclinado frente é atras...

Mas o grande problema seria fazer com que cada parte do corpo acompanhasse a outra na posição certa =/


Última edição por Witen em Seg 18 Jun 2012, 09:14, editado 1 vez(es)

Witen

Ranking : Sem avaliações
Número de Mensagens : 515
Idade : 17
Data de inscrição : 23/05/2012
Reputação : 36
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://www.wibix.webs.com

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Vestuario!

Mensagem por Super Maker em Qui 14 Jun 2012, 21:04

Tem uma outra opção pra um só objeto.
Create:
Código:
braco=spr_braco;
perna=spr_perna;
Draw:
Código:
draw_sprite(braco,image_index,obj_jogador.x,obj_jogador.y);
draw_sprite(braco,image_index,obj_jogador.x,obj_jogador.y);

Super Maker

Número de Mensagens : 646
Idade : 33
Data de inscrição : 09/07/2011
Reputação : 6
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Vestuario!

Mensagem por Witen em Qui 14 Jun 2012, 21:22

Um interessante...

draw_sprite(sprite,subima,x,y);

Essa função pode ajudar...

Mas...( Esse mas "Fia da mãe" tende a atrapalhar) nas posições o seu código seguira o objeto mas não sua posição certa, o sprite irar ficar louco( perna na cabeça braço na barriga). E se eu trocasse x,y para definir a posição iria definir a posição da room ou da distancia de cada objeto?

Witen

Ranking : Sem avaliações
Número de Mensagens : 515
Idade : 17
Data de inscrição : 23/05/2012
Reputação : 36
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://www.wibix.webs.com

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Vestuario!

Mensagem por Super Maker em Qui 14 Jun 2012, 21:31

O que eu fiz foi te dar a ideia de usar esse sistema, o X e Y você é quem vai acertar no corpo do jogador.
Como essas sprites tem que seguir o jogador é melhor usar o "jogado.posição" e como não da pra usar depth em um só objeto. Você pode trocar quando precizar as sprites do braço direito com esquerdo e o mesmo digo das pernas.

Super Maker

Número de Mensagens : 646
Idade : 33
Data de inscrição : 09/07/2011
Reputação : 6
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Vestuario!

Mensagem por Witen em Qui 14 Jun 2012, 21:46

jogador.posição

Boa ideia! Se eu estiver certo os spriters seguirão o player na posição desejada Happy! ainda hoje ou amanha eu testo para ver se esta tudo certo!

Witen

Ranking : Sem avaliações
Número de Mensagens : 515
Idade : 17
Data de inscrição : 23/05/2012
Reputação : 36
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://www.wibix.webs.com

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Vestuario!

Mensagem por saim em Sex 15 Jun 2012, 08:56

Em jogos em que as posições de cada membro independe das demais (por exemplo, os braços apontam para o mouse enquanto as pernas respondem ao teclado), a idéia do Super Maker é a mais indicada. Você define pontos de âncora pra fixar suas sprites e usa esses valores pra desenhar cada sprite. Exemplo:
create:
Código:
xBracoEsquerdo = -10; yBracoEsquerdo = 0;
xBracoDireito = 10; yBracoDireito = 0;
Draw:
Código:
draw_sprite(spr_tronco, image_index, x, y);
draw_sprite(spr_bracoEsquerdo, image_index, x + xBracoEsquerdo, y + yBracoEsquerdo);
draw_sprite(spr_bracoDireito, image_index, x + xBracoDireito, y + yBracoDireito);
(na verdade, esses casos costumam requerer draw_sprite_ext, mas como exemplo, acho que deu pra entender)

Mas há jogos em que você só quer uma personalização da sprite. Na verdade, as sprites sempre terão as mesmas posições, alterando apenas a cor, o tamanho, o formato de uma armadura... só uns detalhes. Nesses casos, eu recomendaria refazer as sprites, desenhando cada pedaço delas em surfaces e criando as sprites a serem usadas no jogo através do comando sprite_create_from_surface. Isso reduziria seu draw_event e talvez até o trabalho na hora de programar. O custo é alguns instantes de processamento no início do jogo, talvez até alguns segundos numa tela de "loadind", se for uma quantidade absurda de sprites.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Vestuario!

Mensagem por Witen em Sex 15 Jun 2012, 09:11

São na verdade 10 partes:

Código:
global.cabeca=0
global.panturilha=0
global.mao=0
global.olhos=0
global.batata=0
global.pes=0
global.cabelo=0
global.peito=0
global.peitoral=0
global.boca=0

cada parte tem 3 lados...

Isso também estava pensando, criar um global para as cores Happy' c_black, c_blue, etc...

Witen

Ranking : Sem avaliações
Número de Mensagens : 515
Idade : 17
Data de inscrição : 23/05/2012
Reputação : 36
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://www.wibix.webs.com

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Vestuario!

Mensagem por saim em Sex 15 Jun 2012, 10:18

Witen escreveu:São na verdade 10 partes
Claro que um exemplo é só um exemplo. Se você pegou a idéia, não vai ter dificuldade em extender o raciocínio às demais partes

Witen escreveu:cada parte tem 3 lados...
Como assim?

Witen escreveu:Isso também estava pensando, criar um global para as cores Happy' c_black, c_blue, etc...
Isso é bacana, desde que seja aplicado apenas em parte da sprite (por exemplo, alguns detalhes da armadura). Usar image_blend na imagem inteira me soa como um truque barato. Tenho a impressão que vai soar assim ao jogador, também.
Lembre-se que usar image_blend implica, na verdade, em alterar a cor original, não em colorir a imagem. Assim, uma imagem (ou pedaço de imagem) em tons de cinza funciona perfeitamente com image_blend, ao passo que uma imagem colorida vai ficar estranha.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Vestuario!

Mensagem por Witen em Sex 15 Jun 2012, 10:36

Witen escreveu:
cada parte tem 3 lados...
Como assim?

São na verdade 4 lados de frente, costas, horizontal é horizontal de costas.
As globais irão controlar a posição, lado, cor é tipo...

Quando termina o vestuário vou criar um script para facilitar a vida de quem quer fazer a mesma coisa, por que é bem trabalhoso!

Witen

Ranking : Sem avaliações
Número de Mensagens : 515
Idade : 17
Data de inscrição : 23/05/2012
Reputação : 36
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://www.wibix.webs.com

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Vestuario!

Mensagem por PedroX em Sex 15 Jun 2012, 10:44

Olha, eu recomendaria você criar um objeto para cada parte.
Por quê? Por causa da simplicidade.

Com objetos, você poderia criar um objeto cabeça. Ele seria o único a ser colocado na room.

Depois, você colocaria no seu Create:

Código:
braco1 = instance_create(x,y, obj_braco1)
braco2 = instance_create(x,y, obj_braco2)
perna1 = instance_create(x,y, obj_perna1)
tronco = instance_create(x, y, tronco)

O resto não será necessário, pois você pode criar várias sub-imagens diferentes para a cabeça, para as pernas, para o tronco, para os braços. Lembrando que o tronco envolve tudo que não é a cabeça (e o pescoço), as pernas e os braços.

Agora você põe no Draw de cada objeto:
Código:
draw_sprite(sprite_index, image_index, x, y)

Conforme você for mudando os sprites, você faz pela cabeça:
Código:
 if clicou_na_onde_muda obj_braco1.image_index = 5;

Lembre-se de colocar image_speed = 0 em cada objeto.

Além disso, para que eles sigam a cabeça, basta por no Step que o x e o y deles é igual ao da cabeça mais um valor relativo.

Até mais!

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Vestuario!

Mensagem por saim em Sex 15 Jun 2012, 10:58

Trabalhoso é pouco, o serviço braçal envolvido é enorme! Mas acho que, infelizmente, seu script não vai ajudar ninguém. O trabalho maior está em definir quais sprites devem ser separadas e depois, definir cada um dos valores das coordenadas. Isso é diferente pra cada caso, não vejo como criar um script genérico que facilite a vida.

Agora entendi o que você quis (quiz?) dizer com os "lados". Lembre-se de levar em conta, então, que cada "lado" vai ter uma posição diferente. Na hora de programar, isso pode ser facilitado com o uso de arrays
Código:
draw_sprite(spr_bracoDireito[lado], image_index, x + xBracoDireito[lado], y + yBracoDireito[lado]);
mas criar essas arrays dá o mesmo trabalho que definir variáveis específicas.

Ah, enquanto eu escrevia, o Pedrø postou essa mensagem acima. Eu ia dizer que a dificuldade é a mesma, mas depois me lembrei de um detalhe: colisões! Pras colisões serem precisas, você precisa de uma mask mutável. Pra ter uma mask que acompanha a movimentação de cada parte do jogador, você realmente precisa de um objeto com sprite_index pra cada membro.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Vestuario!

Mensagem por Witen em Sex 15 Jun 2012, 11:20

Trabalhoso é pouco, o serviço braçal envolvido é enorme! Mas acho que, infelizmente, seu script não vai ajudar ninguém. O trabalho maior está em definir quais sprites devem ser separadas e depois, definir cada um dos valores das coordenadas. Isso é diferente pra cada caso, não vejo como criar um script genérico que facilite a vida.
É verdade! um script não iria ajudar mas uma engine, sim!
Agora entendi o que você quis (quiz?) dizer com os "lados". Lembre-se de levar em conta, então, que cada "lado" vai ter uma posição diferente. Na hora de programar, isso pode ser facilitado com o uso de arrays
CÓDIGO:
draw_sprite(spr_bracoDireito[lado], image_index, x + xBracoDireito[lado], y + yBracoDireito[lado]);
mas criar essas arrays dá o mesmo trabalho que definir variáveis específicas.

Nem acro trabalhoso é sim demora demais '-'. vou ter que sair pra escola agora de noite eu faço.

Ah, enquanto eu escrevia, o Pedrø postou essa mensagem acima. Eu ia dizer que a dificuldade é a mesma, mas depois me lembrei de um detalhe: colisões! Pras colisões serem precisas, você precisa de uma mask mutável. Pra ter uma mask que acompanha a movimentação de cada parte do jogador, você realmente precisa de um objeto com sprite_index pra cada membro.

Agora que vi com vários objetos não da! talvez eu resolva quando voltar da escola fui!

Witen

Ranking : Sem avaliações
Número de Mensagens : 515
Idade : 17
Data de inscrição : 23/05/2012
Reputação : 36
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://www.wibix.webs.com

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Vestuario!

Mensagem por saim em Sex 15 Jun 2012, 14:05

Witen escreveu:Agora que vi com vários objetos não da!
Dar, dá. É uma questão de COMO você quer fazer, o resultado que você espera. É aquela conversa que eu falei antes: se os membros do personagem podem se comportar de forma diferente, aí o melhor sem dúvida é tratar cada membro individualmente - seja desenhando eles a partir do mesmo objeto, seja fazendo objetos individuais. A meu ver, criar objetos individuais te dá essa vantagem das collision_masks serem separadas, mais nada. O resto, acho mais fácil de operar a partir de um objeto só; você pode até usar comandos como
Código:
obj_bracoEsquerdo.image_angle = point_direction(obj_bracoEsquerdo.x, obj_bracoEsquerdo.y, mouse_x, mouse_y);
isso pode ser colocado em qualquer objeto.



Agora, se o que você quer é simplesmente deixar o jogador personalizar um capacete, por exemplo, é mais fácil criar o conjunto de sprites do personagem logo na inicialização do jogo. Você faz uma surface limpa pra isso, depois vai desenhando cada uma das sprites, cria uma sprite pra ser o jogador completo. Depois limpa a surface, desenha todas as sprites de novo, cria o segundo image_index daquela mesma sprite. Repita o processo pra cada sprite do jogador - andando de lado, atacando de frente, defendendo de costas, tudo - e grava essas sprites. Pode ser como imagem mesmo (pra agilizar o carregamento da próxima vez que o jogador for jogar) ou só como variáveis pra serem chamadas durante o jogo (o que te obriga a repetir o processo da próxima vez que o jogador for jogar).

Se achar que vale a pena, você pode NÃO criar sprite nenhuma e só criá-las à medida que elas forem necessárias. A cada mudança de sprite, você verifica se a sprite existe e, só se não existir, ela passa pelo processo de ser criada. Se for uma quantidade absurda de sprites (não uma quantidade absurda de combinações possíveis) isso pode valer a pena.

Lembre-se que criar sprites e surfaces requer um pouco mais de responsabilidade. Lembre-se de deletar as surfaces quando elas não tiverem mais utilidade (quando você já tiver criado as sprites) e o mesmo com as sprites (quando o jogador alterar o personagem, por exemplo).
Atribuir uma nova sprite a uma variável NÃO É o mesmo que deletar a sprite.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Vestuario!

Mensagem por Witen em Sex 15 Jun 2012, 18:45

Ah! só fauta isso pra concluir a versão beta do Smadol é der repente da esse erro '-'
___________________________________________
ERROR in
action number 2
of Draw Event
for object obj_player:

Trying to draw non-existing sprite.

Eu já desenhei os spriters o que a de errado!

Estou usando esse códigos no player:

Create:
Código:
//vestes
global.cabeca=0
global.panturilha=0
global.mao=0
global.olhos=0
global.batata=0
global.pes=0
global.cabelo=0
global.peito=0
global.peitoral=0
global.boca=0
global.cores=0

Step:
Código:
//vestes

//Cabeça
global.cabeca=0{global.cabeca=m_cabeca}
//Panturilha
global.panturilha=0{global.panturilha=m_panturilha}
//Mão
global.mao=0{global.mao=m_mao}
//Olhos
global.olhos=0{global.olhos=m_olho}
//Batata
global.batata=0{global.batata=m_batata}
//Pés
global.pes=0{global.pes=m_pulso}
//Cabelo
global.cabelo=0{global.cabelo=m_cabeca}
//Peito
global.peito=0{global.peito=m_peitoral}
//Peitoral
global.peitoral=0{global.peitoral=m_peitoral}
//Boca
global.boca=0{global.boca=m_boca}
//Cores
global.cores=0{global.cores=c_black}
Draw:
Código:
draw_sprite(global.cabeca,image_index,30,0);
draw_sprite(global.panturilha,image_index,5,100);
draw_sprite(global.mao,image_index,x,y);
draw_sprite(global.olhos,image_index,x,y);
draw_sprite(global.batata,image_index,obj_player.x,obj_player.y);
draw_sprite(global.pes,image_index,obj_player.x,obj_player.y);
draw_sprite(global.cabelo,image_index,obj_player.x,obj_player.y);
draw_sprite(global.peito,image_index,obj_player.x,obj_player.y);
draw_sprite(global.peitoral,image_index,obj_player.x,obj_player.y);
draw_sprite(global.boca,image_index,obj_player.x,obj_player.y);

Witen

Ranking : Sem avaliações
Número de Mensagens : 515
Idade : 17
Data de inscrição : 23/05/2012
Reputação : 36
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://www.wibix.webs.com

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Vestuario!

Mensagem por saim em Seg 18 Jun 2012, 08:35

O draw acontece antes do step. Como você declarou que as sprites todas são "0", não deve existir uma sprite com o índice 0.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Vestuario!

Mensagem por luiz_eldorado em Seg 18 Jun 2012, 08:48

saim escreveu:O draw acontece antes do step. Como você declarou que as sprites todas são "0", não deve existir uma sprite com o índice 0.
Não... não pode ser! Isto está no manual:
Manual escreveu:In some situation it is important to understand the order in which Game Maker processes the events. This is as follows:

Begin step events
Alarm events
Keyboard, Key press, and Key release events
Mouse events
Normal step events
(now all instances are set to their new positions)
Collision events
End step events
Draw events
Como podem ver, o Draw é sempre o ultimo à ser executado, A MENOS que seja chamado pelo event_perform() ou screen_redraw(). Esse último executa o Draw de TODOS os objetos, não só do atual. Talvez esse seja o problema.


Última edição por luiz_eldorado em Seg 18 Jun 2012, 08:58, editado 2 vez(es) (Razão : 1-Já ia me esquecendo do "Até mais!"...; 2-Quer saber? Não vou mais usar o "Até mais!", já ficou chato. Não sei, me deu uma vontade de não usar...)

luiz_eldorado

Ranking : Nota C
Número de Mensagens : 928
Idade : 18
Data de inscrição : 30/07/2011
Notas recebidas : C
Reputação : 47
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 1

http://luizpontes.tk/

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Vestuario!

Mensagem por Witen em Seg 18 Jun 2012, 09:13

saim escreveu:O draw acontece antes do step. Como você declarou que as sprites todas são "0", não deve existir uma sprite com o índice 0.

São todas 0 mas as globais são diferentes... podem fechar o tópico!

Witen

Ranking : Sem avaliações
Número de Mensagens : 515
Idade : 17
Data de inscrição : 23/05/2012
Reputação : 36
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://www.wibix.webs.com

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Vestuario!

Mensagem por saim em Seg 18 Jun 2012, 09:43

@luiz_eldorado: embora essa ordem do manual esteja correta, ela não poderia ser mais incompleta. Existem dezenas de eventos que não estão listados e um deles é bem comum: o create event. Eu já vi uma lista bem mais completa (feita por membros da GMC) que precisava de algumas páginas pra ser impressa - e ainda assim omitia alguns eventos.
Depois, perdi essa lista e nunca mais encontrei. Se alguém souber do que se trata, por favor me mande um link, porque ela é bem útil. Até alguém apresentar uma lista com TODOS os eventos, esse é um assunto pra horas.

Por experiência própria, eu sei que variáveis declaradas no step não serão reconhecidas em draw. Quer dizer, elas serão reconhecidas se eu ignorar o erro que aparece no primeiro step. Supus que fosse o mesmo problema que o Witen estivesse experimentando. Isso me leva a crer que o create event acontece, depois o primeiro draw event, e depois o loop apresentado no manual. Isso manteria o que o manual apresenta como verdadeiro, ou pelo menos MEIO verdadeiro, já que num loop infinito, não existe PRIMEIRO nem ÚLTIMO evento, apenas uma ordem em que eles ocorrem.

Eu já percebi que quando eu escrevo a respeito de dados técnicos, tenho a tendência de soar arrogante. Espero que isso não tenha acontecido nessa mensagem, mas se aconteceu, peço desculpas. Minha intenção é só colocar um pouco mais de informação do que o manual nos dá. O assunto é interessante demais pra eu deixar passar em branco.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido]Vestuario!

Mensagem por Conteúdo patrocinado Hoje à(s) 12:45


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