DirectX Grundlegende Fragen

  • VB.NET

Es gibt 33 Antworten in diesem Thema. Der letzte Beitrag () ist von skyscater.

    DirectX Grundlegende Fragen

    Hallo,
    hab mich entschieden mit DirectX anzufangen und hab in den letzten paar Tagen paar Tuts durchgemacht, nur sind nach und nach folgende Fragen aufgetaucht:
    1. Stimmt das, dass Managed DirectX nach und nach durch XNA ausgetauscht wird (währ es dann villeicht kluger gleich mit XNA anzufangen)?
    2. Würd fürs erste gern ein 2D Game programmieren und benutze zur Zeit Sprites, sollte ich das beibehalten oder umsteigen?
    3. Bei den Sprites gibts ja .draw und .draw2D worin liegt da der Unterschied was sollte ich benutzen?
    4. Benutze derzeit eine While schleife als render schleife. is da Ein timer besser? oder wie macht ihr das?
    5. Wenn ihr euer spiel in den Fullscreenmodus wechseln lasst, fragt ihr dann nur die Auflösung aber oder kontroliert ihr auch noch andere dinge der Grafikkarte?
    6. Wenn sich etwas bewegen soll macht ihr das mit nem Timer oder in der Render schleife? Wenn in der Schleife limitiert ihr dann die Framerate ?
    7. Wie kann ich mit sprites bewegliche gifs malen odewr wie bring ich überhaupt bewegliche gifs auf mein programm?
    8. Benutzt ihr wenn ihr eine while schleife zum rendern benutzt Application.doEvents?
    9. Benutze zur Zeit zur Steuerung DirectXInput. Nehmt ihr das auch oder gibts was besseres?
    Hoffe das sind nicht zuviele Fragen und jemand nimmt sich die Mühe mir zu Helfen :D
    mfg.skyscater
    1. Nicht nach und nach... XNA ist sozusagen der Nachfolger von ManagedDirectX, ManagedDirectX unterstützt nur "DirectX9.0c" (Ich finde es immer gut, wenn man auch MDX kann, denn dort ist es um einiges schwieriger und man versteht auch die Hintergründe, was in XNA z.B. passiert besser)
    2. Ja Sprites sind perfekt
    3. Draw2D zeichnet einfach im 2D Raum, bei Draw kannst du die Texturen weiter weg oder näher zur Kamera bringen...
    4. Kommt immer drauf an - bei einer Schleife limitiere ich die Framerate nicht
    5. Weiß ich nicht genau was du hier wissen willst
    6. In der Render Routine, dabei wird die Bewegungsgeschwindigkeit einfach mit (TickCount - lastTickCount) multipliziert(System.Environment.TickCount - bei XNA gibt es da schon etwas vorgefertigtes in der Update Methode)
    7. Das wird nur schwer Möglich sein, aber du kannst immernoch mehrere Bilder verwenden, bzw. ein einzelnes Bild(welches alle Bilder aneinandergereiht enthält), dann gibst du einfach ein entsprechdes Source-Rectangle an
    8. Im Fenstermodus aufjedenfall - Fullscreen niemals
    9. DirectInput, etwas besseres wirds wohl kaum geben...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Danke für deine Hilfe! :D

    3.Benutzt du in deinem ganzen Programm nur ein Sprite und änderst für die verschiedenen Objekte dann ledeglich die Texture?
    Das Problem das ich hatte wie ich statt sprite.draw sprite.draw2d benutzt hab war, dass der text den ich nach dem Bildzeichnen auch mit dem Sprite zeichnen ließ plötzlich am bild stand und nicht dort wo er sollte.

    4.Worauf? :/

    5.Bei vielen Tutorials werden vor dem Fullscreenmode viele Abfragen gestellt und die Grafikkarte getestet was die alles unterstützt und so. Benutzt du einfach die Derezitige Auflösung? Prüfst du die Grafikkarte auf was die alles unterstüzt?

    6. Wenn du die Framerate nicht begrenzst läufgt das Spiel auf unterschiedlichen Rechnern dann nicht auch unterschiedlich schnell?

    8. benutzt du im Fullscreen dann was anderes?

    Sry dass ich soviel frage und danke dast mir hilfst :D ^^
    mfg.skyscater
    3.Benutzt du in deinem ganzen Programm nur ein Sprite und änderst für die verschiedenen Objekte dann ledeglich die Texture?
    Das Problem das ich hatte wie ich statt sprite.draw sprite.draw2d benutzt hab war, dass der text den ich nach dem Bildzeichnen auch mit dem Sprite zeichnen ließ plötzlich am bild stand und nicht dort wo er sollte.

    Natürlich nur eins, der Performance wegen...
    Zu dem Problem, welche Direct3DX Assembly Version verwendest du denn?

    4. Darauf, ob es sich um eine flüssige Animation handeln soll-> While, andernfalls mit einem Timer, warum unnötig CPU und GPU belasten...

    5. Bei mir wird das direkt beim Starten erledigt, sodass man sich eigt. selbst einstellen kann, was man Möchte(Es kann aber auch autom. eine Einstellung vorgenommen werden), natürlich wird nur aufgelistet, was unterstützt wird ;)

    6. Wie gesagt, die Framerate läuft bei mir dann immer so schnell wie Möglich, damit das zeug entsprechend gleich schnell animiert wird, verwende ich dann sozusagen die FPS Anzahl(nur in Ticks und nicht in Sekunden)...

    8. Nein, das ist unnötig. App.DoEvents sollte im Fullscreen glaub ich sogar eine Exception werfen. App.DoEvents ist nur dafür da, dass man das Formular noch benutzen kann, sprich Maximieren, Minimieren und Schließen(
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Hab jz die neuste(1.0.2911 eigebunden).
    5.ja das hab ich eh gemeint. Kennst villeicht n gutes tut was alles erklärt? (die meisten erklären immer nur nen teil ><)
    6. sry das hab ich nicht so ganz vertsnanden :/ derweil zähl ich in der render rutine (hab immer ne fps anzahl von ca.60) ne variable hoch und zeichne ne textur mit der x koordinate der variable. ( die bewegung ist nur mal zum ausprobieren gewesen). hast das gemeint?

    Hab mich gerade daran versucht eine einfache Linie zu zeichnen und habd as über 2 verticies und drawprimitives gemacht nur kann ich da ja die dicke nicht einstellen. Da muss ich ein rechteck benutzen sprich 2 dreiecke oder gibts da ne bessere lösung für ne einfdache 2d linie in nem 2d raum?

    Hab google gerade mit der frage wie ich eine kollision mit sprites er´kenne gequählt nur will google nicht so richtig >< Wie kann ich sowas erkennen?

    Und DANKE! :D
    5. Nein tut mir Leid, außerdem weiß ich nicht - alles hört sich nach ziemlich viel an^^
    6. Hier mal ein Beispiel:

    VB.NET-Quellcode

    1. 'VelocityX z.B. 3
    2. 'oTickCount bekommt direkt beim Start auch System.Environment.TickCount zugewiesen
    3. tmp = System.Environment.TickCount
    4. XPosition += VelocityX * (tmp - oTickCount) / 100
    5. oTickCount = tmp

    dabei sollte sich egal bei welcher Framerate XPosition in jeder Sekunde um 30 erhöhen(3 in 100 ms)...

    zu den Linien sollte das Helfen:psiman.wordpress.com/2006/12/07/mdx-linedrawtransform/
    Andernfalls müsstest du halt immer ein Polygon zeichnen...

    Hast du Rechteckskollision schon eingebaut? (Rechteckskollision ist wirklich sehr einfach und kann man sich sogar selbst ohne jegliche Hilfe herleiten - mach erst mal das ;))
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Wegen dem problem mit dem sprite.draw2d welche version der 3DX benutzt du?
    5. ^^ Könntest mir villeicht sagen auf was du alles prüfst bitte?

    Darauf hätt ich selber auch drauf kommen können ><

    Nein habs gerade versucht und es hat sich schwieriger herausgestellt als ich mir gedacht hatte ><. hätt mir gedacht, das ich rechtecke der texturen benutz um das zu prüfen, nur gebe ich zur zeit testweise die position der texturen erst in der drawmethode des sprites an und somit komm ich an das rechteck nicht ran >< Hab da mal was gehört von pixelüberlagerung oder so währe das ne möglichkeit?

    und wieder mal danke! ^^
    mfg.skyscater
    Wegen dem problem mit dem sprite.draw2d welche version der 3DX benutzt du?

    1.0.2911 - habe ich verwendet^^

    5. Ich erledige hier noch was, dann such ich mal nach meinen alten Projekten und dann schreib ich mal ;)


    Nein habs gerade versucht und es hat sich schwieriger herausgestellt als ich mir gedacht hatte ><.

    Ist es^^

    Quellcode

    1. (rechteck1.X + recteck1.Breite >= recteck2.X UND recteck1.X <= rechteck2.X + rechteck2.Breite) UND (rechteck1.Y + rechteck1.Höhe >= rechteck2.Y UND rechteck1.Y <= rechteck2.Y + rechteck2.Höhe)

    Hier wird auch ein direkt angrenzendes Rechteck als Kollision erkannt, ist das nicht gewollt einfach das gleichheitszeichen entfernen...
    Und das ist aus dem Kopf geschrieben ;)

    hätt mir gedacht, das ich rechtecke der texturen benutz um das zu prüfen, nur gebe ich zur zeit testweise die position der texturen erst in der drawmethode des sprites an und somit komm ich an das rechteck nicht ran ><

    Dann musst du daran wohl etwas ändern ;)

    Hab da mal was gehört von pixelüberlagerung oder so währe das ne möglichkeit?

    Wäre es nicht, denn bevor man eine PerPixelCollision durchführt überprüft man erst ob es eine Rechteckskollision gibt, wenn dies der Fall ist, dann wird auf die Pixel überprüft(der Performance wegen) - außerdem würdest du da ebenfalls die Positionen sowie Größen der Texturen benötigen ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    haha werd das scho iwie im griff bekommen ....

    :DD DANKE DANKE DANKE! ^^

    Genau das hab ich gehabt :D (bin doch nicht so dumm :D ^^)
    ok werd sowieso gleich mal n richtiges "projekt" anfangen und dann ne klasse dafür progn....
    ok könntest mir das villeicht bitte erklären mit der PerPixelKollision oder links gebn, hab nix für mich verständliches gefunden ><
    mfg.skyscater
    Also zum Pixel auslesen:
    gamedev.net/topic/547224-direc…__p__4525794#entry4525794
    und hier für .Net:
    gamedev.net/topic/217618-manag…tx-lockrectangle-problem/

    Und es kollidiert, sobald zwei eingefärbte Pixel(nicht Transparent) an derselben Position sind...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Also wenn ich nach meinem Text oben gehe, dann hab ich noch nichts gefunden, da ich nicht angefangen hätte zu Suchen(das was ich davor noch gemacht hätte hab ich noch nicht fertig^^)...
    Hab jetzt trotzdem mal gesucht und dank meinem strukturierten Chaos das ganze schneller gefunden als gedacht...
    Jetzt nur noch durch gucken:

    - Alle Adapter also Grafikkarten auflisten
    - die möglichen DeviceTypes(Software/Hardware/Reference)
    - VertexProcessings(SoftwareVertex,HardwareVertex, PureDevice)
    - Display Modes(Breite, Höhe, RefreshRate und das VideoFormat)
    - MultiSampleType
    - DepthStencilBufferFormat
    - BackBufferFormat
    - PresentationInterval

    ich denke das wars...

    Und ich verwende bei anzeigen in 2D keine Matrizen ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    asso ^^
    hehe Struckturiertes chaos kenn ich nur zu gut ^^
    Danke! :D

    Häge nur schon wieder >< diesmal bei der PerPixelKollision:
    um an die werte zu kommen hab ich das benutzt:

    VB.NET-Quellcode

    1. Dim pixels As UInteger(,) = CType(sprite1.Texture.LockRectangle(GetType(UInteger), 0, LockFlags.ReadOnly, sprite1.rectangle.Width, sprite1.rectangle.Height), UInteger(,))

    Nur macht directx dann gar nichts mehr wenn ichd as aufrufe >< es bewegt sich einfach nichts mehr und ist wie eingefroren aber die form kann ich noch problemlos bewegen minimieren,maximieren und schließen.
    Bitte um Hilfe.
    mfg.skyscater
    da würde ich wohl noch follgenden Code benötigen, um da etwas näheres dazu sagen zu können...

    Funktioniert denn die Rechteckskollision bereits? Bevor die nicht funktioniert fang am besten mit gar nichts anderem an^^
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    rechteckollision funktioniert einwandfrei :D

    Ich hab nur das mal aber er macht ja selbst da schon nichts ><
    sprich ich hab danach eine msgbox die er nicht öffnet, also er "hängt" sich bei dem stück code auf ><
    mfg.skyscater
    hab ein wenig herumprobiert und ich hab so das wage gefühl das es etwas mit der textur selbst zu tun hat:
    Hier wie ich sie intialisiert hab:

    VB.NET-Quellcode

    1. dim mTexture as Texture
    2. mTexture = TextureLoader.FromStream(theDevice, Me.GetType().Assembly.GetManifestResourceStream(theTextureName), 64, 64, 24, 0, Format.Unknown, Pool.Default, Filter.None, Filter.None, 0)

    Hoffe man kann mir helfen.
    mfg.skyscater
    es kommt immer noch n fehler ><:
    Das objekt enthält keine Primitiven daten!
    Liegt immer noch an der zeile:

    VB.NET-Quellcode

    1. Dim pixels As UInteger(,) = CType(sprite1.Texture.LockRectangle(GetType(UInteger(,)), 0, LockFlags.ReadOnly, sprite1.rectangle.Width, sprite1.rectangle.Height), UInteger(,))

    mfg.skyscater
    sieht ziemlich schwer aus, aber ich könnte mir gut vorstellen, dass es damit zusammenhängt, dass du das ganze aus einem Stream(Resourcen) lädst, was ich im Allgemeinen nicht empfehlen würde...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    habs jetzt aus nem file geladen:

    VB.NET-Quellcode

    1. mTexture = TextureLoader.FromFile(theDevice, theTextureName,64, 64, 24, 0, Format.Unknown, Pool.Managed, Filter.None, Filter.None, 0)

    fehler immer noch der selbe ><
    mfg.skyscater