Como criar máscara (ou rect)?

7 Respostas   575 Visualizações

0 Membros e 1 Visitante estão vendo este tópico.

Geraldo de Rívia

  • Mito
  • *
  • Posts: 4452
  • Ouros: 3887
  • O vento está sibilando.
  • Medalhas Vencedor do Protótipo Premiado Participantes do Maps Together 2
Tópico criado em: 25/06/2015 às 10:40 - Última modificação por King Gerar em 03/07/2015 às 12:19

Então, eu não sei o nome certo, mas ao menos em design se chama máscara e em scripting
eu acho que é rect. O que preciso é que uma imagem fique “dentro” de uma segunda imagem.
Exemplificando na imagem abaixo:




Eu tenho a 1ª imagem (que seria a máscara), a 2ª imagem (que contém o que quero mostrar),
e a 3ª imagem que é o resultado da imagem que quero mostrar “dentro” da máscara.
Eu me lembro de um minimapa que utilizava isso, mas não me lembro qual.

Qualquer coisa posso tentar explicar melhor >.>

Brandt

Resposta 1: 25/06/2015 às 10:57

Tem a propriedade src_rect do Sprite, tipo:
Código: [Selecionar]
sprite = Sprite.new
sprite.bitmap = Bitmap.new("exemplo")
sprite.src_rect = Rect.new(0,0, 32, 32) # retângulo 32x32 na posição 0;0

Sugiro que dê uma olhada nos métodos draw_icon da Window_Base e update_src_rect da Sprite_Character, que usam esse recurso.
~ Masked

Geraldo de Rívia

  • Mito
  • *
  • Posts: 4452
  • Ouros: 3887
  • O vento está sibilando.
  • Medalhas Vencedor do Protótipo Premiado Participantes do Maps Together 2
Resposta 2: 25/06/2015 às 16:29

Eu até andei mexendo esses dias, mesmo sem saber o que tava fazendo, consegui colocar
um rodapé utilizando isto xD

Mas digo, quando o rect (ou a máscara) não for quadrada ou retangular, quando for uma
forma diferente. Sendo mais preciso, como nesse outro exemplo de barrinha:




Eu teria que usar o rect como uma imagem. Isso que eu queria saber como faz.

Azraven

  • *
  • Posts: 200
  • Ouros: 104
  • ...
Resposta 3: 25/06/2015 às 22:52

Vou tentar te mostrar como eu fiz com o meu mini mapa, não sou bom em explicar mas vou mandar uma imagem de exemplo e um codigo pra tu ver em funcionamento.

Use Teste.new em um evento.

Código: [Selecionar]
class Teste
 
  def initialize
    @sprite = Sprite.new
    @sprite.bitmap = Cache::system("flaCaps")     #carrega a imagem
    @sprite.src_rect = Rect.new(0,0,64,16)        #adquire a base
    @sprite.blend_type = 2                        #modo de mesclagem do sprite: subtração
    @sprite.z = 99999                             #ordem Z: deve ficar acima da mascara de fundo
    @backmask = Sprite.new                       
    @backmask.bitmap = Cache::system("flaCaps")   #mascara de fundo, deve ser branca no formato final da imagem
    @backmask.src_rect = Rect.new(160,0,64,16)    #adiquire a mascara de fundo
    @backmask.blend_type = 1                      #modo de mesclagem: adição
    @backmask.z = 99998                           #ordem z, abaixo da base
    @mask = Cache::system("flaCaps")              #mascara, a cor preta deve ser usada para "apagar partes da base
    @sprite.bitmap.blt(0,0,@mask, Rect.new(79,0,64,16))
  end
end



[Anexo excluído pelo administrador]

Geraldo de Rívia

  • Mito
  • *
  • Posts: 4452
  • Ouros: 3887
  • O vento está sibilando.
  • Medalhas Vencedor do Protótipo Premiado Participantes do Maps Together 2
Resposta 4: 25/06/2015 às 23:38

Ahh, então era teu!? Faz um tempo bom que vi, daí não lembrava.
Mas bom, agradeço ainda mais pelo exemplo, acho que entendo melhor do que se tivesse
somente explicado. Lendo aqui eu saquei, eu acho, mas quando tiver tempo vou tentar
programar e utilizar essa parada, pra ver se consigo. Mas de já, valeu mesmo!

Geraldo de Rívia

  • Mito
  • *
  • Posts: 4452
  • Ouros: 3887
  • O vento está sibilando.
  • Medalhas Vencedor do Protótipo Premiado Participantes do Maps Together 2
Resposta 5: 03/07/2015 às 08:11

Então, Azraven, fiz aqui, porém apareceu um obstáculo. Primeiro, não sei porque motivos,
a cor da barrinha ficou invertida (sendo que no seu exemplo não invertia e fiz exatamente
igual, eu acho), mas daí era só inverter a cor da barrinha do arquivo e resolveu.

Porém, agora, quando movi a barrinha pra cima do layout, ele ganha uma sombra, além
da mesclagem parecer ficar meio falha, como pode ver abaixo. Apaguei cada imagem por
vez pra ver qual estaria causando, mas isso persistia em cada teste.
Sabe o que pode ser?




Código: [Selecionar]
  def initialize
    super(0, 0, 176, 80)
    default_z = 200
    # Fundo
    @layout1 = Sprite.new
    @layout1.bitmap = Cache.picture("HUD - Layout")
    @layout1.z = default_z
    # Barrinha de HP
    @hp1 = Sprite.new
    @hp1.bitmap = Cache.picture("HUD - HP Bar")
    @hp1.src_rect = Rect.new(0, 0, 100, 13)
    @hp1.blend_type = 2
    @hp1.x = x + 53
    @hp1.y = y + 25
    @hp1.z = default_z + 2
    @hp1_back = Sprite.new
    @hp1_back.bitmap = Cache.picture("HUD - HP Bar")
    @hp1_back.src_rect = Rect.new(200, 0, 100, 13)
    @hp1_back.blend_type = 1
    @hp1_back.x = x + 53
    @hp1_back.y = y + 25
    @hp1_back.z = default_z + 1
    @hp1_mask = Cache.picture("HUD - HP Bar")
    @hp1.bitmap.blt(x + 53, y + 25, @hp1_mask, Rect.new(100, 0, 100, 13))
  end

Brandt

Resposta 6: 03/07/2015 às 11:27

É que você usou a mesma imagem pra barra e pra máscara, a máscara precisa ser uma imagem branca pra dar certo, além disso você esqueceu da parte usada para apagar a falha da mesclagem (aquela ponta preta, no seu caso seria a ponta da HUD com uma parte transparente)
~ Masked

Geraldo de Rívia

  • Mito
  • *
  • Posts: 4452
  • Ouros: 3887
  • O vento está sibilando.
  • Medalhas Vencedor do Protótipo Premiado Participantes do Maps Together 2
Resposta 7: 03/07/2015 às 11:46 - Última modificação por King Gerar em 03/07/2015 às 12:19

Então, o fundo preto eu resolvi aqui, era o bg da janela que eu esqueci de tirar a opacidade.  :facepalm:

Agora quanto à pontinha lá, não entendi o porquê dela continuar, pois fiz exatamente igual
ele exemplificou, inclusive no arquivo de imagem:






Vou tentar fazer com as imagens separadas.
Estou fazendo esse método dentro de uma Window, será que tem problema?


EDIT: As coordenadas da sprite que apaga estavam erradas, agora ta tudo funcionando ok, eu acho.
Valeuzão aos dois!
  :XD: