:: TUTORIAL DE FUNCIONES API PARA JUEGOS ::
Para hacer juegos usando la tecnología API (Application Programming Interface o interfaz de programación de aplicaciones)
de Windows debemos conocer algunas funciones útiles para éstos fines. La API de Windows se compone tal vez de cientos de funciones,
pero sólo unas pocas de ellas tienen aplicación en este campo.
Expondré una serie de ellas, explicándolas hasta donde mis conocimientos me permitan.
:: BitBlt ::
Usaremos esta función para dibujar todos los gráficos de los juegos. Trabaja de forma similar al método PaintPicture
de los formularios y PictureBox, y nos permite dibujar las imágenes con fondo transparente si así lo necesitamos. A esta función
se la supone más rápida que el método PaintPicture.
Para usarla en un proyecto, deberemos pegar este código en un módulo .bas.
Todas las funciones API y sus constantes deben ser declaradas en un módulo .bas, no sirve hacerlo en un módulo .frm.
Public 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
Public Const SRCCOPY = &HCC0020
Public Const SRCERASE = &H440328
Public Const SRCINVERT = &H660046
Public Const SRCPAINT = &HEE0086
Public Const SRCAND = &H8800C6
Public Const WHITENESS = &HFF0062
Public Const BLACKNESS = &H42
Veamos sus parámetros:
HdestDC - En este parámetro pasaremos el dispositivo gráfico de destino - usualmente un PictureBox -
donde queramos dibujar el gráfico.
X - Aquí pasaremos la coordenada X del dispositivo gráfico de destino en la que queramos que se dibuje el gráfico.
Y - Aquí pasaremos la coordenada y del dispositivo gráfico de destino en la que queramos que se dibuje el gráfico.
NWidth - Aquí pasaremos la anchura del gráfico a dibujar.
NHeight - Aquí pasaremos la altura del gráfico a dibujar.
HSrcDC - En este parámetro pasaremos el dispositivo gráfico de origen - usualmente un PictureBox - donde se
encuentra el gráfico que va a ser dibujado.
XSrc - Aquí pasaremos la coordenada X del dispositivo gráfico de origen en la que se encuentra el gráfico que
queremos dibujar.
YSrc - Aquí pasaremos la coordenada Y del dispositivo gráfico de origen en la que se encuentra el gráfico que
queremos dibujar.
DwRop - En este parámetro pondremos una de las constantes de la función, que definen la forma en que se van a combinar
los píxeles del gráfico a dibujar con los que ya existen en el dispositivo gráfico de destino.
Por ejemplo, si escogemos SRCCOPY, el gráfico se dibujará de forma opaca. Si escogemos SRCAND, se mezclará el gráfico con
el que ya tenga el dispositivo gráfico de destino. Si escogemos SRCINVERT el gráfico se dibujará con los colores invertidos.
Y el resto de ellas no sé que es lo que hacen, pero con ésto ya es suficiente.
BitBlt PicScreen.hDC, 260, 160, 100, 100, PicSurface.hDC, 10, 156, SRCAND ‘Dibuja el área transparente del gráfico
BitBlt PicScreen.hDC, 260, 160, 100, 100, PicSurface.hDC, 210, 10, SRCPAINT ‘Dibuja el área visible del gráfico
:: SndPlaySound ::
Con esta función reproduciremos sonidos procedentes de archivos .wav. Hay que tener bien claro que esta función sólo permite
reproducir un sonido al mismo tiempo.
Aún así, para los que se conformen con ésto, explicaré sndPlaySound.
Public Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA"
(ByVal lpszSoundName As String, ByVal uFlags As Long) As Long
Public Const SND_SYNC = &H0
Public Const SND_ASYNC = &H1
Public Const SND_NODEFAULT = &H2
Public Const SND_LOOP = &H8
Public Const SND_NOSTOP = &H10
Public Const SND_PURGE = &H40
Public Const SND_NOWAIT = &H2000
lpszSoundName - Aquí pasaremos el nombre del archivo de sonido a reproducir.
uFlags - Aquí pasaremos una de las constantes de esta función, que definen la forma en que se reproducirá el sonido.
Yo no sé lo que hacen todas estas constantes, pero diré a título orientativo que se suele utilizar la segunda de ellas, SND_ASYNC.
SndPlaySound App.path & “disparo.wav”, SND_ASYNC
:: ShowCursor ::
Sirve para mostrar u ocultar el cursor de Windows. Puede hacer que los programas funcionen mal, así que si esto sucede,
lo que debes hacer es crear un archivo de icono sin gráfico y asignarlo a la propiedad MouseIcon, con lo cual ya no se verá el
cursor.
Public Declare Function ShowCursor Lib "user32" (ByVal bShow As Integer) As Integer
Showcursor False ‘Oculta el puntero del ratón
Showcursor True ‘Muestra el puntero del ratón
:: GetTickCount ::
Devuelve el número de milisegundos transcurridos desde que se inició Windows en el equipo. Lo usaremos para todos los cálculos
de tiempo de nuestros juegos, ya que es muy preciso.
Public Declare Function GetTickCount Lib "kernel32" () As Long
Dim Variable as Long
Variable = GetTickCount
:: GetKeyState ::
Sirve para que el programa sepa qué teclas están pulsadas en un momento dado. Lo cierto es que debemos usarla cuando deseemos
que el juego responda a más de una tecla al mismo tiempo, ya que el evento KeyDown de Visual Basic sólo puede responder a una
tecla a la vez.
Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Public Const KEY_TOGGLED As Integer = &H1
Public Const KEY_DOWN As Integer = &H1000
En su único parámetro pasaremos la constante de la tecla que queremos controlar.
Dim KeyLeft
Dim KeyRight
Dim KeyUp
Dim KeyDown
KeyLeft = GetKeyState(vbKeyLeft)
KeyRight = GetKeyState(vbKeyRight)
KeyUp = GetKeyState(vbKeyUp)
KeyDown = GetKeyState(vbKeyDown)
If KeyRight And KEY_DOWN Then
... ‘Si pulsa la tecla Right hacer esto...
If KeyUp And KEY_DOWN Then
... ‘Si pulsa la tecla Right y la tecla Up al mismo tiempo hacer esto...
End if
End if
:: GetCursorPos ::
Sirve para que el programa conozca la posición del cursor del ratón en la pantalla, independientemente de qué control de
Visual Basic se encuentre debajo del cursor.
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
En su único parámetro pasaremos una variable de tipo POINTAPI para que introduzca en ella las coordenadas X e Y de la
posición del cursor.
Public btnMousePosition As POINTAPI
Call GetCursorPos(btnMousePosition)
If btnMousePosition.X <= 800 And btnMousePosition.Y <= 600 Then
...
End if
:: IntersectRect ::
Esta función compara la posición de dos rectángulos y determina si se superponen o no. Su aplicación se encuentra en la
detección de colisiones entre sprites, ya que éstos siempre se encuentran encerrados dentro de un área rectangular.
Esta función es bastante simple y sólo sirve para juegos 2D planos.
Public Declare Function IntersectRect Lib "user32"
(lpDestRect As RECT, lpSrc1Rect As RECT, lpSrc2Rect As RECT) As Long
lpDestRect - Aquí pasaremos un rectángulo para que la función introduzca en ella los valores de las coordenadas de superposición
de los otros dos rectángulos. Si no hay superposición de rectángulos, entonces pondrá 0 en todos los valores. Controlando los valores de este rectángulo, podremos saber no sólo si los rectángulos se superponen o no, sino también en qué tamaño de área.
lpSrc1Rect - Pasaremos aquí el primer rectángulo a comparar.
lpSrc2Rect - Pasaremos aquí el segundo rectángulo a comparar.
Dim TempRectángulo as RECT
Dim Rectángulo1 as RECT
Dim Rectángulo2 as RECT
… ‘Aquí rellenaríamos los valores de los rectángulos
If IntersectRect(TempRectángulo,Rectángulo1,Rectángulo2) = True Then ‘Si los rectángulos se superponen...
‘... ejecutaremos el código correspondiente.
End If
|