|
DirectX-Forum - Beitragsübersicht - |
|
Thema | D10: Sicher einfach für euch |
Von |
VBJens |
E-Mail |
fat.tony81@online.de |
Datum |
13. Januar 2010 um 20:43:22 |
Frage |
Liebe VBler,
ich bin blutiger Anfänger, was DirectX angeht. Habe mir aus diesem Grund ein Buch gekauft und folgendes Beispiel abgetippt:
Code im Modul:Module Module1 Public Structure D3DPRESENT_PARAMETERS Public AutoDepthSteniclFormat As DepthFormat Public BackBufferCount As Integer Public BackBufferFormat As Format Public BackBufferHeight As Integer Public BackBufferWidth As Integer Public DeviceWindow As Control Public DeviceWindowHandle As IntPtr Public EnableAutoDepthStencil As Boolean Public FullScreenRefreshRateInHz As Integer Public MultiSample As MultiSampleType Public MultiSampleQuality As Integer Public PresentationInterval As PresentInterval Public PresentFlag As PresentFlag Public SwapEffect As SwapEffect Public Windowed As Boolean End Structure Public Direct3DDevice As Microsoft.DirectX.Direct3D.Device Public vbBuffer_Dreieck As Direct3D.VertexBuffer = Nothing Public Sub OnCreateVertexBuffer(ByVal sender As Object, ByVal e As EventArgs) Dim vb As Direct3D.VertexBuffer = CType(sender, Direct3D.VertexBuffer) Dim verts As Direct3D.CustomVertex.TransformedColored() = CType(vb.Lock(0, 0), _ Direct3D.CustomVertex.TransformedColored()) verts(0).X = 150 verts(0).X = 50 verts(0).Z = 0.5F verts(0).Rhw = 1 verts(0).Color = System.Drawing.Color.Aqua.ToArgb() verts(1).X = 250 verts(1).Y = 250 verts(1).Z = 0.5F verts(1).Rhw = 1 verts(1).Color = System.Drawing.Color.Brown.ToArgb() verts(2).X = 50 verts(2).Y = 250 verts(2).Z = 0.5F verts(2).Rhw = 1 verts(2).Color = System.Drawing.Color.LightPink.ToArgb() vb.Unlock() End Sub Public Sub OnCreateDevice(ByVal sender As Object, ByVal e As EventArgs) Dim dev As Direct3D.Device = CType(sender, Direct3D.Device) vbBuffer_Dreieck = New Direct3D.VertexBuffer(GetType(Direct3D.CustomVertex.TransformedColored) _ , 3, dev, 0, VertexFormats.Transformed, Pool.Default) AddHandler vbBuffer_Dreieck.Created, AddressOf OnCreateVertexBuffer OnCreateVertexBuffer(vbBuffer_Dreieck, Nothing) End Sub Public Function CreateDirect3DDevice(ByVal Handle As Form) As Boolean Try Dim presentParams As New Direct3D.PresentParameters() presentParams.Windowed = True presentParams.SwapEffect = SwapEffect.Discard Direct3DDevice = New Direct3D.Device(0, DeviceType.Hardware, Handle, _ CreateFlags.HardwareVertexProcessing, presentParams) Return True Catch ex As DirectXException Return False End Try End Function Code in der UserForm:Public Class Form1 Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click CreateDirect3DDevice(Me) Direct3DDevice.Clear(Direct3D.ClearFlags.Target, System.Drawing.Color.Blue, 1.0F, 0) Direct3DDevice.BeginScene() Direct3DDevice.SetStreamSource(0, vbBuffer_Dreieck, 0) Direct3DDevice.VertexFormat = Direct3D.CustomVertex.TransformedColored.Format Direct3DDevice.DrawPrimitives(Direct3D.PrimitiveType.TriangleList, 0, 1) Direct3DDevice.EndScene() Direct3DDevice.Present() End Sub Es soll einfach ein Dreieck auf blauem Hintergrund gezeichnet werden. Wenn ich die ZeileDirect3DDevice.DrawPrimitives(Direct3D.PrimitiveType.TriangleList, 0, 1) auskommentiere, funktioniert der Code. Die Userform wird blau.
Mit der Zeile kommt folgende Fehlermeldung: InvalidCallException wurde nicht behandelt Fehler in der Anwendung
Kann mir jemand helfen? Vielen Dank im Voraus.
Lieben Gruß, Jan |
|
Antwort: |
Von |
Nico |
E-Mail |
nico.schertler@gmx.de |
Datum |
14. Januar 2010 um 08:38:27 |
Antwort |
Hallo Jan!
Dein Fehler liegt daran, dass dein Vertexbuffer leer ist. Und das liegt daran, dass deine Funktion OnCreateDevice niemals aufgerufen wird. Wodurch auch? Dazu kannst du zum Beispiel in deine Funktion CreateDirect3DDevice vor dem Return True noch folgende Zeile einfügen:OnCreateDevice(Direct3DDevice, Nothing) Übrigens ist die ZeileAddHandler vbBuffer_Dreieck.Created, AddressOf OnCreateVertexBuffer zu nichts nutze. Lass den Handler einfach weg und ruf direkt die Funktion auf. Da du den Handler ja erst hinzufügst, wenn der VertexBuffer schon erstellt worden ist, kann er also auch nie aufgerufen werden. Und dann noch ein Tip am Rande: Lange Variablennamen (Direct3DDevice) sind meistens beim Programmieren etwas umständlich. Also am besten alles so kurz wie möglich halten, aber noch so, dass du erkennst, was die Variable beinhaltet. Also in dem Fall zum Beispiel D3DDevice oder einfach nur Device...
Nico |
|
[ Antwort schreiben | Zurück zum DirectX-Forum | Forum-Hilfe ] |
|
Letzte Aktualisierung: Sonntag, 13. Dezember 2015 |
|