DirectX Tutorial befolgt - nach "Kombitabilitätseinstellungen" keine Load-Ereignis mehr.

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Pixxxas.

    DirectX Tutorial befolgt - nach "Kombitabilitätseinstellungen" keine Load-Ereignis mehr.

    Hallo zusammen,

    ich muss gleich nochmals fragen. Diesmal geht es um DirectX.

    Ich gehe gerade die Tutorials dieser Seite durch: vbprogramming.8k.com/tutorials/main.htm
    Und bin bei Sektion III Schritt 2) Initializing the Device (Rendering a blue screen)
    Ich habe alles Schritt für Schritt übernomen, es auch endlich mal verstanden (:D). Wenn ich das Programm jedoch startet, sehe ich nur eine leere Form. Auch wenn ich ein

    VB.NET-Quellcode

    1. MessageBox.Show("Test 123")

    einbaue. Die Box taucht nicht auf.

    Als ich das Programm zum ersten mal gestartet habe, stürtze es ohne brauchbare Fehlermeldung ab (Visual Basic Express hat davon scheinbar nichts mitbekommen. Fehlermeldungen wurden davon leider keine angezeigt.) Windows 7 (64 bit) meldete dann aber irgentwas, vonwegen das Programm würde nächstes mal mit Kombitabilitätseinstellungen starten.

    Startet tut es jetzt auch. Reagiert nur eben nichtmehr auf das Load der Form1 und führt somit den Code nicht aus.

    Ich hoffe ihr könnt mir hierbei helfen. Wenn ihr noch irgentwelche Infos braucht - bitte bescheid geben!

    Meine GameClass:

    VB.NET-Quellcode

    1. Imports Microsoft.DirectX
    2. Imports Microsoft.DirectX.Direct3D
    3. Imports Microsoft.DirectX.Direct3D.D3DX
    4. Public Class GameClass
    5. Public GameOver As Boolean
    6. Private D3Ddev As Device = Nothing
    7. 'Short for PresentationParameters
    8. Private D3Dpp As PresentParameters = Nothing
    9. Private DP As DisplayMode = Nothing
    10. Public Sub Initialize(ByVal TargetForm As Form, ByVal FullScreen As Boolean)
    11. If FullScreen Then
    12. '800x600 Resolution
    13. DP.Width = 800
    14. DP.Height = 600
    15. 'R5G6B5 = 16-bit. Visit MSDN to find out what the other ones are.
    16. DP.Format = Format.R5G6B5
    17. Else
    18. 'If it's not fullscreen, use the current display mode!
    19. DP = Manager.Adapters.Default.CurrentDisplayMode
    20. End If
    21. 'As usual, we must always instantiate our classes
    22. D3Dpp = New PresentParameters()
    23. 'Initialize some stuff for the Presentation parameters
    24. D3Dpp.BackBufferFormat = DP.Format
    25. D3Dpp.BackBufferWidth = DP.Width
    26. D3Dpp.BackBufferHeight = DP.Height
    27. 'There's flip, copy, and discard. Flip and Discard are used most often. Visit MSDN has more information.
    28. D3Dpp.SwapEffect = SwapEffect.Discard
    29. 'Present the scene immediately
    30. D3Dpp.PresentationInterval = PresentInterval.Immediate
    31. 'Set to Fullscreen or Windowed
    32. If FullScreen Then
    33. D3Dpp.Windowed = False
    34. Else
    35. D3Dpp.Windowed = True
    36. End If
    37. 'Instantiate the device
    38. D3Ddev = New Device(Manager.Adapters.Default.Adapter, DeviceType.Hardware, TargetForm.Handle, CreateFlags.SoftwareVertexProcessing, D3Dpp)
    39. End Sub
    40. Public Sub RenderScene()
    41. Do While Not GameOver
    42. 'Try commenting this out . You'll see what it does. It might hang your app depending on your graphics card. In DX 9.0a, the screen would flash in multiple colors if you didn't clear, this, you want to clear it with one color (see explanation below)
    43. D3Ddev.Clear(ClearFlags.Target, Color.FromArgb(0, 0, 225), 0, 0)
    44. D3Ddev.BeginScene()
    45. ' Rendering code goes here usually. But we're not rendering anything in this program. So don't type anything here.
    46. D3Ddev.EndScene()
    47. D3Ddev.Present()
    48. 'In a loop, keyboard events are ignored. This means: let them NOT be ignored :).
    49. Application.DoEvents()
    50. Loop
    51. Terminate()
    52. End Sub
    53. Public Sub Terminate()
    54. 'Free up mem
    55. DP = Nothing
    56. D3Dpp = Nothing
    57. D3Ddev.Dispose()
    58. D3Ddev = Nothing
    59. 'Exit
    60. Application.Exit()
    61. 'FORCE an exit if it didn't exit already.
    62. System.Environment.Exit(System.Environment.ExitCode)
    63. End Sub
    64. End Class


    Mein Form1-Code:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim Game As GameClass
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. 'We have to say Me.Show becuase the form doesn't actually get shown until AFTER the load event.
    5. 'Try emptying this sub, and type in MessageBox.Show("Hi"). Notice how
    6. 'the MessageBox appears *before* the form shows up?
    7. Me.Show()
    8. 'As usual, we must always instantiate our classes
    9. Game = New GameClass()
    10. 'Initialize the game
    11. 'Me - Render to form1
    12. 'True - Use fullscreen
    13. Game.Initialize(Me, True)
    14. Game.RenderScene()
    15. End Sub
    16. Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    17. If e.KeyCode = Keys.Escape Then
    18. Game.GameOver = True
    19. End If
    20. End Sub
    21. End Class

    jvbsl schrieb:

    du musst in den Projekteinstellungen die ZielCPU auf x64 stellen...

    Da ich die Express-Edition verwende, habe ich diesen Trick verwendet: [VB 2008] Ziel CPU umstellen

    Dies führt jedoch zu keiner Besserung - und zusätzlich zur Warnung:

    Quellcode

    1. Warnung 2 Beim Erstellen der Asssembly "8k.com DirectX Tutorial" wurde möglicherweise ein Problem entdeckt: Die Assembly Microsoft.DirectX.Direct3DX.dll, auf die verwiesen wird, hat einen anderen Zielprozessor. 8k.com DirectX Tutorial

    (Diese Warnung gibt es 5x identisch)
    hast du auch die neuste Direct3DX Version?(sollte keine Auswirkungen haben...)
    mir fällt ein, dass du evtl. anschließend die ddl's neu einfügen solltest...
    DP.Format = Format.R5G6B5 kenn ich auch anders(aber istja FullScreen^^)
    DP = Manager.Adapters.Default.CurrentDisplayMode ->ManagerAdapters verwende ich Allgemein nicht...

    evtl. solltest du mal probieren, das Projekt zu kompilieren und einfach direkt auszuführen...

    GameClass ist aber nicht in einer externen Klasse, oder?->Ansonsten müsstest du doch auch das ZeilFramework des anderen Projekts ändern...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    hast du auch die neuste Direct3DX Version?(sollte keine Auswirkungen haben...)
    Ist damit der Verweiß in den Projekteinstellungen gemeint? (Sorry, hab leider auch solchen Gebieten noch keinerlei Erfahrung) Wenn ja, das ist die Version 1.0.2911.0 sein.
    mir fällt ein, dass du evtl. anschließend die ddl's neu einfügen solltest...
    Wie schon gesagt - soetwas habe ich noch nie gemacht. Kannst du das etwas genauer beschreiben. (Kopieren von Datein via Windows Explorer in das Projektverzeichnis oder hinzufügen eines neuen verweißes?)
    DP.Format = Format.R5G6B5 kenn ich auch anders(aber istja FullScreen^^)
    Ich hab mir den Artikel dazu auf der MSDN durchgelesen, es dann aber einfach bei dem belassen, was im Tutorial verwendet wurde.

    DP = Manager.Adapters.Default.CurrentDisplayMode ->ManagerAdapters verwende ich Allgemein nicht...
    Gibt es dazu eine Alternative?

    evtl. solltest du mal probieren, das Projekt zu kompilieren und einfach direkt auszuführen...
    Wenn ich über "erstellen" "... erstellen" kompiliere und die Datei in bin/x64/release/....exe ausführe, bekomme ich eine Fehlermeldung über einen unbehandelten Fehler. Die Anwendung sei keine gültige Win32-Anwendung. (Es gibt noch etwas Text über Details, brauchst du den?) Das finde ich etwas komisch. Es müsste ja eigentlich eine Win64-Anwendung sein, oder?

    jvbsl schrieb:

    GameClass ist aber nicht in einer externen Klasse, oder?->Ansonsten müsstest du doch auch das ZeilFramework des anderen Projekts ändern...
    Nein, die Klasse ist über "Projekt" "Klasse hinzufügen" direkt zum Projekt hinzugefügt worden.

    Ist damit der Verweiß in den Projekteinstellungen gemeint? (Sorry, hab leider auch solchen Gebieten noch keinerlei Erfahrung) Wenn ja, das ist die Version 1.0.2911.0 sein.

    ist richtig...

    Wie schon gesagt - soetwas habe ich noch nie gemacht. Kannst du das etwas genauer beschreiben. (Kopieren von Datein via Windows Explorer in das Projektverzeichnis oder hinzufügen eines neuen verweißes?)

    bei den Projekteinstellungen->Verweise->alle Verweise mit Microsoft.Direct* löschen und anschließend dort über Hinzufügen wieder hinzufügen

    DP = Manager.Adapters.Default.CurrentDisplayMode ->ManagerAdapters verwende ich Allgemein nicht...

    ich gebe die Informationen der PresentationParameters direkt und fest an(die paar Einstellungen, die da übernommen werden sind denke ich irrelevant...)
    statt Manager.Adapters.Default.Adapter verwende ich 0, sollte (so wie ich gelesen habe) eigt. der Standard sein?!

    der Fehler mit der Win32 Anwendung kommt eigentlich wenn man die ZielCPU nicht auf x64 eingestellt hat...das wundert mich jetzt,ich kenne mich leider bei Express nicht so aus, aber guck am besten mal, ob du es überall richtig eingestellt hast, sonst kann ich dir hier wahrscheinlich nicht mehr weiterhelfen ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    jetzt komm ich mir aber echt blöd vor :P
    x64 ist doch für 64 Bit...
    und x86 für 32 Bit...
    und ich meine mich zu erinnern auch auf x64 umgestellt zu haben(für andere)

    naja wenns jetzt geht hab ich mich wohl geirrt...Entschuldigung dafür...(passiert langsam zu oft :P)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---