[MDX] DX2Dengine [Update 17.4.2010 17:22] mit Sourcecode Z-Buffer-Korrektur

    • VB.NET

    Es gibt 61 Antworten in diesem Thema. Der letzte Beitrag () ist von Tibha.

      So, nachdem ich mir mit meinem schnellen internet das SDK heruntergeladen habe, und der fehler immer noch vorhanden war, hab ich mir die engine komplett neu (abgeschrieben). Jetzt treten beim Rendern schon fehler auf, obwohl ich de Engine schon initialisiert habe . Er markiert mir

      VB.NET-Quellcode

      1. m_device.BeginScene()


      mit dem fehler :

      NullReferenceException
      Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.


      Der Fehler ist bei mir bis jetzt noch nie aufgetreten ..


      So versuche ich zu zeichnen :

      VB.NET-Quellcode

      1. Private Sub Main()
      2. timer.Start()
      3. Do While (Me.Created) 'Solange das Handle vom Fenster besteht
      4. startTick = timer.ElapsedMilliseconds 'wird starttick mit den sekunden seit dem starten von der stopwatch gefüllt
      5. engine.Render()
      6. engine.FinalizeEngine()
      7. Application.DoEvents()
      8. Do While timer.ElapsedMilliseconds - startTick < interval : Loop 'Warten..
      9. Loop
      10. End Sub
      11. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      12. interval = 40 'für 25 frames pro sekunde
      13. engine = New Engine(Me, Me.Size, False)
      14. engine.AddSprite(My.Resources.halbtransparenter_kreis, New Point(500, 500), 0)
      15. End Sub


      gruß, Trudi

      Neugeschriebene Engine

      VB.NET-Quellcode

      1. Imports Microsoft.DirectX
      2. Imports Microsoft.DirectX.Direct3D
      3. Public Class Engine
      4. Dim m_device As Device
      5. Dim m_pparameters As PresentParameters
      6. Dim m_surface As Sprite
      7. Dim m_sprites As List(Of ktsSprite)
      8. Dim m_spriteids As List(Of Long)
      9. Dim m_zbufferoffsets As List(Of Point)
      10. Dim m_zbufferids As List(Of Long)
      11. Public Sub New(ByVal owner As Control, ByVal screensize As Size)
      12. Initialise(owner, screensize, False)
      13. End Sub
      14. Public Sub New(ByVal owner As Control, ByVal screensize As Size, ByVal fullscreen As Boolean)
      15. Initialise(owner, screensize, fullscreen)
      16. End Sub
      17. Public Sub Initialise(ByVal owner As Control, ByVal screensize As Size, ByVal fullscreen As Boolean)
      18. Dim dmode As DisplayMode = Manager.Adapters.Default.CurrentDisplayMode
      19. m_pparameters = New PresentParameters()
      20. 'Device einstellungen
      21. With m_pparameters
      22. .BackBufferCount = 1
      23. .BackBufferFormat = dmode.Format
      24. .BackBufferHeight = screensize.Height
      25. .BackBufferWidth = screensize.Width
      26. .Windowed = Not fullscreen
      27. .SwapEffect = SwapEffect.Discard
      28. .EnableAutoDepthStencil = True
      29. .AutoDepthStencilFormat = DepthFormat.D16
      30. End With
      31. 'device und surface initialisieren
      32. m_device = New Device(0, DeviceType.Hardware, owner, CreateFlags.SoftwareVertexProcessing, m_pparameters)
      33. m_surface = New Sprite(m_device)
      34. 'Listen initialisieren
      35. m_sprites = New List(Of ktsSprite)
      36. m_spriteids = New List(Of Long)
      37. m_zbufferoffsets = New List(Of Point)
      38. m_zbufferids = New List(Of Long)
      39. 'Standard-zBuffer hinzufügen
      40. m_zbufferids.Add(0)
      41. m_zbufferoffsets.Add(New Point(0, 0))
      42. End Sub
      43. Public Sub FinalizeEngine()
      44. m_device.Dispose()
      45. m_surface.Dispose()
      46. End Sub
      47. Public Sub Render()
      48. If m_device Is Nothing Then Exit Sub
      49. m_device.BeginScene()
      50. m_surface.Begin(SpriteFlags.AlphaBlend) 'wegen transparenz
      51. For i = 0 To m_zbufferids.Count - 1 'Für jede ebene
      52. For Each s As ktsSprite In m_sprites 'für jeden sprite
      53. If s.visible = True Then 'wenn das sprite gezeichnet werden soll
      54. If s.bufferid = 0 Then 'wenn die ebene die standard-ebene ist
      55. m_surface.Draw2D(s.texture, s.rotationscenter, s.rotationsangle, s.position, Color.White) 'color.white = &HFFFFFFF
      56. Else 'wenn die ebene nicht die standard-ebene ist
      57. If s.bufferid = m_zbufferids(i) Then 'wenn die ebene die aktuell durchlaufende ebene ist
      58. m_surface.Draw2D(s.texture, s.rotationscenter, s.rotationsangle, s.position, Color.White) 'zeichne das bild
      59. End If
      60. End If
      61. End If
      62. Next
      63. Next
      64. m_surface.End()
      65. m_device.EndScene()
      66. m_device.Present()
      67. End Sub
      68. Public Sub SaveScreenShot(ByVal path As String, ByVal format As ImageFileFormat)
      69. Dim surface As Surface = m_device.GetBackBuffer(0, 0, BackBufferType.Mono)
      70. SurfaceLoader.Save(path, format, surface)
      71. End Sub
      72. '--------------------------------------------------------------'
      73. '--------------------------- Sprites --------------------------'
      74. '--------------------------------------------------------------'
      75. Public Function AddSprite(ByVal img As Bitmap, ByVal position As Point, ByVal bufferid As Long) As Long
      76. If Not m_zbufferids.Contains(bufferid) Then Throw New zBufferNotValidException(bufferid) : Exit Function 'Überprüfen ob es die ebene gibt
      77. Dim newid As Long = GetFreeSpriteID()
      78. Dim sprite As New ktsSprite
      79. With sprite
      80. .bufferid = bufferid
      81. .position = position
      82. .rotationsangle = 0
      83. .rotationscenter = New Point(0, 0)
      84. .spriteid = newid
      85. .texture = New Texture(m_device, img, Usage.Dynamic, Pool.Default)
      86. .visible = True
      87. End With
      88. m_sprites.Add(sprite)
      89. m_spriteids.Add(newid)
      90. AddSprite = newid
      91. End Function
      92. Public Sub RemoveSprite(ByVal id As Long)
      93. If m_spriteids.Contains(id) Then
      94. m_sprites.RemoveAt(m_spriteids.IndexOf(id))
      95. m_spriteids.Remove(id)
      96. End If
      97. End Sub
      98. Public Sub SetSpriteRotation(ByVal id As Long, ByVal center As Point, ByVal angle As Single)
      99. If m_spriteids.Contains(id) Then
      100. m_sprites(m_spriteids.IndexOf(id)).rotationscenter = center
      101. m_sprites(m_spriteids.IndexOf(id)).rotationsangle = angle
      102. End If
      103. End Sub
      104. Public Sub SetSpritezBuffer(ByVal spriteid As Long, ByVal bufferid As Long)
      105. If m_spriteids.Contains(spriteid) AndAlso m_zbufferids.Contains(bufferid) Then 'Wenn es die SpriteID und die BufferID gibt
      106. m_sprites(m_spriteids.IndexOf(spriteid)).bufferid = bufferid
      107. End If
      108. End Sub
      109. Public Sub SetSpriteVisibility(ByVal id As Long, ByVal visible As Boolean)
      110. If m_spriteids.Contains(id) Then
      111. m_sprites(m_spriteids.IndexOf(id)).visible = visible
      112. End If
      113. End Sub
      114. Public Sub SetSpriteTexture(ByVal id As Long, ByVal img As Bitmap)
      115. If m_spriteids.Contains(id) Then
      116. m_sprites(m_spriteids.IndexOf(id)).texture = New Texture(m_device, img, Usage.Dynamic, Pool.Default)
      117. End If
      118. End Sub
      119. Public Sub SetSpritePosition(ByVal id As Long, ByVal position As Point)
      120. If m_spriteids.Contains(id) Then
      121. m_sprites(m_spriteids.IndexOf(id)).position = position
      122. End If
      123. End Sub
      124. Private Function GetFreeSpriteID() As Long
      125. Dim id As Long = 0
      126. Do Until Not m_spriteids.Contains(id) 'Schleife läuft solange bis es eine ID noch nicht gibt
      127. id = id + 1 'eins inkrementieren
      128. Loop
      129. GetFreeSpriteID = id
      130. End Function
      131. '--------------------------------------------------------------'
      132. '--------------------------- Buffer ---------------------------'
      133. '--------------------------------------------------------------'
      134. Public Function AddzBuffer(ByVal offset As Point) As Long
      135. Dim newid As Long = GetFreezBufferID()
      136. m_zbufferoffsets.Add(offset)
      137. m_zbufferids.Add(newid)
      138. AddzBuffer = newid
      139. End Function
      140. Public Sub RemovezBuffer(ByVal id As Long)
      141. If id = 0 Then Throw New zBufferNotValidException(id) : Exit Sub 'Standard-Buffer ist nicht löschbar
      142. If m_zbufferids.Contains(id) Then
      143. m_zbufferoffsets.RemoveAt(m_zbufferids.IndexOf(id))
      144. End If
      145. End Sub
      146. Public Sub SetzBufferOffset(ByVal id As Long, ByVal offset As Point)
      147. If id = 0 Then Throw New zBufferNotValidException(id) : Exit Sub
      148. If m_zbufferids.Contains(id) Then
      149. m_zbufferoffsets(m_zbufferids.IndexOf(id)) = offset
      150. End If
      151. End Sub
      152. Private Function GetFreezBufferID() As Long
      153. Dim id As Long = 0
      154. Do Until Not m_zbufferids.Contains(id)
      155. id = id + 1
      156. Loop
      157. GetFreezBufferID = id
      158. End Function
      159. End Class
      160. Public Class ktsSprite
      161. Public bufferid As Long
      162. Public spriteid As Long
      163. Public texture As Texture
      164. Public position As Point
      165. Public rotationscenter As Point
      166. Public rotationsangle As Single
      167. Public visible As Boolean
      168. End Class
      169. Public Class zBufferNotValidException
      170. Inherits Exception
      171. Dim m_id As Long
      172. Sub New(ByVal zbufferid As Long)
      173. m_id = zbufferid
      174. End Sub
      175. Public Overrides ReadOnly Property Message As String
      176. Get
      177. Return "Dieser Buffer(Ebene) ist nicht zulässig ! BufferID : " & m_id
      178. End Get
      179. End Property
      180. End Class

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trudi“ ()

      deklariert hab ich wie folgt, wenn du das meinst :

      VB.NET-Quellcode

      1. Dim engine As Engine


      ich probier mal sie umzubennen ..

      Gruß, Trudi

      EDIT : Selber Fehler ..

      Bin jetzt weg, schönen Abend noch :)
      Bilder
      • 13.12_1.png

        48,92 kB, 1.058×419, 112 mal angesehen
      Hi,

      jvbsl schrieb:

      m_device muss deklariert werden...

      m_device ist eine private Variable von der Engine. Die ist doch schon deklariert :?:

      Ich hab mal einen Haltepunks bei BeginScene() gesetzt, bis dahin läuft alles glatt.
      Bei m_device stimmten auch die PresentationParameters ..

      EDIT : Hat sich erledigt. Ich habe nach dem Rendern FinializeEngine() aufgerufen. So kam es dann nach dem 2ten Rendern zur NullreferenceException :)

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trudi“ ()

      Ich kriegs irgendwie nicht hin, eh.
      Ich kann die VB Datei nicht laden und wenn ich den SC einpaste, die Imports richtig gesetz habe:
      Fehler 1 Der Typ "Sprite" ist nicht definiert.
      Fehler 2 Der Typ "Sprite" ist nicht definiert.
      Fehler 3 Der Name "SpriteFlags" wurde nicht deklariert.
      Fehler 4 Der Typ "ImageFileFormat" ist nicht definiert.
      Fehler 5 Der Name "SurfaceLoader" wurde nicht deklariert.
      Wusch, was nun??
      Ich bräuchte das wirklich dringend!!
      Imports reichen nicht auch die Verweise benötigst du und vorallem auch auf die richtigen Assemblies, achte darauf, dass du von der Microsoft.DirectX.Direct3DX.dll die neueste Version verwendest...
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---
      du brauchst das Microsoft DirectX SDK, mit 10 bzw. höher kann man nicht unter MDX entwickeln, da dieses nicht mehr weiterentwickelt wurde, stattdessen gibt es nun ja XNA, was auch für diese implementiert ist...
      microsoft.com/downloads/en/det…ee9e21b282&displaylang=en
      sollte denke ich passen...

      Edit:achja der Ziel PC benötigt dann mindestens DirectX 9.0c Redistributable
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---
      was heißt groß?!: microsoft.com/downloads/detail…dd6ab307a2&displayLang=de
      Ich denke das ist es, nun weiß ich nicht, wie es aussieht für User mit DirectX 10, ich denke nicht, dass da die Redistributable bereits dabei ist, somit müssten diese das ganze trotzallem installieren...
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---
      hab ein problem mit fullscreen, wenn ich versuche die form aufzurufen kommt folgender Fehler:

      Fehler beim Erstellen des Formulars. Weitere Informationen finden Sie in Exception.InnerException. Fehler: Fehler in der Anwendung..


      bild existiert usw. alles korrekt. ist nur, wenn ich fullscreen auf true mache
      hier mein code:

      VB.NET-Quellcode

      1. Dim engine As DX2Dengine
      2. Dim CardsSprites As New List(Of SpriteStr)
      3. Private Structure SpriteStr
      4. Dim id As Long
      5. Dim Pos As PointF
      6. Dim Image As Image
      7. End Structure
      8. Private Sub gameFrm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      9. Dim newSprite As New SpriteStr
      10. newSprite.Image = Wiki.ThemesList(14).EdditionsList(1).CardList(163).image
      11. newSprite.Pos = New PointF(0, 0)
      12. newSprite.myRect = New RectangleF(newSprite.Pos.X, newSprite.Pos.Y, newSprite.Image.Width, newSprite.Image.Height)
      13. engine = New DX2Dengine
      14. engine.InitEngine(Me, Me.Size, True)
      15. newSprite.id = engine.AddSprite(newSprite.Image, newSprite.Pos)
      16. CardsSprites.Add(newSprite)
      17. End Sub
      18. Private Sub gameFrm_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
      19. engine.Render()
      20. End Sub
      21. Private Sub gameFrm_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
      22. engine.ClearSprites()
      23. engine.FinalizeEngine()
      24. End Sub
      MfG Cyfer
      ---
      Dim Louis.Cyfer As Coder.Object
      Do While Louis.Cyfer.ReadyState <> Louis.Cyfer.ReadyState.Complete
      Application.DoEvents()
      Loop
      ' Der Beste Code ist immer noch der eigene
      ---

      ~blaze~ schrieb:

      Hi
      Vermutlich wird die übergebene Auflösung des Fensters nicht von der Grafikkarte unterstützt. Versuch mal, die Größe der Form vor dem Aufruf von InitEngine auf die aktuelle Bildschirmgröße zu setzen, wenn du Fullscreen einschaltest.

      Gruß
      ~blaze~

      aber funzt immernoch nicht...

      €diT: des lag jetz daran, dass die form noch nicht richtig "da" war^^

      funzt jetz

      €diT2: wie bekomm ich das hin ein sprite per drag n drop zu bewegen oder damit zu interagieren?
      MfG Cyfer
      ---
      Dim Louis.Cyfer As Coder.Object
      Do While Louis.Cyfer.ReadyState <> Louis.Cyfer.ReadyState.Complete
      Application.DoEvents()
      Loop
      ' Der Beste Code ist immer noch der eigene
      ---

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Louis.Cyfer“ ()