XNA Fragen

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von vb-checker.

    Hallo @ all

    Ich habe mal in letzter Zeit ein wenig mit XNA rumgespielt und habe dazu jetzt noch einige Fragen:

    1. Ich möchte gerne die Kollsion von einer Textur mit der Maus abfragen und wollte das so machen:

    VB.NET-Quellcode

    1. If star.Bounds.Contains(Mouse.GetState().X, Mouse.GetState().Y) And Mouse.GetState.LeftButton = ButtonState.Pressed Then
    2. star = Content.Load(Of Texture2D)("star_full")
    3. End If

    Ein Klick wird aber nur bei 0|0 erkannt obwohl sich die Textur bei 1280|0 befindet. Wo kann hier der Fehler liegen?


    2. Die ganzen Berechnung sollten in der Update Prozedur sein oder? In der Draw Funktion sollte ja so wenig gerechnet werden wie möglich damit sich aufs Zeichnen konzentrietrt werden kann und dies schön schnell abläuft. Wenn ich jetzt sowas wie oben in den Update Thread packe mit einem Else (das bei jedem zweiten Klicken das andere passiert) ist natürlich wegen der "Schleife" Zufall in welchen Teil der Abfrage gesprungen wird. Aber ich kann den Thread ja auch nicht einfach verzögern in dem ich mit einer Schleife solange warte bis die Maustaste wieder losgelassen wird. Wie wird sowas üblicherweise realisiert? Hoffe ich habe es verständlich rübergebracht.


    3. Wenn ich die Form vergrößere werden die Texturen erst nach loslassen der Maus neu gezeichnet. Während des vergrößerns werden sie Pixelig. Kann man das irgendwie umgehen?

    Bin für jede Hilfe dankbar. Viele Grüße
    Croasider
    Woher soll die Textur denn bitteschön wissen, wo sie gezeichnet wurde. Die kennt nur ihre Breite und Höhe. Die Location ist natürlich immer 0,0. Du weisst doch selbst, wo du zeicgnest, also sette die Location richtig

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Stimmt da hast du Recht... Aber über

    VB.NET-Quellcode

    1. star.Bounds.Location = New Point(x, y)


    Kann ich auch nichts machen. Dann kommt der Fehler:
    Der Ausdruck ist ein Wert und kann nicht als Ziel einer Zuweisung verwendet werden.
    Du musst ein neues Rectangle-Objekt erstellen, bei dem du die Location richtig setzt und die Size von deiner Textur übernimmst. Damit kannst du dann IntersectsWith aufrufen

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Du kannst das alles in einer Zeile machen: If new rectangle(...).Intersectswith(...) then

    Deine zweite Frage versteh ich nicht und bei der dritten denk ich nicht, dass es geht

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Croasider schrieb:


    2. Die ganzen Berechnung sollten in der Update Prozedur sein oder? In der Draw Funktion sollte ja so wenig gerechnet werden wie möglich damit sich aufs Zeichnen konzentrietrt werden kann und dies schön schnell abläuft.

    So sieht es aus.

    Croasider schrieb:


    3. Wenn ich die Form vergrößere werden die Texturen erst nach loslassen der Maus neu gezeichnet. Während des vergrößerns werden sie Pixelig. Kann man das irgendwie umgehen?


    Soweit ich das weiß, lässt sich dort nichts dran ändern....

    lg
    1. stell dir jetzt mal vor du hast 10000000 sterne... verausch bitte bei der If Abfrage die beiden mit And verknüpften abfragen und verwende anstelle von And Andalso...
    2. mach dir eine Variable wo der Status der Maus von der letzten Update-Prozedur zwischengespeichert wird. Wenn sich da nun von LeftButton der Wert von Pressed auf(None/Release/was auch immer) ändert, so wurde die Maustaste losgelassen->MouseUp, genauso funktioniert das auch umgekehrt..
    3. Du könntest in dieser Zeit das Rendern verhindern. Evtl. wäre es auch möglich im Resize Event, was kontinuierlich aufgerufen wird(und wenn du darauf mit WinAPI reagieren musst...xD) und dort dann selbst die größe des Backbuffers ändern, was ich aber keinem empfehlen werde...

    Edit: Und außerdem lädt man weder in Draw noch Update Methode Daten nach(es sei denn du implementierst ein ContentStreaming bei ner verdammt großen Map z.B. - was ich bezweifle...). Man Lädt alle Texturen beim Start und hält sie im Speicher, bei einem wechsel zeichnest du einfach die andere textur...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

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

    Du könntest jedes Mal die Fenstergröße (mit einer vorher festgelegten Größe) vergleichen und wenn die ungleich sind, zeichnest du nix und setzt die gespeicherte Größe = aktuelle Größe.

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    jvbsl schrieb:

    1. stell dir jetzt mal vor du hast 10000000 sterne... verausch bitte bei der If Abfrage die beiden mit And verknüpften abfragen und verwende anstelle von And Andalso...


    Danke schonal na alle. Ihr habt mir echt weitergeholfen :)
    Okay da hast du recht das sollte man wohl so machen. Aber der Code von obne geht ja eh nicht. Eine andere Lösung als mit dem Rectangle gibt es also nicht? Ich kann bei der Kollisionabfrage nicht mit den Bounds rechnen??