Autor Wątek: SharpDX - Pobranie pozycji myszy  (Przeczytany 1864 razy)

Offline Riw

  • Użytkownik

# Lipiec 12, 2015, 22:57:03
Witam,piszę swoją pierwszą grę w SharpDX po przesiadce z XNA,i mam problem,otóż nie wiem jak pobrać pozycję myszy relatywnie do Okna gry.W Xna robił do MouseManager,lecz w SharpDX okazuje się że mogę tylko pobrać różnicę pozycji,zamiast pozycji,podobnie w DirectInput.Czy ktoś z was wie jak mogę pobrać pozycję myszy relatywnie do okna gry ?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline timus

  • Użytkownik

# Lipiec 13, 2015, 01:59:30
Nie używam SharpDX, ale jeżeli masz okno oparte o SharpDX.Window.RenderForm to możesz pobierać pozycje myszki tak jak w normalnym c# form czyli na przykład tak: Point cursorRelative = window.PointToClient(Cursor.Position);

Offline Riw

  • Użytkownik

# Lipiec 13, 2015, 20:50:28
@timus
Niestety,ale używam standardowo klasy Game,główna klasa Editor dziedziczy po niej,nie chciałbym rezygnować z klasy Game,ponieważ w RenderForm nie m.in metod Update i Draw.

Offline timus

  • Użytkownik

# Lipiec 13, 2015, 23:31:00
Jeżeli naprawdę tego nie ma w SharpDX to zostaje jeszcze WinAPI, który będzie działał na każdym rodzaju okna na Windowsie:
using System;
using System.Runtime.InteropServices;

namespace Mouse
{
    [StructLayout(LayoutKind.Sequential)]
    public struct POINT
    {
        public int X;
        public int Y;

        public POINT(int x, int y)
        {
            this.X = x;
            this.Y = y;
        }
    }

    class Program
    {
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool GetCursorPos(out POINT lpPoint);

        [DllImport("user32.dll")]
        static extern IntPtr GetForegroundWindow();

        [DllImport("user32.dll")]
        static extern bool ScreenToClient(IntPtr hWnd, ref POINT lpPoint);

        static void Main(string[] args)
        {
            while (true)
            {
                POINT pos = GetCursorPos();
                Console.WriteLine("x: {0}, y: {1}", pos.X, pos.Y);
                Console.Read();
            }
        }

        static POINT GetCursorPos()
        {
            IntPtr hwnd = GetForegroundWindow();
            if (hwnd != IntPtr.Zero)
            {
                POINT p;
                if (GetCursorPos(out p))
                {
                    if (ScreenToClient(hwnd, ref p))
                    {
                        return p;
                    }
                }
            }
            return new POINT(0, 0);
        }
    }
}

Offline Riw

  • Użytkownik

# Lipiec 14, 2015, 11:01:17
@timus
Czy będzie to również działać w przypadku gdy będę chciał wykryć stan Hover w przypadku gdy obiekt będzie leżał na pozycji -1000,1000 a ja kamerką do niego dotrę?

Offline timus

  • Użytkownik

# Lipiec 14, 2015, 16:07:50
Kod zwraca pozycje myszki relatywna to okna wiec co z tym zrobisz to twoja sprawa. Jak masz grę/edytor w 3d to hover wykrywasz przez raycast'a, jak 2d to przez parę prostych obliczeń.

Offline Riw

  • Użytkownik

# Lipiec 14, 2015, 22:05:15
Ok,dzięki