Monogame/XNA in Picturebox/ Control

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von φConst.

    Monogame/XNA in Picturebox/ Control

    Hallo zusammen,

    ich habe mir eine Klasse erstellt, die mir ein 3-Dimensionales Raster/Mesh darstellt und bearbeiten lässt. Ähnlich wie ein Terrain-Generator.
    Zur Zeit kommt der Input vom Benutzer einfach über eine Picturebox. Dort kann man mit z.B. Kreise die Ebne eindrücken,
    hochziehen oder Explosionen generieren die meine Klasse dann verarbeitet.

    Weil ich nicht jedes mal die Punkte exportieren, und in einem fremden Programm öffnen will um das Ergebnis zu sehen
    dachte ich mir MonoGame/XNA könnte da eine einfache Alternative sein.

    Es sollen nur 2 Dinge passieren -

    Wenn ich mit der Maus über die Picturebox gehe, soll die Ansicht so gedreht werden das man von Oben auf das Raster schaut.
    Dann wird ein Kreis eingeblendet; der den Radius des z.Z. ausgewählten Werkzeug darstellt.
    Wenn man mit der Maus die Picturebox verlässt, geht die Kameraposition um die RasterBreite/2 von dem Mesh weg.
    Danach wird einfach Rotiert, mit Blickpunkt auf 0.

    Jetzt habe ich damit ein Problem, und eine Frage.

    Wenn ich meine Form aufrufen will, bekomme ich die Fehlermeldung:


    VB.NET-Quellcode

    1. System.InvalidOperationException: "Das Starten einer zweiten Meldungsschleife auf einem einzelnen Thread ist ein ungültiger Vorgang. Verwenden Sie Form.ShowDialog."

    Das Form.ShowDialog() ist auch keine Option, da meine Picturebox nicht das übliche CornflowerBlue aufweißt, gehe ich davon aus das hier überhaupt nichts gestartet wird.


    Lege ich jetzt jedoch ein neues Projekt an- als Konsolenprojekt. Füge dem Projekt eine Form ein, und ein Picturebox darauf. Starte aus dem Modul/Console mit dem gleichen Code,
    funktioniert alles wie es soll.

    Ich gehe mal davon aus, das ich meiner Form einen eigenen Thread geben muss. Gleichzeitig muss aber auch die Gamelogik darauf folgen.
    Das ganze irritiert mich etwas.

    Die Klasse für mein Mesh, und die Form zur Bearbeitung sollen Teil eines größeren Projektes werden. Und dort arbeite ich vorwiegend mit MDI-Chields.
    Kann ich überhaupt eine Klasse die auf einem anderen Thread läuft, ein übergeordnetes Fenster mitgeben wo auf einem anderen Thread läuft?

    LG ^^

    Nachtrag :

    Das mit einem neuen Thread stimmt wohl :

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Module Module1
    2. Public Sub Main()
    3. Dim t As New System.Threading.Thread(AddressOf StartenForm)
    4. t.Start()
    5. End Sub
    6. Private Sub StartenForm()
    7. Dim bn As New renderfrm
    8. bn.Show()
    9. bn.game = New Render(bn.PictureBox1.Handle)
    10. bn.game.Run()
    11. End Sub
    12. End Module


    Bleibt nur die Frage mit dem MDI Chield/Parent Verhältnis zwischen 2 Threads?

    *Topic verschoben*

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Entschuldigt bitte den Doppelpost, aber die Sache mit den Threads läuft absolut nicht richtig.

    Meine Hauptform startet, dort befindet sich zur Zeit nur ein Button.

    VB.NET-Quellcode

    1. ''frm1
    2. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    3. Module1.Main()
    4. End Sub
    5. Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    6. Module1.StopRenderThread()
    7. End Sub


    Diese ruft folgendes Modul auf :

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Module Module1
    2. Public RenderThread As System.Threading.Thread = Nothing
    3. Public Sub Main()
    4. If IsNothing(RenderThread) Then
    5. RenderThread = New System.Threading.Thread(AddressOf StartenForm)
    6. RenderThread.Start()
    7. End If
    8. End Sub
    9. Private Sub StartenForm()
    10. Dim bn As New renderfrm
    11. bn.Show()
    12. bn._render= New Render(bn.PictureBox1.Handle)
    13. bn._render.Run()
    14. End Sub
    15. Public Sub StopRenderThread()
    16. If IsNothing(RenderThread) Then Exit Sub
    17. RenderThread.Abort()
    18. Do While True
    19. If Not RenderThread.IsAlive Then
    20. Exit Do
    21. End If
    22. Loop
    23. RenderThread = Nothing
    24. End Sub
    25. End Module


    Der Thread öffnet also eine 2 Form, und startet auch gleich die XNA Engine und übergibt das Handle der Picturebox.
    Weil XNA ja beim Starten der New/Run sein eigenes oder auch zugewiesene Fenster scheinbar selber instanziert habe ich zwei
    Event neu zugewiesen:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. 'Inerhalb der game Klasse von XNA
    2. Public Sub New(ByVal drawSurface As IntPtr)
    3. _Graphics = New GraphicsDeviceManager(Me)
    4. Content.RootDirectory = "Content"
    5. _DrawSurface = drawSurface
    6. AddHandler _Graphics.PreparingDeviceSettings, New EventHandler(Of PreparingDeviceSettingsEventArgs)(AddressOf graphics_PrepareDeviceSettings)
    7. AddHandler System.Windows.Forms.Control.FromHandle(Me.Window.Handle).VisibleChanged, New EventHandler(AddressOf Game1_VisibleChanged)
    8. End Sub
    9. Private Sub graphics_PrepareDeviceSettings(ByVal sender As Object, ByVal e As PreparingDeviceSettingsEventArgs)
    10. e.GraphicsDeviceInformation.GraphicsProfile = GraphicsProfile.HiDef
    11. e.GraphicsDeviceInformation.PresentationParameters.DeviceWindowHandle = _DrawSurface
    12. End Sub
    13. Private Sub Game1_VisibleChanged(ByVal sender As Object, ByVal e As EventArgs)
    14. If System.Windows.Forms.Control.FromHandle(Window.Handle).Visible Then
    15. System.Windows.Forms.Control.FromHandle(Window.Handle).Visible = False
    16. End If
    17. End Sub
    • graphics_PrepareDeviceSettings - Soll beim Erstellen der Klasse das Handle auf die Picturebox setzen. Funktioniert
    • Game1_VisibleChanged - Blendet das erste Fenster aus. Und hier verstehe ich einige Dinge nicht.
    Läuft das XNA Fenster mit der Picturebox in dem selben Thread wo ich in meinem Modul erstellt habe?
    Oder läuft das erste Fenster wo beim starten ausgeblendet wird in meinem Thread von meinem Modul,
    und das zweite sichtbare Fenster in wieder einem anderen Thread gesteuert vom Framework?

    Wenn zweites zutrifft, sollte ich dann nicht einfach aus dem Ereignis heraus, dort wo ich die erste Form Ausblende z.B. eine Meldung zum Stoppen des Threads und zum Disposen der Ressourcen?

    Ändere ich den Code in meinem Modul zu :

    VB.NET-Quellcode

    1. If IsNothing(RenderThread) Then
    2. RenderThread = New System.Threading.Thread(AddressOf StartenForm)
    3. RenderThread.Start()
    4. Else
    5. StopRenderThread()
    6. End If


    Kann ich die RenderForm beenden, und über das erste Formular auch wieder über Main Starten.
    Wenn ich die Funktion "StopRenderThread"richtig erstellt habe,
    sollte sie ja dem Thread einen Stop mitteilen,
    und dann so lange in der Schleife laufen, bis IsAlive = False ergibt.
    Darauf setzt er die Variabel auf Nothing. Bei einem erneuten Starten
    von Main() kann der Thread dann wieder gestartet werden.

    Wenn nun die StartForm das ClosingEvent feuert, und ich

    VB.NET-Quellcode

    1. Application.Exit()

    darin ausführe, sind dann wirklich alle Threads geschlossen?

    Kann ich das eventuell über die IDE überprüfen?

    Ich habe das Gefühl, das mit jedem F5/Debug mein Rechner langsamer wird.

    Bitte um Hilfe :whistling:

    LG
    Mit diesem XNA/Monogame jagt ein Problem das nächste.
    Erst Probleme mit dem Starten.

    Dann Probleme mit dem Input. Da die Game eigene Input Klasse,
    keine Tastendrücke, Mausbewegungen empfangen tut. Warum auch immer.
    Ich leite nun die Bewegungen und Inputs über die Events der Picturebox weiter.
    Dort funktionieren sie seltsamer weiße.

    Darauf Probleme mit der Content-Pipeline. Und dem *** xnb Format.
    Eigentlich brauche ich ja keine Modelle, aber wie man so ist will man ja
    das es schön aussieht. - Skybox.

    Nach dem die Skybox dann endlich über viele Umwege und andere Projekte,
    das XNB Format angenommen hatte und dargestellt wurde, viel mir das nächste auf.

    Die Kamera, funktioniert doch nicht so wie gedacht.

    Ich habe einmal eine Rotationskamera, die um einen bestimmten Punkt rotiert.
    Dieser Punkt ist das letzte Target der Freien Kamera. Die Rotation startet wenn
    man mittels Klick die Picturebox verlässt. Bei einem erneuten Klicken Stopt die Rotation,
    der Cursor verschwindet, und die Freie Kamera soll starten.

    Doch Funktioniert diese nicht. Könnte sich jemand einmal kurz meinen Code anschauen, und mir genau erklären wie die Rotation des Targets funktioniert?
    Ich möchte auch nicht die "Weltmatrix" um meine Kamera rotieren. Die Kamera, bzw. die Direction soll es.

    Hier die Klasse meiner Kamera :

    Spoiler anzeigen

    VB.NET-Quellcode

    1. ​Option Strict On
    2. Option Explicit On
    3. Imports System.Drawing.Drawing2D
    4. Imports System.Windows.Input
    5. Imports Microsoft.Xna.Framework
    6. Imports Microsoft.Xna.Framework.Input
    7. Imports Matrix = Microsoft.Xna.Framework.Matrix
    8. Public Class Kamera
    9. #Region "Var&Prop"
    10. Private _höhe As Integer
    11. Private _breite As Integer
    12. Private _View As Matrix
    13. Private _Projection As Matrix
    14. Private _CameraPosition As Vector3
    15. Private _CameraDirection As Vector3
    16. Private _CameraUp As Vector3
    17. Private _gameTime As GameTime
    18. Private _MoveMoment As Single = 0.5F
    19. Private _RotateMovment As Single = 1.2F
    20. Private _xDiff As Single
    21. Private _yDiff As Single
    22. Public Property gameTime() As GameTime
    23. Get
    24. Return _gameTime
    25. End Get
    26. Set(value As GameTime)
    27. _gameTime = value
    28. End Set
    29. End Property
    30. Private Property KameraUp() As Vector3
    31. Get
    32. Return _CameraUp
    33. End Get
    34. Set(value As Vector3)
    35. _CameraUp = value
    36. End Set
    37. End Property
    38. Public Property KameraRichtung() As Vector3
    39. Get
    40. Return _CameraDirection
    41. End Get
    42. Set(value As Vector3)
    43. _CameraDirection = value
    44. End Set
    45. End Property
    46. Public Property KameraPosition() As Vector3
    47. Get
    48. Return _CameraPosition
    49. End Get
    50. Set(value As Vector3)
    51. _CameraPosition = value
    52. End Set
    53. End Property
    54. Public Property Projection() As Matrix
    55. Get
    56. Return _Projection
    57. End Get
    58. Set(value As Matrix)
    59. _Projection = value
    60. End Set
    61. End Property
    62. Public Property View() As Matrix
    63. Get
    64. Return _View
    65. End Get
    66. Set(value As Matrix)
    67. _View = value
    68. End Set
    69. End Property
    70. #End Region
    71. Public Sub New(ByVal Pos As Vector3, ByVal target As Vector3, up As Vector3, ByVal breite As Integer, ByVal höhe As Integer)
    72. _CameraPosition = Pos
    73. _CameraDirection = target - _CameraPosition
    74. _CameraDirection.Normalize()
    75. _CameraUp = up
    76. _breite = breite
    77. _höhe = höhe
    78. CreateLookAt()
    79. End Sub
    80. Private Sub CreateLookAt()
    81. View = Matrix.CreateLookAt(_CameraPosition, _CameraPosition + _CameraDirection, _CameraUp)
    82. End Sub
    83. Public Sub UpdateRotation(ByVal xDiff As Single, ByVal yDiff As Single)
    84. _CameraDirection = Vector3.Transform(_CameraDirection, Matrix.CreateFromAxisAngle(_CameraUp, (((-MathHelper.PiOver4 / 150) * xDiff))))
    85. _CameraDirection = Vector3.Transform(_CameraDirection, Matrix.CreateFromAxisAngle(Vector3.Cross(_CameraUp, _CameraDirection), ((MathHelper.PiOver4 / 100) * yDiff)))
    86. _CameraUp = Vector3.Transform(_CameraUp, Matrix.CreateFromAxisAngle(Vector3.Cross(_CameraUp, _CameraDirection), ((MathHelper.PiOver4 / 100) * yDiff)))
    87. CreateLookAt()
    88. End Sub
    89. Public Sub UpdateMove(ByVal key As Input.Keys)
    90. If key = Keys.W Then _CameraPosition += _CameraDirection
    91. If key = Keys.S Then _CameraPosition -= _CameraDirection
    92. If key = Keys.A Then _CameraPosition += Vector3.Normalize(Vector3.Cross(_CameraUp, _CameraDirection))
    93. If key = Keys.D Then _CameraPosition -= Vector3.Normalize(Vector3.Cross(_CameraUp, _CameraDirection))
    94. If key = Keys.Q Then
    95. With _CameraPosition
    96. _CameraPosition = New Vector3(.X, _CameraPosition.Y + 1, .Z)
    97. End With
    98. End If
    99. If key = Keys.E Then
    100. With _CameraPosition
    101. _CameraPosition = New Vector3(.X, _CameraPosition.Y - 1, .Z)
    102. End With
    103. End If
    104. CreateLookAt()
    105. End Sub
    106. End Class


    Ich weiß nicht, vielleicht liegt es auch an meiner Skybox.
    Ich habe mir gedacht, das beste wäre wenn sie immer dort gezeichnet wird wo auch die aktuelle
    Kameraposition ist. Deswegen hier auch mal der Code :

    Code der Klasse Skybox :

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Imports Microsoft.Xna.Framework
    4. Imports Microsoft.Xna.Framework.Content
    5. Imports Microsoft.Xna.Framework.Graphics
    6. Public Class SkyBox
    7. Private _SkyBox As Model
    8. Private _TextureCube As Texture
    9. Public Sub New(ByVal Content As ContentManager)
    10. _SkyBox = Content.Load(Of Model)("Skybox")
    11. _TextureCube = Content.Load(Of Texture)("Cube1_auv")
    12. End Sub
    13. Public Sub Draw(ByVal world As Matrix, ByVal view As Matrix, ByVal Projection As Matrix, ByVal camPos As Vector3, ByVal device As GraphicsDevice)
    14. Dim ss As New SamplerState()
    15. ss.AddressU = TextureAddressMode.Clamp
    16. ss.AddressV = TextureAddressMode.Clamp
    17. device.SamplerStates(0) = ss
    18. Dim dds As New DepthStencilState()
    19. dds.DepthBufferEnable = False
    20. device.DepthStencilState = dds
    21. For Each mesh As ModelMesh In _SkyBox.Meshes()
    22. For Each basic As BasicEffect In mesh.Effects
    23. basic.TextureEnabled = True
    24. basic.World = world * Matrix.CreateTranslation(camPos)
    25. basic.View = view
    26. basic.Projection = Projection
    27. Next
    28. mesh.Draw()
    29. Next
    30. dds = New DepthStencilState()
    31. dds.DepthBufferEnable = True
    32. device.DepthStencilState = dds
    33. End Sub
    34. End Class


    In der XNA-Game Klasse die Update und Draw Sub könnten noch wichtig sein:

    VB.NET-Quellcode

    1. Protected Overrides Sub Update(ByVal gameTime As Microsoft.Xna.Framework.GameTime)
    2. _time = gameTime
    3. _Kamera.gameTime = gameTime
    4. If _Rotation Then RotateWorlds()
    5. _View = _Kamera.View
    6. _Target = _Kamera.KameraRichtung
    7. _Position = _Kamera.KameraPosition
    8. MyBase.Update(gameTime)
    9. End Sub
    10. Protected Overrides Sub Draw(ByVal gameTime As Microsoft.Xna.Framework.GameTime)
    11. _Device.Clear(Color.White)
    12. _SkyBox.Draw(_World, _View, _Projection, _Position, _Device)
    13. DrawVertices(gameTime)
    14. MyBase.Draw(gameTime)
    15. End Sub


    Die Sub Update holt sich aus der Klasse Kamera die aktuellen View,Target und Position der Kamera.
    Würde ich gerne später über Events lösen, doch bis dato muss es erstmal richtig funktionieren.

    Die Sub Draw ruft erst die Klasse Skybox auf, übergibt die aktuelle Global gespeicherte Variablen.
    Am Ende wird ein Würfel gezeichnet, den zum Testen eingefügt habe.

    Den auch mal als Quelltext, vielleicht habe ich dort auch einen Fehler :

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub DrawVertices(ByVal time As GameTime)
    2. Dim rnd As New System.Random(TimeOfDay.Second * TimeOfDay.Millisecond)
    3. _Device.SamplerStates(0) = SamplerState.LinearWrap
    4. _BasicEffect.World = _World
    5. _BasicEffect.Projection = _Projection
    6. _BasicEffect.View = _View
    7. _BasicEffect.VertexColorEnabled = True
    8. _Device.RasterizerState = RasterizerState.CullNone
    9. For Each pass As EffectPass In _BasicEffect.CurrentTechnique.Passes
    10. pass.Apply()
    11. Dim _Vertices(35) As VertexPositionColor
    12. _Vertices(0).Position = New Vector3(-1.0F, 1.0F, 1.0F)
    13. _Vertices(0).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    14. _Vertices(1).Position = New Vector3(-1.0F, -1.0F, 1.0F)
    15. _Vertices(1).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    16. _Vertices(2).Position = New Vector3(1.0F, 1.0F, 1.0F)
    17. _Vertices(2).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    18. _Vertices(3).Position = New Vector3(-1.0F, -1.0F, 1.0F)
    19. _Vertices(3).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    20. _Vertices(4).Position = New Vector3(1.0F, -1.0F, 1.0F)
    21. _Vertices(4).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    22. _Vertices(5).Position = New Vector3(1.0F, 1.0F, 1.0F)
    23. _Vertices(5).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    24. _Vertices(6).Position = New Vector3(-1.0F, 1.0F, -1.0F)
    25. _Vertices(6).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    26. _Vertices(7).Position = New Vector3(1.0F, 1.0F, -1.0F)
    27. _Vertices(7).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    28. _Vertices(8).Position = New Vector3(-1.0F, -1.0F, -1.0F)
    29. _Vertices(8).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    30. _Vertices(9).Position = New Vector3(-1.0F, -1.0F, -1.0F)
    31. _Vertices(9).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    32. _Vertices(10).Position = New Vector3(1.0F, 1.0F, -1.0F)
    33. _Vertices(10).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    34. _Vertices(11).Position = New Vector3(1.0F, -1.0F, -1.0F)
    35. _Vertices(11).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    36. _Vertices(12).Position = New Vector3(-1.0F, 1.0F, 1.0F)
    37. _Vertices(12).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    38. _Vertices(13).Position = New Vector3(1.0F, 1.0F, -1.0F)
    39. _Vertices(13).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    40. _Vertices(14).Position = New Vector3(-1.0F, 1.0F, -1.0F)
    41. _Vertices(14).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    42. _Vertices(15).Position = New Vector3(-1.0F, 1.0F, 1.0F)
    43. _Vertices(15).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    44. _Vertices(16).Position = New Vector3(1.0F, 1.0F, 1.0F)
    45. _Vertices(16).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    46. _Vertices(17).Position = New Vector3(1.0F, 1.0F, -1.0F)
    47. _Vertices(17).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    48. _Vertices(18).Position = New Vector3(-1.0F, -1.0F, 1.0F)
    49. _Vertices(18).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    50. _Vertices(19).Position = New Vector3(-1.0F, -1.0F, -1.0F)
    51. _Vertices(19).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    52. _Vertices(20).Position = New Vector3(1.0F, -1.0F, -1.0F)
    53. _Vertices(20).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    54. _Vertices(21).Position = New Vector3(-1.0F, -1.0F, 1.0F)
    55. _Vertices(21).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    56. _Vertices(22).Position = New Vector3(1.0F, -1.0F, -1.0F)
    57. _Vertices(22).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    58. _Vertices(23).Position = New Vector3(1.0F, -1.0F, 1.0F)
    59. _Vertices(23).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    60. _Vertices(24).Position = New Vector3(-1.0F, 1.0F, 1.0F)
    61. _Vertices(24).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    62. _Vertices(25).Position = New Vector3(-1.0F, -1.0F, -1.0F)
    63. _Vertices(25).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    64. _Vertices(26).Position = New Vector3(-1.0F, -1.0F, 1.0F)
    65. _Vertices(26).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    66. _Vertices(27).Position = New Vector3(-1.0F, 1.0F, -1.0F)
    67. _Vertices(27).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    68. _Vertices(28).Position = New Vector3(-1.0F, -1.0F, -1.0F)
    69. _Vertices(28).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    70. _Vertices(29).Position = New Vector3(-1.0F, 1.0F, 1.0F)
    71. _Vertices(29).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    72. _Vertices(30).Position = New Vector3(1.0F, 1.0F, 1.0F)
    73. _Vertices(30).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    74. _Vertices(31).Position = New Vector3(1.0F, -1.0F, 1.0F)
    75. _Vertices(31).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    76. _Vertices(32).Position = New Vector3(1.0F, -1.0F, -1.0F)
    77. _Vertices(32).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    78. _Vertices(33).Position = New Vector3(1.0F, 1.0F, -1.0F)
    79. _Vertices(33).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    80. _Vertices(34).Position = New Vector3(1.0F, 1.0F, 1.0F)
    81. _Vertices(34).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    82. _Vertices(35).Position = New Vector3(1.0F, -1.0F, -1.0F)
    83. _Vertices(35).Color = New Color(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))
    84. _Device.DrawUserPrimitives(Of VertexPositionColor)(PrimitiveType.TriangleList, _Vertices, 0, 12)
    85. Next
    86. End Sub


    Ich wäre euch sehr dankbar, wenn ihr mir mit der Kameraklasse und den Berechnungen helfen würdet.

    LG
    Schon mal das probiert: github.com/sqrMin1/MonoGame.Forms/wiki ?

    Ging ganz schnell, problemlos:



    Spoiler anzeigen

    C#-Quellcode

    1. // - 1 -
    2. public partial class Form1 : Form
    3. {
    4. public Form1()
    5. {
    6. InitializeComponent();
    7. }
    8. TestCntrl cntrl;
    9. private void Form1_Load(object sender, EventArgs e)
    10. {
    11. cntrl = new TestCntrl();
    12. cntrl.Size = new Size(500, 400);
    13. cntrl.Location = new Point(0, 0);
    14. this.Controls.Add(cntrl);
    15. }
    16. }


    Spoiler anzeigen

    C#-Quellcode

    1. // - 1 -
    2. public class TestCntrl : MonoGame.Forms.Controls.MonoGameControl
    3. {
    4. private SpriteBatch mSpriteBatch;
    5. private Texture2D mTex;
    6. private bool mFirstLoad;
    7. protected override void Update(GameTime gameTime)
    8. {
    9. base.Update(gameTime);
    10. if(!mFirstLoad)
    11. {
    12. mFirstLoad = true;
    13. mSpriteBatch = new SpriteBatch(GraphicsDevice);
    14. mTex = new Texture2D(GraphicsDevice, 1, 1);
    15. mTex.SetData<Color>(new Color[] { Color.Green });
    16. }
    17. }
    18. protected override void Draw()
    19. {
    20. base.Draw();
    21. if (!mFirstLoad)
    22. return;
    23. mSpriteBatch.Begin();
    24. mSpriteBatch.Draw(mTex, new Rectangle(0, 0, 50, 50), Color.White);
    25. mSpriteBatch.End();
    26. }
    Und Gott alleine weiß alles am allerbesten und besser.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „φConst“ ()