Rotacionar um grupo de sprites, como uma imagem em bloco.

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

Rotacionar um grupo de sprites, como uma imagem em bloco.

Mensagem por telles0808 em Ter 18 Jan 2011, 13:01

Para ficar mais simples de entender.

Gostaria de saber se é possível compor uma imagem com várias sprites, depois manipular a imagem resultante.

Quero fazer isto para promover animações de sub blocos de sprites, do tipo, braço balançando, movendo, etc, e depois juntá-lo a imagem final que será mostrada ao player, porém, quando precisar, por exemplo, rotacionar a imagem 360º, ele irá rotacionar tudo, sem a necessidade de rotacionar individualmente cada sprite. O problema não é tão simples, não quero colocar uma variável lá no campo rotate, pois o braço tem o center point com offset do centro do corpo do player, ou seja, se fizesse isso, iria virar uma bagunça.

O arquivo do jogo de teste está em anexo.
http://www.megaupload.com/?d=GW5IFEOR

--------------
Resumidamente.
Gostaria de saber se é possível fazer blocos de sprites para poder produzir esse tipo de efeito.





O ponto azul é o ponto central do corpo, mas alinhei a sprite do braço no ponto vermelho, e o ponto amarelo é o pto central da arma, que gostaria que seguisse como um bloco (conjunto de braço+arma) o braço nas rotações e movimentações.


Última edição por telles0808 em Ter 18 Jan 2011, 14:23, editado 2 vez(es)

telles0808

Número de Mensagens : 22
Data de inscrição : 14/01/2011
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Re: Rotacionar um grupo de sprites, como uma imagem em bloco.

Mensagem por Markituh em Ter 18 Jan 2011, 13:05

Hmm... Você quer rotacionar a arma tipo, em direção ao mouse? Se for, ainda dá pra usar o conceito do draw_sprite_ext, só colocar um point_direction no argumento rot.
Código:
draw_sprite_ext(sprite,subimagem,image_xscale,image_yscale,point_direction(x,y,mouse_x,mouse,y),color,alpha)

___________

"Não deixe para amanhã o que se pode fazer hoje"

Links úteis:
Índice de Tutoriais
Manual online do GMS

Markituh

Ranking : Sem avaliações
Número de Mensagens : 2183
Data de inscrição : 11/10/2009
Reputação : 106
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Rotacionar um grupo de sprites, como uma imagem em bloco.

Mensagem por telles0808 em Ter 18 Jan 2011, 13:22

não, tipo, vou fazer uma gif.





O ponto azul é o ponto central do corpo, mas alinhei a sprite do braço no ponto vermelho, e o ponto amarelo é o pto central da arma, que gostaria que seguisse como um bloco (conjunto de braço+arma) o braço nas rotações e movimentações. Porque senão será um tormento fazer animações de batalha.

telles0808

Número de Mensagens : 22
Data de inscrição : 14/01/2011
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Re: Rotacionar um grupo de sprites, como uma imagem em bloco.

Mensagem por Markituh em Ter 18 Jan 2011, 13:29

Hmmm... Você pode tipo, usar variáveis que armazenam cada parte. Como vi numa dúvida sua anterior, você está usando várias variáveis para controlar cada membro do player, o que é um sistema que até eu não sei fazer Happy Então só desenhar tomando base num membro já existente, como o corpo:
Código:
draw_sprite(braço,0,corpo_x,corpo_y+10
draw_sprite(arma,0,corpo_x+5,corpo_y+10)

___________

"Não deixe para amanhã o que se pode fazer hoje"

Links úteis:
Índice de Tutoriais
Manual online do GMS

Markituh

Ranking : Sem avaliações
Número de Mensagens : 2183
Data de inscrição : 11/10/2009
Reputação : 106
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Rotacionar um grupo de sprites, como uma imagem em bloco.

Mensagem por telles0808 em Ter 18 Jan 2011, 13:34

o desenho na verdade está pronto, agora estou na parte de animação, por exemplo, preparei várias poses de ataque, todas elas envolvem rotacionar o braço e mover a arma de forma ancorada ao braço, mas fazer isso não é tão simples, quer ver, por exemplo, se eu mover o braço pra esquerda e rotacionar ele, a arma precisará subir e ir pra esquerda, além de rotacionar também, acaba que o tranjeto é uma tangente ao ângulo, mas se eu rotacionar o braço 360º, a arma precisará fazer um percurso circular, rotacionando ao mesmo tempo, ai começa a complicar demais, pois se além de eu rotacionar 360º e mover para a direita, por exemplo, a arma precisará fazer um percurso circular oval e rotacionar com velocidades diferentes, ou seja, um pesadelo.

telles0808

Número de Mensagens : 22
Data de inscrição : 14/01/2011
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Re: Rotacionar um grupo de sprites, como uma imagem em bloco.

Mensagem por Igor KinGamer em Ter 18 Jan 2011, 13:37

telles0808 escreveu:Agora estou animando esse personagem por script, e, queria rotacionar esse braço, mas o script ficou enorme, já que ao rotacionar ele, eu preciso rotacionar a arma e mover a arma fazendo a hipotenusa como percurso, ou seja, um saco.

Eu já fiz esse tipo de coisa, não fica um script enorme, nem ao menos grande Suspect

Suponhamos que você tenha o sprite do braço de largura 64 pixels e altura 16 pixels (o braço virado para a direta), origin (8, 8­), e o sprite da arma de tamanho qualquer que vá ser posicionado no ponto (56, 8­) do braço (também virada para a direita no sprite).

Eis os códigos:

Create:
balanco = 0; // Variável utilizada para calcular direção do braço
angulo = 30; // Ângulo até o qual o braço balança para frente e para trás

Draw:
braco_x = mouse_x; // Aqui você colocaria
braco_y = mouse_y; // a posição do ombro

balanco += 2*pi/(2*room_speed);
// 2*pi equivale a um balanço completo (para frente e para trás). Multiplique pela quantidade de balanços que você quer por step. (Portanto, dividindo por 2*room_speed, você tem um balanço por 2 segundos).
direction = 270+sin(balanco)*angulo;
// Define a direção (para baixo (270) mais seno da variável balanço multiplicado pelo ângulo do balanço.
draw_sprite_ext(spr_Braco, 0, braco_x, braco_y, 1, 1, direction, c_white, 1);

arma_x = braco_x+cos(direction*pi/180)*48; // 48 é o tamanho do braço menos a origin e deixando 8 pixels no final.
arma_y = braco_y-sin(direction*pi/180)*48;
draw_sprite_ext(spr_Arma, 0, arma_x, arma_y, 1, 1, direction, c_white, 1);


Se quisesse ainda fazer rotação do braço e antebraço, era só seguir a mesma lógica.

Igor KinGamer

Número de Mensagens : 890
Idade : 21
Data de inscrição : 26/09/2008
Reputação : 11
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Rotacionar um grupo de sprites, como uma imagem em bloco.

Mensagem por telles0808 em Ter 18 Jan 2011, 13:59

valeu igor, ainda não é bem isso que procuro, na verdade sei o que quero, só não sei fazer em GML.

Se eu fosse seguir tua lógica, só no stand_by eu teria quase 50 linhas de script, fora andando, ataque1, 2, 3, 4, 5, etc, salto, queda, aterrissagem, correndo, salto correndo, etc. Pois há dois braços, e o segundo terá arma em alguns momentos também.

Meu intuito é fazer tudo igual foi feito no Flash, em módulos, lá eu desenhei o braço em um bloco, a arma dentro de um sub_bloco e o grande bloco braço + arma foi colocado no bloco body, então se eu quiser girar o corpo inteiro, basta fazer no action script a rotação e pronto, ele se encarrega de girar todos os sub_blocos relativamente, como se o bloco body fosse uma imagem plana, não modular. Aí se eu quero simplesmente girar o braço e fazer animações nele, independentemente do corpo, eu vou lá dentro do bloco do braço e faço, depois no bloco body eu ainda fiz outra animação, que foi pra cima e para baixo, sendo que dentro do bloco do braço a animação era uma leve rotação.

Pensando em módulos eu fiz a animação do braço para ataque1, que era braço dobrado, medianamente dobrado e esticado, posicionei a arma em cada um desses quadros no ponto amarelo e depois sai do bloco de braço_atk1 e fui para o body (que contem o tronco, cabeça, braços e pernas) e modifiquei a imagem resultante do bloco braço_atk1, rotacionando ele e dando um stretch leve para dar efeito de musculatura.

No ataque2, utilizei o mesmo bloco do braço_atk1, mas no body eu fiz outros efeitos de stretch e rotação, se você olhar as animações, não dirá que usam os mesmos gráficos, apesar de usarem, e nisso economizei toneladas de scripts de rotações individuais, offsets, posicionamentos, etc, pois não se trata só do braço, mas de tudo junto trabalhando em módulos.

telles0808

Número de Mensagens : 22
Data de inscrição : 14/01/2011
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Re: Rotacionar um grupo de sprites, como uma imagem em bloco.

Mensagem por Igor KinGamer em Ter 18 Jan 2011, 19:45

Eu não entendo nada de Flash como nunca usei-o, mas acho que entendi a ideia da coisa.
Os únicos jeitos que me vieram à cabeça são:

Usar variáveis para definir a posição (x, y) do corpo, do braço em relação ao corpo e da mão em relação ao braço e a rotação desses e, na hora de desenhar, usar aquela lógica que mostrei (usando as variáveis de posição e rotação do corpo e do braço na hora de desenhar este, e as variáveis do corpo, do braço e da arma na hora de desenhar esta)
Deste modo, uma alteração no ângulo do braço mecheria com a arma por a variável dele estar sendo usada no draw dela, sem afetar o corpo, e não impediria a arma de girar sozinha.
Para fazer aquela coisa de mover para cima e para baixo, seria só usar a variável de deslocamento igualmente no braço e arma.
Quando você quisesse mudar a animação (ataque, por exemplo), teria apenas que mudar o ângulo do braço e a posição da arma em relação a ele.

O código da arma ficaria algo assim:

draw_sprite_ext(WEAPONS, 0, corpo_x+cos(corpo_angulo)*braco_x+cos(braco_angulo)*arma_x, corpo_y-sin(corpo_angulo)*braco_y-sin(braco_angulo)*arma_y, 1, 1, arma_angulo, c_white, 1);
// Er... Esse código está bem errado, não pensei direto antes de fazer... Mas a ideia e usar todas as variáveis para desenhar...
Estou refazendo e já posto.


Um detalhe é que você teria que deixar os códigos todos prontos, mesmo nos momentos em que não houvesse arma no braço de trás.

-/-

O outro jeito seria fazer cada parte do corpo um objeto diferente. Então, quando você quisesse que um objeto controlasse os outros, você faria-os "filhos" dele (não estou falando da opção "parent"), e usaria em todos os objetos um script que alteraria automaticamente a posição de todos os objetos filhos do objeto (um script só para todos).
Apesar de a quantidade de objetos ser um ponto negativo, isso te daria mais liberdade, se quisesse, poderia até fazer um braço filho de outro braço (por mais inútil que isso seja), sem ter que criar variáveis específicas (como no outro modo que eu sugeri).


Não sei se um desses jeitos vai servir para você, espero que sim. Se não... bem, eu tentei.


PS.: Você que fez todos aqueles sprites? Estão muito bons Smile


Última edição por Igor KinGamer em Ter 18 Jan 2011, 20:10, editado 2 vez(es)

Igor KinGamer

Número de Mensagens : 890
Idade : 21
Data de inscrição : 26/09/2008
Reputação : 11
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Rotacionar um grupo de sprites, como uma imagem em bloco.

Mensagem por telles0808 em Ter 18 Jan 2011, 19:52

sim, fiz.

Mas bah, então ficou muito mais dificil usar o GM para fazer esse jogo.

Acho que vou continuar no flash e aprender action script 3, pq o dois ficou muito pesado para fazer jogos.

Valeu por tudo!

telles0808

Número de Mensagens : 22
Data de inscrição : 14/01/2011
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Re: Rotacionar um grupo de sprites, como uma imagem em bloco.

Mensagem por Anderson3d em Ter 18 Jan 2011, 20:12

Que é possível é, mas é bem complicado. Eu criei ontem de noite um inimigo no meu jogo, veja:

Existe um corpo que é uma espécie de planador e existe um braço mecânico que é uma metralhadora que muda de ângulo de acordo com a posição do player. o planador só faz subir e descer levemente e ir pros lados e mesmo assim deu um trabalho enorme.
Basicamente na colisão do braço mecânico com o corpo eu coloquei
Código:

x=other.x+35
y=other.y
Ou seja eu centrei o eixo do braço na posição que eu quiz no corpo.
Caso o corpo mude o ângulo vc tem que mudar o angulo do braço tmb (no seu caso).
Mas lembrando, quando o corpo muda de lado o braço tmb muda, o xscale tmb (-1 ou 1).
No seu caso controlar todos os membros e a cabeça junto a um corpo seria osso, mas é possível. Se eu tiver tempo posso "tentar" criar uma engine disso. É bem interessante.

Anderson3d

Ranking : Nota A
Número de Mensagens : 1479
Idade : 33
Data de inscrição : 15/02/2009
Notas recebidas : A - A
Reputação : 9
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 1

http://www.indiegamebr.com

Voltar ao Topo Ir em baixo

Re: Rotacionar um grupo de sprites, como uma imagem em bloco.

Mensagem por Markituh em Ter 18 Jan 2011, 20:21

Tipo, você fez isso beleza no Action Script? Manda o código(em Action Script) que a talvez dê para fazer uma conversão.

___________

"Não deixe para amanhã o que se pode fazer hoje"

Links úteis:
Índice de Tutoriais
Manual online do GMS

Markituh

Ranking : Sem avaliações
Número de Mensagens : 2183
Data de inscrição : 11/10/2009
Reputação : 106
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Rotacionar um grupo de sprites, como uma imagem em bloco.

Mensagem por telles0808 em Ter 18 Jan 2011, 20:34

em action script é ridiculo de fácil, a posição stand_by eu faço a checagem do das teclas direcionais e chamo a frame1 de uma coleção de centenas de frames, cada frames tem nested frames que aí sim contem as animações, essa parte é em flash, ou seja, quando eu chamo o frame 1 ele chama um arquivo em flash que contem a animação em flash da posição stand_by. manjou?

então não me preocupei em desenhar isso através de script, pois o flash fez isso por mim, só me preocupei em chamar a pose certa na hora certa.

Agora posso te passar uma XML do arquivo da pose stand_by por exemplo, nela contem todos os dados do desenho (desenhei no flash mesmo), e é supostamente possível redesenhar usando o arquivo xlf (formato descomprimido do flash CS5).

http://www.megaupload.com/?d=JAVW87VB


telles0808

Número de Mensagens : 22
Data de inscrição : 14/01/2011
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Re: Rotacionar um grupo de sprites, como uma imagem em bloco.

Mensagem por Igor KinGamer em Ter 18 Jan 2011, 20:49

Peraí, antes de desistir de fazer no GM...
Eu to fazendo aqui uma engine, vou postar (talvez amanhã) pra você ver se ficou mais ou menos do jeito que você pretendia e se valerá a pena fazer no GM. Se não valer mesmo, você volta pro flash.

De qualquer jeito, GM ou flash, boa sorte.

[edit]

Terminei a engine. Lá pelas 21:30h enviar-ta-ei por MP.

Igor KinGamer

Número de Mensagens : 890
Idade : 21
Data de inscrição : 26/09/2008
Reputação : 11
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Rotacionar um grupo de sprites, como uma imagem em bloco.

Mensagem por Conteúdo patrocinado Hoje à(s) 04:07


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