Jump to content

Recommended Posts

Posted

Quando me estava a iniciar em VB6 e vi certos programas pegarem numa imagem com varias imagens dentro e depois as separava todas uma a uma, pensava cá para min... istu deve ser mm complicado, abriri uma imagem e separala toda... Bem estes pensamentos agora ja mudaram um bocado, e decido explicar como se faz issu!

A ideia é simples. Utilizando apenas uma API(BitBlt) e um pouco de imaginação consseguimos separar as imagens uma a uma  🙂 , temos uma ou um(não sei como se diz  ? ) Sprite, "desenha-se" um quadrado imaginário(para este/esta sprite) com 65 pixels de lado, copia-se para uma PictureBox, e passa-se á seguinte imagem repetindo os mesmos passos.

Passemos ao código:

Defini-se duas Variaveis Constantes para crial o tal quadrado imaginário:

Const imgWidth As Long = 65
Const imgHeight As Long = 65

Declara-se a API:

Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, _
ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight _
As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, _
ByVal dwRop As Long) As Long

Depois num Timer(tmrTempo) adiciona-se o seguinte código:

Static imgPosicao As Single
Static i As Byte

tmrTempo.Interval = Val(txtTempo.Text)

If i <= 9 Then
    pctGif.Cls
    BitBlt pctGif.hDC, 0, 0, imgWidth, imgHeight, pctSource.hDC, imgPosicao, 0, vbSrcAnd
    pctGif.Refresh
    i = i + 1
    imgPosicao = imgPosicao + imgWidth
    Else
        i = 0
        imgPosicao = 0
End If

Agora... a cada siclo do Timer acontece o seguinte:

Primeiro actualiza o Inervalo do Timer

tmrTempo.Interval = Val(txtTempo.Text)

Depois verifica se ja passou as 9 imagens do/da Sprite e limpa a PictureBox

If i <= 9 Then
    pctGif.Cls

Agora vem a API, vamos dividila em 3 partes:

Primeira Parte, é a "configuração" da imagem para ser colocada na PictureBox

BitBlt pctGif.hDC, 0, 0, imgWidth, imgHeight ...

"Damos" o hDC da PictureBox onde queremos colocar as imagens. Os dois zeros(..., 0, 0...) definem as coordenadas apartir das quais queresmos que a imagem seja colocada na PictureBox. Por exemplo, se quisermos que a imagem seja colocada desde o inicio do canto superior esquerdo da PictureBox colocamos os dois zeros como no exemplo... se por algum motivo quesermos colocar a imagem apartir do meio da PictureBox colocariamos envez dos zeros, istu -> (..., (Picture1.Width / 2), (Picture1.Height /2))...

O resto(imgWidth, imgHeight) é o tamanho da imagem a ser retirada e colocada na PictureBox, neste caso estamos a utilizar 2 Constantes.

A segunda  parte da API diz respeito á imagem source, ou seja, é a "configuração" da imagem que se vai retirar:

...pctSource.hDC, imgPosicao, 0,....

Damos o hDC da PictureBox que contem o/a Sprite

Em seguida damos as coordenadas(...imgPosicao, 0...) apartir das quais queremos que a imagem seja retirada do/da Sprite. Neste caso não são os dois zero porque nós não queremos sempre a mesma imagem. Onde temos "imgPosicao" é a coordenada X que a cada siclo vai aumentar o seu valor em 65, para que vá passando de imagem em imagem. O zero é a coordenada Y e é zero porque nós só temos uma fila de imagens, se tivessemos 2 filas(uma por cima e outra por baixo) tambem teriamos que alterar o seu valor para passar para a fila de baixo.

E por fim a terceira parte:

..., vbSrcAnd

Tem a ver com o modo em que a imagem é copiada. Alem deste modo existem mais uns, são eles vbSrcCopy, vbSrcPaint, vbNotSrcCopy. Eu só conheço estes, não quer dizer que não existam mais  🙂

Em seguida a ter copiado a imagem:

    pctGif.Refresh
    i = i + 1
    imgPosicao = imgPosicao + imgWidth

Primeiro adiciona 1 valor a variavel i para indicar o numero correcto da imagem actual, e depois adiciona mais 65 valores a variavel imgPosicao para que passe a seguinte imagem.

Por ultimo temos:

    Else
        i = 0
        imgPosicao = 0
End If

Caso a variavel i indique que ja foram passadas todas as imagens, mete a variavel i e imgPosicao a zero para que recomesse tudo de novo.....

Espero que vos seja util, eu aprendi istu quando andava com a ideia de fazer um jogo 2D(ficou a menos de meio 🙂 ) e ate hoje tem-me cido util e varios programas que tenho feito.

Deixo o programa em anexo.

Alguma duvida... perguntem  😛

cumps

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.