VB Silverlight

来源:互联网 发布:飞思卡尔单片机 编辑:程序博客网 时间:2024/06/07 20:55
Imports Microsoft.Xna.Framework.ContentImports Microsoft.Xna.Framework.GraphicsImports Microsoft.Xna.FrameworkImports System.Windows.GraphicsPartial Public Class MainPage    Inherits UserControl    Public Sub New()        InitializeComponent()    End Sub    Dim contentManager As ContentManager    Dim spriteBatch As SpriteBatch    Dim cameraPositon As Vector3 = New Vector3(0, 16.0F, 11.0F)    Dim cameraTarget As Vector3 = New Vector3(0, 3.0F, -2.0F)    Dim cameraUpVector As Vector3 = New Vector3(0, 19.0F, 11.0F)    Dim mouseCaptured As Boolean    Dim originalPosition As Vector2?    Dim model As Model    Dim graphicsDevice As GraphicsDevice    Dim speed As Double = 0.1F    Private Sub myDrawingSurface_MouseLeftButtonDown(sender As System.Object, e As System.Windows.Input.MouseButtonEventArgs)        Focus()        Dim location As System.Windows.Point = e.GetPosition(myDrawingSurface)        Dim rectangle As Rect = New Rect(0, 0, myDrawingSurface.RenderSize.Width, myDrawingSurface.RenderSize.Height)        If (rectangle.Contains(location)) Then            mouseCaptured = True            HandleMouseDown(New Vector2(CDbl(location.X), CDbl(location.Y)))        End If    End Sub    Public Sub HandleMouseDown(ByVal position As Vector2)        originalPosition = position    End Sub    Public Sub HandleMouseMove(ByVal position As Vector2)        If (Not originalPosition.HasValue) Then            originalPosition = position        End If        Dim diff As Vector2 = (originalPosition.Value - position)        If diff = Vector2.Zero Then            Return        End If        If diff.X = 0 Then            Dim side As Integer = 0            If position.X = 0 Then                side = -1            ElseIf position.X = myDrawingSurface.RenderSize.Width - 1 Then                side = 1            End If            diff.X -= 20 * side        End If        diff *= 0.004F        cameraTarget -= New Vector3(diff.X, cameraTarget.Y, cameraTarget.Z)        originalPosition = position    End Sub    Private Sub myDrawingSurface_MouseLeftButtonUp(sender As System.Object, e As System.Windows.Input.MouseButtonEventArgs)        If (mouseCaptured) Then            mouseCaptured = False        End If    End Sub    Private Sub myDrawingSurface_MouseMove(sender As System.Object, e As System.Windows.Input.MouseEventArgs)        If (mouseCaptured) Then            Dim location As System.Windows.Point = e.GetPosition(myDrawingSurface)            HandleMouseMove(New Vector2(CDbl(location.X), CDbl(location.Y)))        End If    End Sub    Private Sub myDrawingSurface_KeyUp(sender As System.Object, e As System.Windows.Input.KeyEventArgs)    End Sub    Private Sub myDrawingSurface_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs)        graphicsDevice = GraphicsDeviceManager.Current.GraphicsDevice        Dim contentManager As ContentManager = New ContentManager(Nothing, "Content/Searching3DContent")        spriteBatch = New SpriteBatch(graphicsDevice)        model = contentManager.Load(Of Model)("Searching")    End Sub    Private Sub myDrawingSurface_Draw(sender As System.Object, e As System.Windows.Controls.DrawEventArgs)        graphicsDevice = GraphicsDeviceManager.Current.GraphicsDevice        graphicsDevice.Clear(Color.Black)        spriteBatch = New SpriteBatch(graphicsDevice)        spriteBatch.Begin(0, BlendState.AlphaBlend)        spriteBatch.End()        graphicsDevice.DepthStencilState = DepthStencilState.Default        DrawModels(graphicsDevice, model)        e.InvalidateSurface()    End Sub    Public Sub DrawModels(ByVal graphicsDevice As GraphicsDevice, ByVal models As Model)        Dim transforms = New Matrix(models.Bones.Count) {}        models.CopyAbsoluteBoneTransformsTo(transforms)        For Each mesh As ModelMesh In models.Meshes            For Each effect As BasicEffect In mesh.Effects                effect.World = transforms(mesh.ParentBone.Index)                effect.View = Matrix.CreateLookAt(cameraPositon, cameraTarget, cameraUpVector)                effect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.Pi / 3.3F, graphicsDevice.Viewport.AspectRatio, 1, 1000)                effect.EnableDefaultLighting()                effect.SpecularColor = Vector3.One            Next            mesh.Draw()        Next    End Sub    Private Sub myDrawingSurface_KeyDown(sender As System.Object, e As System.Windows.Input.KeyEventArgs)        Dim direction As Vector3 = Vector3.Zero        Select Case e.Key            Case Key.W                direction = New Vector3(0, 0, -speed)            Case Key.S                direction = New Vector3(0, 0, speed)            Case Key.A                direction = New Vector3(-speed, 0, 0)            Case Key.D                direction = New Vector3(speed, 0, 0)        End Select        If direction <> Vector3.Zero Then            cameraTarget = New Vector3(direction.X + cameraTarget.X, direction.Y + cameraTarget.Y, direction.Z + cameraTarget.Z)            cameraPositon = New Vector3(direction.X + cameraPositon.X, direction.Y + cameraPositon.Y, direction.Z + cameraPositon.Z)        End If    End Sub    Private Sub myDrawingSurface_MouseWheel(sender As System.Object, e As System.Windows.Input.MouseWheelEventArgs)        Dim direction As Vector3 = Vector3.Zero        If e.Delta > 0 Then            direction = New Vector3(0, -speed, -speed)        Else            direction = New Vector3(0, speed, speed)        End If        If direction <> Vector3.Zero Then            cameraTarget = New Vector3(direction.X + cameraTarget.X, direction.Y + cameraTarget.Y, direction.Z + cameraTarget.Z)        End If    End SubEnd Class
    
    ''' <summary>    ''' 获取模型资源    ''' </summary>    ''' <param name="obj"></param>    ''' <param name="args"></param>    ''' <remarks></remarks>    Private Sub wb_OpenReadCompleted(obj As Object, args As OpenReadCompletedEventArgs)        NewSearchingContent = New SearchingContentManager(Nothing, "Content/")        graphicsDevice = GraphicsDeviceManager.Current.GraphicsDevice        '添加Source资源        Dim modelsDic As New Dictionary(Of String, Dictionary(Of String, Byte()))        For Each modelNames As String In Source.Split(",")            Dim modelsDicName As String = modelNames.Split("|")(0)            For Each modelName As String In modelNames.Split("|")                Dim modelDic As Dictionary(Of String, Byte()) = GetModelDictionary(args.Result, modelName)                If Not modelsDic.ContainsKey(modelsDicName) Then modelsDic.Add(modelsDicName, modelDic)            Next            '读取完成加载模型            NewSearchingContent.newModelByte = modelsDic            listModel.Add(searchingContent.Load(Of Model)(modelsDicName))        Next            End Sub    ''' <summary>    ''' 获取模型资源字典    ''' </summary>    ''' <param name="result">资源包流文件</param>    ''' <param name="modelName">模型名称</param>    ''' <returns></returns>    ''' <remarks></remarks>    Private Function GetModelDictionary(ByVal result As Stream, ByVal modelName As String) As Dictionary(Of String, Byte())        Dim xap As StreamResourceInfo = New Windows.Resources.StreamResourceInfo(result, Nothing)        Dim modelStream As Stream = Application.GetResourceStream(xap, New Uri(modelName, UriKind.Relative)).Stream        'Stream转换为bytes()        Dim modelBytes() As Byte = New Byte(modelStream.Length) {}        modelStream.Read(modelBytes, 0, modelBytes.Length)        modelStream.Seek(0, SeekOrigin.Begin)        Dim dic As New Dictionary(Of String, Byte())        dic.Add(modelName, modelBytes)        Return dic    End Function    Dim wb As New WebClient()    Private Sub ModelEx_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded        wb.OpenReadAsync(New Uri("SilverlightModel.xap", UriKind.Relative))        AddHandler wb.OpenReadCompleted, AddressOf wb_OpenReadCompleted    End Sub


 


原创粉丝点击