[MDX] DX2Dengine [Update 17.4.2010 17:22] mit Sourcecode Z-Buffer-Korrektur
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
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
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
- Private Sub Main()
- timer.Start()
- Do While (Me.Created) 'Solange das Handle vom Fenster besteht
- startTick = timer.ElapsedMilliseconds 'wird starttick mit den sekunden seit dem starten von der stopwatch gefüllt
- engine.Render()
- engine.FinalizeEngine()
- Application.DoEvents()
- Do While timer.ElapsedMilliseconds - startTick < interval : Loop 'Warten..
- Loop
- End Sub
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- interval = 40 'für 25 frames pro sekunde
- engine = New Engine(Me, Me.Size, False)
- engine.AddSprite(My.Resources.halbtransparenter_kreis, New Point(500, 500), 0)
- End Sub
gruß, Trudi
Neugeschriebene Engine
VB.NET-Quellcode
- Imports Microsoft.DirectX
- Imports Microsoft.DirectX.Direct3D
- Public Class Engine
- Dim m_device As Device
- Dim m_pparameters As PresentParameters
- Dim m_surface As Sprite
- Dim m_sprites As List(Of ktsSprite)
- Dim m_spriteids As List(Of Long)
- Dim m_zbufferoffsets As List(Of Point)
- Dim m_zbufferids As List(Of Long)
- Public Sub New(ByVal owner As Control, ByVal screensize As Size)
- Initialise(owner, screensize, False)
- End Sub
- Public Sub New(ByVal owner As Control, ByVal screensize As Size, ByVal fullscreen As Boolean)
- Initialise(owner, screensize, fullscreen)
- End Sub
- Public Sub Initialise(ByVal owner As Control, ByVal screensize As Size, ByVal fullscreen As Boolean)
- Dim dmode As DisplayMode = Manager.Adapters.Default.CurrentDisplayMode
- m_pparameters = New PresentParameters()
- 'Device einstellungen
- With m_pparameters
- .BackBufferCount = 1
- .BackBufferFormat = dmode.Format
- .BackBufferHeight = screensize.Height
- .BackBufferWidth = screensize.Width
- .Windowed = Not fullscreen
- .SwapEffect = SwapEffect.Discard
- .EnableAutoDepthStencil = True
- .AutoDepthStencilFormat = DepthFormat.D16
- End With
- 'device und surface initialisieren
- m_device = New Device(0, DeviceType.Hardware, owner, CreateFlags.SoftwareVertexProcessing, m_pparameters)
- m_surface = New Sprite(m_device)
- 'Listen initialisieren
- m_sprites = New List(Of ktsSprite)
- m_spriteids = New List(Of Long)
- m_zbufferoffsets = New List(Of Point)
- m_zbufferids = New List(Of Long)
- 'Standard-zBuffer hinzufügen
- m_zbufferids.Add(0)
- m_zbufferoffsets.Add(New Point(0, 0))
- End Sub
- Public Sub FinalizeEngine()
- m_device.Dispose()
- m_surface.Dispose()
- End Sub
- Public Sub Render()
- If m_device Is Nothing Then Exit Sub
- m_device.BeginScene()
- m_surface.Begin(SpriteFlags.AlphaBlend) 'wegen transparenz
- For i = 0 To m_zbufferids.Count - 1 'Für jede ebene
- For Each s As ktsSprite In m_sprites 'für jeden sprite
- If s.visible = True Then 'wenn das sprite gezeichnet werden soll
- If s.bufferid = 0 Then 'wenn die ebene die standard-ebene ist
- m_surface.Draw2D(s.texture, s.rotationscenter, s.rotationsangle, s.position, Color.White) 'color.white = &HFFFFFFF
- Else 'wenn die ebene nicht die standard-ebene ist
- If s.bufferid = m_zbufferids(i) Then 'wenn die ebene die aktuell durchlaufende ebene ist
- m_surface.Draw2D(s.texture, s.rotationscenter, s.rotationsangle, s.position, Color.White) 'zeichne das bild
- End If
- End If
- End If
- Next
- Next
- m_surface.End()
- m_device.EndScene()
- m_device.Present()
- End Sub
- Public Sub SaveScreenShot(ByVal path As String, ByVal format As ImageFileFormat)
- Dim surface As Surface = m_device.GetBackBuffer(0, 0, BackBufferType.Mono)
- SurfaceLoader.Save(path, format, surface)
- End Sub
- '--------------------------------------------------------------'
- '--------------------------- Sprites --------------------------'
- '--------------------------------------------------------------'
- Public Function AddSprite(ByVal img As Bitmap, ByVal position As Point, ByVal bufferid As Long) As Long
- If Not m_zbufferids.Contains(bufferid) Then Throw New zBufferNotValidException(bufferid) : Exit Function 'Überprüfen ob es die ebene gibt
- Dim newid As Long = GetFreeSpriteID()
- Dim sprite As New ktsSprite
- With sprite
- .bufferid = bufferid
- .position = position
- .rotationsangle = 0
- .rotationscenter = New Point(0, 0)
- .spriteid = newid
- .texture = New Texture(m_device, img, Usage.Dynamic, Pool.Default)
- .visible = True
- End With
- m_sprites.Add(sprite)
- m_spriteids.Add(newid)
- AddSprite = newid
- End Function
- Public Sub RemoveSprite(ByVal id As Long)
- If m_spriteids.Contains(id) Then
- m_sprites.RemoveAt(m_spriteids.IndexOf(id))
- m_spriteids.Remove(id)
- End If
- End Sub
- Public Sub SetSpriteRotation(ByVal id As Long, ByVal center As Point, ByVal angle As Single)
- If m_spriteids.Contains(id) Then
- m_sprites(m_spriteids.IndexOf(id)).rotationscenter = center
- m_sprites(m_spriteids.IndexOf(id)).rotationsangle = angle
- End If
- End Sub
- Public Sub SetSpritezBuffer(ByVal spriteid As Long, ByVal bufferid As Long)
- If m_spriteids.Contains(spriteid) AndAlso m_zbufferids.Contains(bufferid) Then 'Wenn es die SpriteID und die BufferID gibt
- m_sprites(m_spriteids.IndexOf(spriteid)).bufferid = bufferid
- End If
- End Sub
- Public Sub SetSpriteVisibility(ByVal id As Long, ByVal visible As Boolean)
- If m_spriteids.Contains(id) Then
- m_sprites(m_spriteids.IndexOf(id)).visible = visible
- End If
- End Sub
- Public Sub SetSpriteTexture(ByVal id As Long, ByVal img As Bitmap)
- If m_spriteids.Contains(id) Then
- m_sprites(m_spriteids.IndexOf(id)).texture = New Texture(m_device, img, Usage.Dynamic, Pool.Default)
- End If
- End Sub
- Public Sub SetSpritePosition(ByVal id As Long, ByVal position As Point)
- If m_spriteids.Contains(id) Then
- m_sprites(m_spriteids.IndexOf(id)).position = position
- End If
- End Sub
- Private Function GetFreeSpriteID() As Long
- Dim id As Long = 0
- Do Until Not m_spriteids.Contains(id) 'Schleife läuft solange bis es eine ID noch nicht gibt
- id = id + 1 'eins inkrementieren
- Loop
- GetFreeSpriteID = id
- End Function
- '--------------------------------------------------------------'
- '--------------------------- Buffer ---------------------------'
- '--------------------------------------------------------------'
- Public Function AddzBuffer(ByVal offset As Point) As Long
- Dim newid As Long = GetFreezBufferID()
- m_zbufferoffsets.Add(offset)
- m_zbufferids.Add(newid)
- AddzBuffer = newid
- End Function
- Public Sub RemovezBuffer(ByVal id As Long)
- If id = 0 Then Throw New zBufferNotValidException(id) : Exit Sub 'Standard-Buffer ist nicht löschbar
- If m_zbufferids.Contains(id) Then
- m_zbufferoffsets.RemoveAt(m_zbufferids.IndexOf(id))
- End If
- End Sub
- Public Sub SetzBufferOffset(ByVal id As Long, ByVal offset As Point)
- If id = 0 Then Throw New zBufferNotValidException(id) : Exit Sub
- If m_zbufferids.Contains(id) Then
- m_zbufferoffsets(m_zbufferids.IndexOf(id)) = offset
- End If
- End Sub
- Private Function GetFreezBufferID() As Long
- Dim id As Long = 0
- Do Until Not m_zbufferids.Contains(id)
- id = id + 1
- Loop
- GetFreezBufferID = id
- End Function
- End Class
- Public Class ktsSprite
- Public bufferid As Long
- Public spriteid As Long
- Public texture As Texture
- Public position As Point
- Public rotationscenter As Point
- Public rotationsangle As Single
- Public visible As Boolean
- End Class
- Public Class zBufferNotValidException
- Inherits Exception
- Dim m_id As Long
- Sub New(ByVal zbufferid As Long)
- m_id = zbufferid
- End Sub
- Public Overrides ReadOnly Property Message As String
- Get
- Return "Dieser Buffer(Ebene) ist nicht zulässig ! BufferID : " & m_id
- End Get
- End Property
- End Class
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trudi“ ()
-
-
-
-
-
-
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!! -
-
-
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 RedistributableIch 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
- Dim engine As DX2Dengine
- Dim CardsSprites As New List(Of SpriteStr)
- Private Structure SpriteStr
- Dim id As Long
- Dim Pos As PointF
- Dim Image As Image
- End Structure
- Private Sub gameFrm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- Dim newSprite As New SpriteStr
- newSprite.Image = Wiki.ThemesList(14).EdditionsList(1).CardList(163).image
- newSprite.Pos = New PointF(0, 0)
- newSprite.myRect = New RectangleF(newSprite.Pos.X, newSprite.Pos.Y, newSprite.Image.Width, newSprite.Image.Height)
- engine = New DX2Dengine
- engine.InitEngine(Me, Me.Size, True)
- newSprite.id = engine.AddSprite(newSprite.Image, newSprite.Pos)
- CardsSprites.Add(newSprite)
- End Sub
- Private Sub gameFrm_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
- engine.Render()
- End Sub
- Private Sub gameFrm_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
- engine.ClearSprites()
- engine.FinalizeEngine()
- 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“ ()
-
Benutzer online 1
1 Besucher
-
Ähnliche Themen
-
razor8 - - Sourcecode-Austausch