Casino online









Mercato forex






B23. Saltare


Ora che possiamo camminare, perchè non mettersi a saltare? Il meccanismo del salto è abbastanza semplice, ma implica un minimo di conoscenza del moto parabolico. Per prima cosa, dobbiamo stabilire le variabili che servono per questo scopo: Ora possiamo dichiararle tutte:
    'SALTO ------------------------------------------
    Private IsJumping As Boolean = False
    Private JumpingYVelocity As Single
    Private JumpStart As TimeSpan
    Private JumpTime As Single
    Private Const JumpingYInitial As Single = 0.17
    'Come vedete il valore dell'accelerazione di gravità non
    'corrisponde al nostro 9.81, ma è molto minore. Tale valore
    'è stato prodotto da alcuni tentativi e deriva dalle
    'semplificazioni di calcolo che abbiamo fatto
    Private Const Gravity As Single = 0.9 
Modifichiamo quindi il metodo Update per far leggere la pressione del testo spazio:
    Protected Overrides Sub Update(ByVal GameTime As GameTime)
        ProcessMouseInput(GameTime.ElapsedGameTime.TotalSeconds)
        ProcessKeyboardInput()

        Dim k As KeyboardState = Keyboard.GetState

        'Legge lo spazio solo se NON si sta già saltando
        If k.IsKeyDown(Keys.Space) And (IsJumping = False) Then
            'Registra il tempo iniziale del salto
            JumpStart = GameTime.TotalGameTime
            'Imposta la velocità iniziale verso l'alto
            JumpingYVelocity = JumpingYInitial
            'Attiva la variabile booleana
            IsJumping = True
        ElseIf IsJumping Then
            'Se spazio non è premuto e si sta saltando, allora
            'calcola il nuovo intervallo di tempo JumpTime, come
            'differenza tra GameTime.TotalGameTime e JumpStart
            JumpTime = (GameTime.TotalGameTime - JumpStart).TotalSeconds
        End If

        MyBase.Update(GameTime)
    End Sub 
E inseriamo il codice di calcolo vero e proprio, nel metodo UpdatePosition:
    Private Sub UpdatePosition(ByVal Motion As Vector3)
        Dim Rotation As Matrix = _
            Matrix.CreateRotationX(UpDownRotation) * _
            Matrix.CreateRotationY(LeftRightRotation)
        Dim RotMotion As Vector3 = Vector3.Transform(Motion, Rotation)

        CameraPosition += RotMotion * MoveSpeed

        Dim Y As Single
        If (Math.Abs(CameraPosition.X) < Me.TerrainWidth / 2) And _
            (Math.Abs(CameraPosition.Z) < Me.TerrainLength / 2) Then
            Dim X1, X2, Z1, Z2 As Int32

            With CameraPosition
                X1 = CInt(Math.Floor(.X))
                X2 = CInt(Math.Ceiling(.X))
                Z1 = CInt(Math.Floor(.Z))
                Z2 = CInt(Math.Ceiling(.Z))
            End With

            If X1 <> X2 And Z1 <> Z2 Then
                Dim Q11, Q12, Q21, Q22 As Single

                Q11 = HeightData(X1 + Me.TerrainWidth / 2, -Z1 + Me.TerrainLength / 2)
                Q12 = HeightData(X1 + Me.TerrainWidth / 2, -Z2 + Me.TerrainLength / 2)
                Q21 = HeightData(X2 + Me.TerrainWidth / 2, -Z1 + Me.TerrainLength / 2)
                Q22 = HeightData(X2 + Me.TerrainWidth / 2, -Z2 + Me.TerrainLength / 2)

                Dim X, Z As Single

                X = CameraPosition.X
                Z = CameraPosition.Z

                Y = (Q11 * (X2 - X) * (Z2 - Z) + _
                    Q21 * (X - X1) * (Z2 - Z) + _
                    Q12 * (X2 - X) * (Z - Z1) + _
                    Q22 * (X - X1) * (Z - Z1)) / ((X2 - X1) * (Z2 - Z1))
            Else
                Y = HeightData(X1 + Me.TerrainWidth / 2, -Z1 + Me.TerrainLength / 2)
            End If
        End If

        'Se si sta saltando e si è sopra il terreno, allora incrementa
        'la componente Y della posizione di un valore pari a UmpingYVelocity,
        'poi lo ricalcola
        If (IsJumping) And (CameraPosition.Y + JumpingYVelocity) > Y + 0.5 Then
            CameraPosition.Y += JumpingYVelocity
            JumpingYVelocity = JumpingYInitial - Gravity * JumpTime
        Else
            'Altrimenti imposta semplicemente la posizione come radente 
            'al suolo
            CameraPosition.Y = Y + 0.5
            'E disattiva il salto
            IsJumping = False
        End If

        UpdateView()
    End Sub 
E otterrete questo risultato.








 

The Totem's Lair - Copyright (C) 2009
È vietata la riproduzione sia totale che parziale del sito.