XNA에서 마우스 입력을 처리하는 방법?


13

XNA에서 카드 게임을 개발 중입니다.

어떤 거기에 OnClick개체에 대한 XNA의 이벤트는?

플레이어가 클릭 할 때 카드를 움직이려고합니다. 이 프로젝트에는 카드를 그리는 Sprite 클래스가 있지만 OnClick이벤트 또는 이와 유사한 것을 사용하는 방법을 모르기 때문에 조금 붙어 있습니다.

답변:


12

일반적으로 XNA로 작업 할 때는 이벤트 중심 코드 패러다임에서 루프 중심 코드 패러다임으로 이동해야합니다. 업데이트 코드는 초당 60 번 반복됩니다. 따라서 매번 마우스 상태를보고 버튼이 눌려서 포인터가 rect 내에 있으면 일반적으로 OnClick 이벤트에 배치 할 코드로 분기됩니다.


2
그것은 의미 적으로 정확할 수도 있지만 내 의견으로는 틀린 것 같습니다. 스레드를 살펴 보거나 각 루프 중 현재 상태가 어떤 이벤트도 없습니다. 그렇기 때문에 자체 이벤트를 작성하고 해당 핸들러를 작성합니다. 흐름 제어를 사용하여 모든 마우스 다운 인스턴스로 분기하면 큰 프로젝트에서 미치게 될 것입니다. 대신, 이벤트를 등록하고 필요한 경우 핸들러를 작성하십시오. 이런 이유로 이벤트가 처음부터 생각되었습니다.
브랜든

5
Brandon : 플로우 컨트롤을 사용하여 모든 마우스 다운으로 분기하지는 않습니다. 각 프레임의 시작 부분에서 현재 및 이전 마우스 상태를 한 번 기록한 다음 코드가 mousedown press에 응답하는 모든 위치에서 간단히 수행 if(MouseLeftPress()){ DoSomething(); }하면됩니다. 여기서 MouseLeftPress()현재 및 이전 왼쪽 버튼 마우스 상태를 비교하기 위해 작성하는 방법입니다. 대부분의 경우 이벤트를 구현하는 것보다 훨씬 쉽습니다.
Olhovsky

4
간단한 폴링은 기본 아케이드 컨트롤을 넘어선 추악합니다. 게임 패드 상태를 FlagAttributes로 캡처하고 대리자를 다른 버튼 조합에 매핑 할 수있는 입력 관리자 클래스가 있습니다. 다음 단계는 타이밍을 구현하는 것입니다. 이 모든 토론은 Steve H의 요점을 강화시켜줍니다. 폴링 시스템을 제공하고 있으며 원하는 패러다임을 지원하기 위해 자유롭게 구축 할 수 있습니다.
michael.bartnett


6

XNA는 자신 만의 입력 클래스를 구축하기에 충분할 뿐이며 제공하는 유틸리티를 고려하여 그렇게해야합니다.

에 설명 된 마우스 입력 클래스를 권장합니다 이 블로그 게시물 ( 소스 코드 )에 . 버튼을 누르거나 누르고 있거나 놓는 것을 감지하고 폴링 또는 이벤트를 통해 해당 정보를 얻을 수 있습니다.

관련 메모에서 동일한 블로그 게시물은 키보드 및 게임 패드 입력 장치 클래스도 제공합니다.


3

XNA에서 마우스 클릭을 확인하기위한 실제 코드는 다음과 같습니다.

    MouseState previousMouseState;
    protected override void Initialize()
    {
        // TODO: Add your initialization logic here
        //store the current state of the mouse
        previousMouseState = Mouse.GetState();
    }


    protected override void Update(GameTime gameTime)
    {
        // .. other update code


        //is there a mouse click?
        //A mouse click occurs if the goes from a released state
        //in the previous frame  to a pressed state 
        //in the current frame
        if (previousMouseState.LeftButton == ButtonState.Released 
            && Mouse.GetState().LeftButton == ButtonState.Pressed)
        {
            //do your mouse click response...

        }

        //save the current mouse state for the next frame
        // the current 
        previousMouseState = Mouse.GetState();

        base.Update(gameTime);
    }

2

게임이 3D 인 경우 다음에 설명 된 피킹을 구현할 수 있습니다. http://create.msdn.com/en-US/education/catalog/sample/picking_triangle . 기본적으로 이것은 카메라에서 마우스가 클릭하는 곳까지의 광선을 생성합니다 (작은 매트릭스가 투영되지 않음). 광선에 의해 교차 된 물체가 있는지 확인합니다.

게임이 2D 인 경우 창 좌표를 게임 좌표로 상당히 쉽게 변환 할 수 있어야합니다. 그런 다음 선택한 좌표가 객체의 경계 내에 있는지 확인하십시오.


1

마우스 클릭 여부를 확인하는 가장 간단한 방법은 다음과 같습니다.

//Create this variable
MouseState mouseState;

이제 업데이트 방법에서 이것을 추가하십시오.

mouseState = Mouse.GetState();

if (mouse.RightButton == ButtonState.Pressed)
{
     //Do Stuff
}

이것이 도움이 되었기를 바랍니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.