SakhaliaNetHome PageHistory of the RailwayVorKutaAcceptance of cookiesAcceptance of cookies

~ DAGOVAR :: A VISUAL BASIC GAME ~

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 estos 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, debemos pegar el siguiente código en un módulo .bas (todas las funciones API y sus constantes deben ser declaradas en módulos .bas, no se puede hacer en módulos .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 - por ejemplo un PictureBox - donde queramos dibujar el gráfico.

X - En este parámetro pasaremos la coordenada X del dispositivo gráfico de destino en la que queramos que se dibuje el gráfico.

Y - En este parámetro pasaremos la coordenada y del dispositivo gráfico de destino en la que queramos que se dibuje el gráfico.

NWidth - En este parámetro pasaremos la anchura del gráfico a dibujar.

NHeight - En este parámetro pasaremos la altura del gráfico a dibujar.

HSrcDC - En este parámetro pasaremos el dispositivo gráfico de origen - por ejemplo un PictureBox - donde se encuentra el gráfico que queremos dibujar.

XSrc - En este parámetro pasaremos la coordenada X del dispositivo gráfico de origen en la que se encuentra el gráfico que queremos dibujar.

YSrc - En este parámetro 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 píxeles del dispositivo gráfico de destino.

Por ejemplo, si escogemos SRCCOPY, el gráfico se dibujará de forma opaca. Si escogemos SRCAND, los píxeles del gráfico se combinarán con los píxeles del dispositivo gráfico de destino, si escogemos SRCINVERT el gráfico se dibujará con los colores invertidos, etc... El resto de ellas no sé qué es lo que hacen, pero con saber esto ya es suficiente para conseguir dibujar objetos con el fondo invisible.

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


Ejemplo de función Bitblt

SndPlaySound

Con esta función reproduciremos sonidos procedentes de archivos .wav, aunque 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 esto, 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 - En este parámetro pasaremos el nombre del archivo de sonido a reproducir.

uFlags - En este parámetro 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 dar problemas en nuestros programas, así que si esto sucede, lo que se puede hacer es crear un archivo de icono sin ningún gráfico, o sea vacío, y asignarlo a la propiedad MouseIcon, con lo cual ya no se verá ningún 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. Usaremos esta función para todos los cálculos de tiempo de nuestros juegos, ya que es muy precisa.

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 al mismo tiempo.

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 ejecutaremos el código correspondiente
If KeyUp And KEY_DOWN Then
... 'Si pulsa la tecla Right y la tecla Up al mismo tiempo, ejecutaremos el código correspondiente
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 de él.

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
... 'Si las coordenadas del cursor del ratón están en una determinada área, ejecutaremos el código correspondiente
End if


IntersectRect

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 objetos 2D, ya que estos siempre se encuentran definidos por un área rectangular. Esta función es bastante simple y sólo sirve para juegos 2D planos, no para los juegos 2D isométricos.

Public Declare Function IntersectRect Lib "user32" (lpDestRect As RECT, lpSrc1Rect As RECT, lpSrc2Rect As RECT) As Long

lpDestRect - En este parámetro pasaremos un rectángulo para que la función introduzca en ella los valores de las coordenadas de superposición de los dos rectángulos a comparar. 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 el tamaño del área de superposición.

lpSrc1Rect - En este parámetro pasaremos el primer rectángulo a comparar.

lpSrc2Rect - En este parámetro pasaremos 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


About Dagovar

~ About Dagovar ~

Defining characters

~ Defining characters ~

Desert Vixens 2 maps

~ Desert Vixens 2 maps ~

Desert Vixens 3 maps

~ Desert Vixens 3 maps ~

Tile-based terrains

~ Tile-based terrains ~

Random maps

~ Random maps ~

Screenshots

~ Screenshots ~

Algorithms

~ Algorithms ~

API functions for games

~ This tutorial in english ~

Source code examples

~ Source code examples ~



Return To Index

Privacy Policy