Phát hiện bất kỳ nút nào Nhấn nút


10

Tôi đang cố gắng cho phép người chơi nhấn bất kỳ nút nào để tiếp tục từ trang chính. Tôi đã có thể làm điều này bằng cách lập Danh sách các Nút và lặp qua các nút này và kiểm tra xem một trong số chúng có bị hỏng không; tuy nhiên, tôi cảm thấy như mã này là loại xấu xí và tự hỏi liệu có cách nào đơn giản hơn để làm điều đó mà tôi không nghĩ đến?

Đây là mã của tôi trông như thế nào bây giờ:

            if (GamePad.GetState(PlayerIndex.One).IsConnected)
            {
                var buttonList = new List<Buttons>()
                {
                    {Buttons.A},
                    {Buttons.B},
                    {Buttons.Y},
                    {Buttons.X},
                    {Buttons.Start},
                    {Buttons.Back},
                    {Buttons.RightShoulder},
                    {Buttons.LeftShoulder},
                    {Buttons.RightTrigger},
                    {Buttons.LeftTrigger}
                };

                foreach (var button in buttonList)
                {
                    if (GamePad.GetState(PlayerIndex.One).IsButtonDown(button))
                        ExitMainMenu= true;
                }
            }

Cá nhân tôi chỉ cần thực hiện một vòng lặp IF lớn, trái ngược với việc tạo ra một mảng và vòng lặp.
jgallant

@Jon Vòng lặp IF lớn là gì và tại sao nó sẽ tốt hơn?
craftworkgames

Tôi thích tất cả các câu trả lời mà câu hỏi này nhận được. Tôi nghĩ rằng @Katu đã có câu trả lời "chính xác".
Seth Battin

Câu trả lời:


10

Điều này nên làm công việc. Trong cuối mỗi vòng lặp cập nhật, lưu trạng thái previousGamePadState. Sau đó, bạn có thể so sánh em. Đây là cách nhanh chóng để phát hiện các thay đổi. Không cần phải lặp.

GamePadState.PquetNumber :

Bạn có thể sử dụng PacketNumber để xác định xem trạng thái đầu vào có thay đổi hay không. Nếu giá trị của PacketNumber vẫn giữ nguyên giữa hai lệnh gọi tuần tự đến GetState, thì không có thay đổi nào trong đầu vào.

public bool HasInputChanged(GamePadState previousGamePadState, bool ignoreThumbsticks)
{ 
    GamePadState currentState = GamePad.GetState( PlayerIndex.One );
    if ((currentState.IsConnected) && (currentState.PacketNumber != previousGamePadState.PacketNumber))
    {
        //ignore thumbstick movement
        if ((ignoreThumbsticks == true) && ((currentState.ThumbSticks.Left.Length() != previousGamePadState.ThumbSticks.Left.Length() )&&(currentState.ThumbSticks.Right.Length() != previousGamePadState.ThumbSticks.Right.Length()) ))
            return false;
        return true
    }
    return false;
}

EDIT: Thay đổi thành phương pháp. Nó không được đảm bảo để hoạt động đúng như vậy, nhưng nên hoạt động. Ngoài ra, vì điều này thực sự phát hiện các thay đổi trong đầu vào, vì vậy nếu người dùng phát hành nút, nó cũng được nhìn thấy với điều này. Tôi cũng đã thêm ifđể phát hiện chuyển động của ngón tay cái, vì vậy bạn có thể bỏ qua những điều đó ít nhất.

Hy vọng điều này sẽ giúp bạn. Hãy cho tôi biết, nếu nó không phù hợp với nhu cầu của bạn, tôi chắc chắn chúng ta có thể giải quyết vấn đề này.

Cách: Phát hiện xem nút điều khiển đã được nhấn Khung này GamePadState.PquetNumber Thuộc tính


Có một cách tương tự để viết này cho GamePadStateenum Buttons, đó là gần gũi hơn với bối cảnh OP dường như được sử dụng.
Seth Battin

1
Không nên trả lời bất cứ điều gì trước khi uống cà phê buổi sáng :)
Katu

1
Bây giờ nó thực hiện công việc và nó không thể nhanh hơn thế này.
Katu

Whoa, phương pháp hoàn toàn khác biệt, và tôi nghĩ rằng bạn đúng về nó là nhanh nhất. Đẹp.
Seth Battin

Điều đó chỉ phát hiện các lần nhấn nút, hay nó cũng phát hiện các lần phát hành nút?
George Duckett

1

Nếu bạn không quan tâm đến việc sử dụng Reflection, bạn có thể sử dụng một cái gì đó giống như thế này (thậm chí có thể chính xác):

        var properties = typeof(GamePadButtons).GetProperties(BindingFlags.Public | BindingFlags.Instance);
        foreach (var property in properties)
        {
            var value = property.GetValue(GamePad.GetState(PlayerIndex.One).Buttons);
            if (value is ButtonState && (ButtonState)value == ButtonState.Pressed)
                ExitMainMenu = true;
        }

1

Bạn có thể tự tạo một khoảng trốngGamePadState , sau đó kiểm tra sự bằng nhau (bằng) với giá trị thực hiện tại mà bạn tìm nạp bằng cách gọi GamePad.GetState.

playerInput = GamePad.GetState(PlayerIndex.One);  
emptyInput = new GamePadState(Vector2.Zero, Vector2.Zero, 0, 0);
if (playerInput != emptyInput){

    // yay!!!!, a button push!
    // 
    // P.S., remember to allow any PlayerIndex to take control of the the game 
    // from the main menu.  It sucks when you pick up controller2 and it doesn't work.

}

Tôi không biết nếu điều này hoạt động; Tôi chưa bao giờ cố gắng để làm điều đó. Hãy cho tôi biết nếu nó làm việc cho bạn.
Seth Battin

Ý tưởng thông minh, mặc dù nó sẽ chỉ hoạt động nếu GamePadState ghi đè Bằng không thể xảy ra. Nhiều khả năng, nó sẽ sử dụng đẳng thức tham chiếu và do đó, câu lệnh if ở trên sẽ không bao giờ đánh giá là đúng.
craftworkgames

@craftworkgames Equalsthì khác; nó so sánh hai tài liệu tham khảo cho cùng một ví dụ. Nhưng GamePadStatecó quá tải toán tử == để so sánh các giá trị của chúng, mà tôi đã liên kết đến trong câu trả lời của mình ( op_Equality).
Seth Battin

Thật ra tôi đã không nhận ra GamePadState là một cấu trúc mà nó có thể sẽ hoạt động. Về mặt kỹ thuật, hành vi của Equals và == thường giống nhau, tất nhiên, nó phụ thuộc vào việc triển khai nhưng các hướng dẫn khuyến nghị theo cách này. Nếu bạn thực sự muốn bình đẳng tham chiếu, bạn cũng có đối tượng.ReferenceEquals msdn.microsoft.com/en-us/l
craftworkgames

À bạn nói đúng, GamePadState là một loại giá trị, vì vậy nó không liên quan. Bất kể, == là quá tải, cũng có thể sử dụng IMO.
Seth Battin

1

Vì các nút là một phép liệt kê, bạn có thể sử dụng phương thức Enum.GetValues như thế này:

var buttonList = (Buttons[])Enum.GetValues(typeof(Buttons));

foreach (var button in buttonList)
{
    if (GamePad.GetState(PlayerIndex.One).IsButtonDown(button))
        ExitMainMenu= true;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.