⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rendermod.bas

📁 雪人打雪仗的3D第一人称游戏
💻 BAS
📖 第 1 页 / 共 2 页
字号:
        CAMY = CAMY - (Sin(-Angle) * TPOWER)
        Angle = Angle + TSPEED: ChrAngle = ChrAngle + TSPEED
        If Angle > D_360 Then Angle = 0 + (Angle - D_360)
        If ChrAngle > D_360 Then ChrAngle = 0 + (ChrAngle - D_360)
    End If
    
    SnowMesh(0).MAngle = (D_360 - ChrAngle) + D_180 'Rotate the snowman

'======================================================================================
'   Speedup Section
'======================================================================================
    'This might not do much on a project this size, but on a larger project it could make quite a bit of difference
    DoEvents
    For I = 0 To UBound(TreeMesh): CheckWithinSite TreeMesh(I), Angle: Next I
    For I = 0 To UBound(WallMesh): CheckWithinSite WallMesh(I), Angle: Next I
    For I = 0 To UBound(GateMesh): CheckWithinSite GateMesh(I), Angle: Next I
        
'======================================================================================
'   Snowball Section
'======================================================================================
    '----Create a snow ball it the left control has been pressed---
    If DKIState.Key(29) <> 0 Then
        If (GetTickCount() - LastThrowTime) >= ThrowSpeed Then
            ReDim Preserve ThrowMesh(ThrowCount)
            CreateSnowMeshObj TemplateThrowMesh, ThrowMesh, ThrowCount, 15, 2.5, 2.5, 2.5, 100, 0, _
            -(SnowMesh(0).MX + (SnowMesh(0).MWidth / 2)), -SnowMesh(0).MY, SnowMesh(0).MAngle
            ThrowCount = ThrowCount + 1
            LastThrowTime = GetTickCount()
        End If
    End If

    If ThrowCount > 0 Then
        Dim W As Integer, OldX As Single, OldY As Single
        For W = 0 To UBound(ThrowMesh)
            If ThrowMesh(W).RenderMe = True Then
                OldX = ThrowMesh(W).MX: OldY = ThrowMesh(W).MY
                                
                '----Move the Snowball and do some collision detection----
                ThrowMesh(W).MX = ThrowMesh(W).MX + (Sin(D_360 - ThrowMesh(W).MAngle) * 3.5)
                ThrowMesh(W).MY = ThrowMesh(W).MY - (Cos(D_360 - ThrowMesh(W).MAngle) * 3.5)
                For I = 0 To UBound(TreeMesh)
                    If MeshColDetect(TreeMesh(I), ThrowMesh(W), ThrowMesh(W).MX, ThrowMesh(W).MY) Then GoTo SkipColDetect
                Next I
                For I = 0 To UBound(HouseMesh)
                    If MeshColDetect(HouseMesh(I), ThrowMesh(W), ThrowMesh(W).MX, ThrowMesh(W).MY) Then GoTo SkipColDetect
                Next I
                For I = 0 To UBound(WallMesh)
                    If MeshColDetect(WallMesh(I), ThrowMesh(W), ThrowMesh(W).MX, ThrowMesh(W).MY) Then GoTo SkipColDetect
                Next I
                For I = 0 To UBound(GateMesh())
                    If MeshColDetect(GateMesh(I), ThrowMesh(W), ThrowMesh(W).MX, ThrowMesh(W).MY) Then GoTo SkipColDetect
                Next I
                
                '----Check for any collisions against the evil snowman------
                If MeshColDetect(SnowEvlMesh(0), ThrowMesh(W), ThrowMesh(W).MX, ThrowMesh(W).MY) Then
                    EvlHealth = EvlHealth - Int((15 * Rnd) + 5): Randomize
                    If EvlHealth <= 0 Then EvlHealth = 100: nKills = nKills + 1
                    'When the evil snow man gets hit teleport it to a new location
                    Select Case Int((4 * Rnd) + 1)
                    Case 1: SnowEvlMesh(0).MX = -200: SnowEvlMesh(0).MY = -200
                    Case 2: SnowEvlMesh(0).MX = 200: SnowEvlMesh(0).MY = -200
                    Case 3: SnowEvlMesh(0).MX = -200: SnowEvlMesh(0).MY = 200
                    Case 4: SnowEvlMesh(0).MX = 200: SnowEvlMesh(0).MY = 200
                    End Select
                End If
                
SkipColDetect:
                '----Create an explosion if there was a collision-----
                If ColFlag Then
                    ThrowMesh(W).MX = OldX: ThrowMesh(W).MY = OldY
                    ThrowMesh(W).RenderMe = False
                    ReDim Preserve ExpMesh(ExpCount)
                    CreateAnimMeshObj TemplateExpMesh, ExpMesh(ExpCount), _
                        ThrowMesh(W).MX, ThrowMesh(W).MY, ThrowMesh(W).MZ, ThrowMesh(W).MAngle
                    ExpCount = ExpCount + 1
                End If
                '----Render the Snowball if it hasn't finished its life----
                If ThrowMesh(W).Turns < ThrowMesh(W).LifeSpan Then
                    ThrowMesh(W).Turns = ThrowMesh(W).Turns + 1
                    RenderMesh ThrowMesh(W), ThrowMesh(W).MX, ThrowMesh(W).MY, ThrowMesh(W).MZ, ThrowMesh(W).MAngle
                Else: ThrowMesh(W).RenderMe = False
                End If
            End If
        Next W
    End If
        
    '-----Render any explosions-------
    If ExpCount > 0 Then
        For I = 0 To UBound(ExpMesh)
            If ExpMesh(I).RenderMe Then
                If Not ExpMesh(I).AnimDMesh(ExpMesh(I).AnimTCurrent).AnimTIndex >= ExpMesh(I).AnimDMesh(ExpMesh(I).AnimTCurrent).AnimTLength Then
                    ExpMesh(I).AnimDMesh(ExpMesh(I).AnimTCurrent).AnimTIndex = ExpMesh(I).AnimDMesh(ExpMesh(I).AnimTCurrent).AnimTIndex + 1
                    RenderAnim ExpMesh(I), ExpMesh(I).AnimTCurrent
                Else
                    If ExpMesh(I).AnimTCurrent = 5 Then
                        ExpMesh(I).RenderMe = True
                    Else: ExpMesh(I).AnimTCurrent = ExpMesh(I).AnimTCurrent + 1
                    End If
                End If
            End If
        Next I
    End If

'======================================================================================
'   Drop Marker Section
'======================================================================================
    If DKIState.Key(57) <> 0 Then
        If (GetTickCount() - LastDropTime) >= DropSpeed Then
            ReDim Preserve DropMesh(DropCount)
            CreateSnowMeshObj TemplateDropMesh, DropMesh, DropCount, 0, 5, 5, 5, 0, 0, _
            -SnowMesh(0).MX, -SnowMesh(0).MY, SnowMesh(0).MAngle
            DropCount = DropCount + 1
            LastDropTime = GetTickCount()
        End If
    End If
    
    If DropCount > 0 Then
        For W = 0 To UBound(DropMesh)
            'Rotate and render the dropped object
            DropMesh(W).MAngle = DropMesh(W).MAngle + TSPEED
            If DropMesh(W).MAngle > D_360 Then DropMesh(W).MAngle = 0 + (DropMesh(W).MAngle - D_360)
            RenderMesh DropMesh(W), DropMesh(W).MX, DropMesh(W).MY, DropMesh(W).MZ, DropMesh(W).MAngle
        Next W
    End If

'======================================================================================
'   Evil Snowman Section
'======================================================================================
    GenerateMovementForAI
    RenderMesh SnowEvlMesh(0), SnowEvlMesh(0).MX, SnowEvlMesh(0).MY, 0, -SnowEvlMesh(0).MAngle + D_180

'======================================================================================
'   Matrix Section
'======================================================================================
    
    RenderMesh SnowMesh(0), -SnowMesh(0).MX, -SnowMesh(0).MY, 0, SnowMesh(0).MAngle
    
    D3DXMatrixTranslation matCamera, -CAMX, -CAMY + CamObDist, -CAMZ - CamGrDist
    D3DXMatrixMultiply matCamera, matCamera, matView
    
    D3DXMatrixRotationY matRotation, Angle
    D3DXMatrixMultiply matCamera, matCamera, matRotation
    
    D3DXMatrixRotationX matRotation, Pitch
    D3DXMatrixMultiply matCamera, matCamera, matRotation
    
    D3DDevice.SetTransform D3DTS_VIEW, matCamera
End Sub
'==================================================================================
Public Function RenderMesh(InMatrix As MeshData, InX As Single, InY As Single, InZ As Single, Optional RAngle As Single = 0, Optional RPitch As Single = 0): Dim RenderTempMat As D3DMATRIX, I As Integer
    D3DXMatrixIdentity RenderTempMat
    D3DXMatrixIdentity InMatrix.Matrix
    D3DXMatrixRotationZ InMatrix.Matrix, RAngle
    D3DXMatrixMultiply RenderTempMat, RenderTempMat, InMatrix.Matrix
    D3DXMatrixRotationX InMatrix.Matrix, RPitch
    D3DXMatrixMultiply RenderTempMat, RenderTempMat, InMatrix.Matrix
    D3DXMatrixTranslation InMatrix.Matrix, InX, InY, InZ
    D3DXMatrixMultiply RenderTempMat, RenderTempMat, InMatrix.Matrix
    D3DDevice.SetTransform D3DTS_WORLD, RenderTempMat

    For I = 0 To InMatrix.MatCount - 1
        D3DDevice.SetMaterial InMatrix.Mat(I)
        D3DDevice.SetTexture 0, InMatrix.Tex(I)
        InMatrix.Mesh.DrawSubset I
    Next
End Function
Public Function RenderAnim(InMatrix As AnimMeshData, rNum As Long): Dim RenderTempMat As D3DMATRIX, I As Integer
    D3DXMatrixIdentity RenderTempMat
    D3DXMatrixIdentity InMatrix.AnimMatrix
    D3DXMatrixRotationZ InMatrix.AnimMatrix, InMatrix.AnimAngle
    D3DXMatrixMultiply RenderTempMat, RenderTempMat, InMatrix.AnimMatrix
    D3DXMatrixTranslation InMatrix.AnimMatrix, InMatrix.AnimX, InMatrix.AnimY, InMatrix.AnimZ
    D3DXMatrixMultiply RenderTempMat, RenderTempMat, InMatrix.AnimMatrix
    D3DDevice.SetTransform D3DTS_WORLD, RenderTempMat
    
    For I = 0 To InMatrix.AnimDMesh(rNum).AnimMCount - 1
        D3DDevice.SetMaterial InMatrix.AnimDMesh(rNum).AnimMat(I)
        D3DDevice.SetTexture 0, InMatrix.AnimDMesh(rNum).AnimTex(I)
        InMatrix.AnimDMesh(rNum).AnimFMesh.DrawSubset I
    Next
End Function
'==================================================================================
Public Function MeshColDetect(InMesh As MeshData, InChar As MeshData, IX As Single, IY As Single) As Boolean: MeshColDetect = False: ColFlag = False
    'do some basic collision detection, i know this is by far the best way of doing it but it works and its pretty fast
    If ((IX + (InChar.MWidth / 2)) > (InMesh.MX - (InMesh.MWidth / 2))) And ((IX - (InChar.MWidth / 2)) < (InMesh.MX + (InMesh.MWidth / 2))) Then
        If ((IY + (InChar.MLength / 2)) > (InMesh.MY - (InMesh.MLength / 2))) And ((IY - (InChar.MLength / 2)) < (InMesh.MY + (InMesh.MLength / 2))) Then
            MeshColDetect = True: ColFlag = True
        End If
    End If
End Function
'==================================================================================
Public Function CheckWithinSite(InMesh As MeshData, CAngle As Single)
    'This function basically cuts the world into 90 degree parts and checks if the
    'inmesh object is not in sight of the camera, this doesn't work properly on larger object such as the ground
    If CAngle < D_90 Then
        If InMesh.MY < (ChrY - CamObDist) Then InMesh.RenderMe = False Else InMesh.RenderMe = True
    ElseIf CAngle < D_180 And CAngle > D_90 Then
        If InMesh.MX < (ChrX - CamObDist) Then InMesh.RenderMe = False Else InMesh.RenderMe = True
    ElseIf CAngle < D_270 And CAngle > D_180 Then
        If InMesh.MY > (ChrY + CamObDist) Then InMesh.RenderMe = False Else InMesh.RenderMe = True
    ElseIf CAngle > D_270 Then
        If InMesh.MX > (ChrX + CamObDist) Then InMesh.RenderMe = False Else InMesh.RenderMe = True
    End If
End Function
Public Function GenerateMovementForAI(): Dim tAngle As Single: Randomize
    'Move the evil snowman depending on a random direction, then do some collision detection on the evil snowman
    SnowEvlMesh(0).MX = SnowEvlMesh(0).MX - (Sin(D_360 - SnowEvlMesh(0).MAngle))
    SnowEvlMesh(0).MY = SnowEvlMesh(0).MY + (Cos(D_360 - SnowEvlMesh(0).MAngle))
    If (GetTickCount() - LastAIMove) >= 200 Then dNum = Int((100 * Rnd) + 1): LastAIMove = GetTickCount()
    If dNum < 20 Then SnowEvlMesh(0).MAngle = SnowEvlMesh(0).MAngle + TSPEED
    If dNum > 20 And dNum < 80 Then SnowEvlMesh(0).MAngle = SnowEvlMesh(0).MAngle
    If dNum > 80 Then SnowEvlMesh(0).MAngle = SnowEvlMesh(0).MAngle - TSPEED
    Dim I As Integer
    For I = 0 To UBound(HouseMesh())
        If MeshColDetect(HouseMesh(I), SnowEvlMesh(0), SnowEvlMesh(0).MX, SnowEvlMesh(0).MY) Then SnowEvlMesh(0).MAngle = SnowEvlMesh(0).MAngle + D_180: Exit For
    Next I
    For I = 0 To UBound(TreeMesh())
        If MeshColDetect(TreeMesh(I), SnowEvlMesh(0), SnowEvlMesh(0).MX, SnowEvlMesh(0).MY) Then SnowEvlMesh(0).MAngle = SnowEvlMesh(0).MAngle + D_180: Exit For
    Next I
    For I = 0 To UBound(WallMesh())
        If MeshColDetect(WallMesh(I), SnowEvlMesh(0), SnowEvlMesh(0).MX, SnowEvlMesh(0).MY) Then SnowEvlMesh(0).MAngle = SnowEvlMesh(0).MAngle + D_180: Exit For
    Next I
    For I = 0 To UBound(GateMesh())
        If MeshColDetect(GateMesh(I), SnowEvlMesh(0), SnowEvlMesh(0).MX, SnowEvlMesh(0).MY) Then SnowEvlMesh(0).MAngle = SnowEvlMesh(0).MAngle + D_180: Exit For
    Next I
End Function

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -