• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

NuGuN

[VB6] Sprites - How To

1 mensagem neste tópico

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  :P

cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora