lunes, 22 de julio de 2013

7 .-. 2D. Sprites. Hacer un HUD. Radar. (II)

Una vez creada la clase Enemigo, vamos con el radar. Lo primero es descargarse desde aquí los diseños. En la clase Motor vamos a declarar, al igual que para el HudBar una serie de texturas para emplear:

    'HUD RADAR
    Dim TexturaRadar As Texture
    Dim Texturap1 As Texture
    Dim Texturap2 As Texture
    Dim Texturap3 As Texture


También vamos a declarar un array de enemigos, 3 en nuestro caso, en la clase Motor.

    'Control enemigos
    Dim Enemigos(2) As Enemigo
    Dim cont As Integer

A continuación vamos a inicializar todo en POSConfigurarDX, añadiendo estas líneas a continuación de lo que teníamos.

            'HUD
            HUD = New Sprite(DP3)
            TexturaBarraVida = TextureLoader.FromFile(DP3, Application.StartupPath & "\3d\HUD\hudbar1.png")
            TexturaRellenoBarraVida = TextureLoader.FromFile(DP3, Application.StartupPath & "\3d\HUD\hudfiller.png")
            TexturaRellenoBarraMana = TextureLoader.FromFile(DP3, Application.StartupPath & "\3d\HUD\hudfiller2.png")

            TexturaRadar = TextureLoader.FromFile(DP3, Application.StartupPath & "\3d\HUD\HudRadar1.png")
            Texturap1 = TextureLoader.FromFile(DP3, Application.StartupPath & "\3d\HUD\p1.png")
            Texturap2 = TextureLoader.FromFile(DP3, Application.StartupPath & "\3d\HUD\p2.png")
            Texturap3 = TextureLoader.FromFile(DP3, Application.StartupPath & "\3d\HUD\p3.png")

            'ENEMIGOS
            For i As Byte = 0 To 2
                Enemigos(i) = New Enemigo
                Enemigos(i).ESTADO = i + 1
                Enemigos(i).Muevete(New Vector3(i, i + 2, +i))
            Next

Simplemente iniciamos las texturas del radar, prestar atención a la ruta por si no os coincide. También tenemos un bucle for que permite iniciar cada enemigo a un estado (1,2,3) y le damos un punto de inicio mediante el método "muevete".Con esto tenemos todo iniciado.

Ahora vamos al Sub PintaHud y añadir esto:

            HUD.Draw2D(TexturaRadar, New Point(0, 0), 0, New Point(1450, 10), Color.White)

            For i = 0 To 2
               
                If Enemigos(i).ESTADO = 1 Then HUD.Draw2D(Texturap1, New Point(0, 0), 0, New Point(1460 + cont / 35, 45), Color.White)

                If Enemigos(i).ESTADO = 2 Then HUD.Draw2D(Texturap2, New Point(0, 0), 0, New Point(1480 + cont / 5, 75), Color.White)

                If Enemigos(i).ESTADO = 3 Then HUD.Draw2D(Texturap3, New Point(0, 0), 0, New Point(1495 + cont / 20, 85), Color.White)


            Next

Básicamente dibujamos la textura base del Radar, y, mediante un bucle recorremos todos los enemigos y, según su estado, vamos dibujando un punto de color diferente con Texturap1, Texturap2, Texturap3.

Ahora vamos a crear un Sub en la clase Motor de esta forma:

    Public Sub IA(ByRef VC As Vector3)
         Try
            Dim v_mov As New Vector3

            If cont >= 200 Then
                v_mov = Enemigos(2).POS + (VC - Enemigos(2).POS)
                v_mov = Vector3.Normalize(v_mov) * 0.5
                Enemigos(2).Muevete(v_mov)
                cont = 0
            Else
                cont += 1
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub


Y la implementamos en Form1 en el Bucle de esta forma,

    Private Sub Bucle()
        Try
            Do While Start = True
                Engine.Control_Matrices(PosicionCamara, Dispo3D)
                Engine.Render(Dispo3D, PosicionCamara)
                Engine.IA(PosicionCamara)
                Application.DoEvents()

            Loop
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub


Bien, vamos a explicar esto un poco. Tenemos una variable contador que, cada 200 iteraciones y, para el enemigo que está en estado de alerta (el de índice 2), va a calcular que el enemigo avance hacia la posición de la cámara. Para esto tengo a v_mov que calcula un vector en la dirección de la cámara desde la posición actual del enemigo, lo normaliza y lo multiplica por 0,5 que es la velocidad del enemigo, podríamos tener distintos valores para cada tipo de enemigo definidos en la clase Enemigo.

Bien, si ejecutais ahora vereis que, el radar funciona pero todavía no hace más que dibujar puntos, tenemos que regularizar la posición de los enemigos para que sea "real".

No hay comentarios:

Publicar un comentario