NuGuN Posted August 2, 2006 at 11:22 PM Report #41843 Posted August 2, 2006 at 11:22 PM 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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now