"যে কোনও বাটন প্রেস" সনাক্ত করা হচ্ছে


10

আমি প্লেয়ারটিকে মূল পৃষ্ঠা থেকে চালিয়ে যেতে কোনও বোতাম টিপতে দেওয়ার চেষ্টা করছি। আমি বোতামগুলির একটি তালিকা তৈরি করে এগুলির মধ্য দিয়ে লুপিং করতে পেরেছি এবং এর মধ্যে একটি নিচে থাকার জন্য পরীক্ষা করেছিলাম; তবে, আমি মনে করি এই কোডটি একদম কুৎসিত এবং আশ্চর্যজনক যে যদি এটি করার কোনও সহজ উপায় আছে যা আমি ঠিক ভাবছি না?

আমার কোডটি এখন কেমন দেখাচ্ছে তা এখানে:

            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;
                }
            }

অ্যারে তৈরি এবং লুপিংয়ের বিপরীতে আমি ব্যক্তিগতভাবে কেবল একটি বড় আইপি লুপ করব।
3:53 এ জাগল্যান্ট

@ জোন যদি একটি বড় লুপ হয় তবে কেন এটি আরও ভাল হবে?
ক্র্যাফটওয়ার্কস

আমি এই প্রশ্নটি পেয়েছি সমস্ত প্রতিক্রিয়া আমি পছন্দ করি। আমি মনে করি @ কাতু যদিও "সঠিক" উত্তর পেয়েছেন।
শেঠ ব্যাটিন

উত্তর:


10

এটি কাজ করা উচিত। প্রতিটি আপডেট লুপের শেষে, রাষ্ট্রটি সংরক্ষণ করুন previousGamePadState। তাহলে আপনি তাদের তুলনা করতে পারেন। পরিবর্তনগুলি সনাক্ত করার এটি দ্রুত উপায়। লুপ করার দরকার নেই।

গেমপ্যাডস্টেট.প্যাকেট নম্বর :

ইনপুট অবস্থা পরিবর্তন হয়েছে কিনা তা নির্ধারণ করতে আপনি প্যাকেট নাম্বার ব্যবহার করতে পারেন। যদি প্যাকেট নাম্বারের মান গেটস্টেটে দুটি ক্রমিক ক্রমের মধ্যে একই থাকে, তবে ইনপুটটিতে কোনও পরিবর্তন হয়নি।

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;
}

সম্পাদনা: পদ্ধতিতে পরিবর্তন হয়েছে। এটি ঠিক মতো কাজ করার গ্যারান্টিযুক্ত নয়, তবে কাজ করা উচিত। এছাড়াও, কারণ এটি প্রকৃতপক্ষে ইনপুটটির পরিবর্তনগুলি সনাক্ত করে, তাই ব্যবহারকারী যদি বোতামটি প্রকাশ করে তবে এটি এটির সাথেও দেখা যায়। আমি ifথাম্বস্টিক চলাচল সনাক্ত করতেও যুক্ত করেছি , যাতে আপনি কমপক্ষে এগুলি উপেক্ষা করতে পারেন।

আশা করি এটি আপনাকে সহায়তা করবে। আমাকে জানান, যদি এটি আপনার প্রয়োজনের সাথে খাপ না খায় তবে আমি নিশ্চিত যে আমরা এটি কার্যকর করতে পারি।

কীভাবে: কন্ট্রোলার বোতামটি এই ফ্রেম গেমপ্যাডস্টেটে চাপ দিয়েছে কিনা তা সনাক্ত করুন ac প্যাকেট নম্বর সম্পত্তি


এটি লেখার জন্য একটি অভিন্ন উপায় রয়েছে GamePadStateএবং enum Buttonsএটি ওপি যে প্রসঙ্গে ব্যবহার করছে বলে মনে হচ্ছে তার কাছাকাছি।
শেঠ ব্যাটিন

1
সকালের কফির আগে কোনও উত্তর দেওয়া উচিত নয় :)
Katu

1
এখন এটি কাজ করে এবং এটি এর চেয়ে দ্রুত আর পেতে পারে না।
কাটু

ওহ, সম্পূর্ণ আলাদা পদ্ধতি এবং আমি মনে করি আপনি এটির দ্রুততম সম্পর্কে সঠিক right খুশী হলাম।
শেঠ ব্যাটিন

এটি কি কেবল বোতাম টিপুন সনাক্ত করে বা এটি বাটন রিলিজগুলি সনাক্ত করে?
জর্জি ডেকেট

1

যদি আপনি প্রতিবিম্বের ব্যবহারটি আপত্তি না করেন তবে আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন (সম্ভবত এটিও ঠিক):

        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

আপনি নিজে পারে একটি খালি গঠন করাGamePadState , এবং তারপর জন্য (IN) সমতা এটি পরীক্ষা বর্তমান বাস্তব এক, যা আপনি দ্বারা আনা সঙ্গে কলিং 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.

}

এটি কাজ করে কিনা আমার কোনও ধারণা নেই; আমি কখনও এটি করার চেষ্টা করিনি। যদি এটি আপনার পক্ষে কার্যকর হয় তবে আমাকে জানান।
শেঠ ব্যাটিন

চতুর ধারণা, যদিও এটি কেবল তখনই কাজ করবে যদি গেমপ্যাডস্টেট সমান ওভাররাইড করে যা অসম্ভব। সম্ভবত, এটি রেফারেন্স সমতা ব্যবহার করবে এবং তাই উপরের বিবৃতিটি কখনই সত্যের কাছে মূল্যায়ন করবে না।
ক্র্যাফটওয়ার্কস

@craftworkgames Equalsআলাদা হয়; এটি একই উদাহরণ হিসাবে দুটি রেফারেন্স তুলনা করে। তবে GamePadStateতাদের মানগুলি তুলনা করতে == অপারেটরটি কি ওভারলোড করে, যা আমি আমার উত্তরে লিঙ্ক করেছি ( op_Equality)।
শেঠ ব্যাটিন

আসলে আমি বুঝতে পারি নি যে গেমপ্যাডস্টেট এমন কাঠামো যা সম্ভবত এটি কাজ করবে। প্রযুক্তিগতভাবে যদিও, সমান এবং == এর আচরণ প্রায়শই একই হয়, অবশ্যই এটি বাস্তবায়নের উপর নির্ভর করে তবে নির্দেশিকাগুলি এটিকে এভাবে প্রস্তাব দেয়। আপনি truely রেফারেন্স সমতা চান তাহলে আপনাকে সেখানে এছাড়াও object.ReferenceEquals msdn.microsoft.com/en-us/library/bsc2ak47.aspx
craftworkgames

আহ আপনি ঠিক বলেছেন, গেমপ্যাডস্টেট একটি মান-প্রকার, সুতরাং এটি প্রাসঙ্গিক নয়। নির্বিশেষে, == অতিরিক্ত লোড হয়েছে, পাশাপাশি এটি আইএমও ব্যবহার করতে পারে।
শেঠ ব্যাটিন

1

যেহেতু বাটনগুলি একটি এনামিউশন, আপনি এনাম.গ্যাটভ্যালু পদ্ধতিটি এর মতো ব্যবহার করতে পারেন :

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

foreach (var button in buttonList)
{
    if (GamePad.GetState(PlayerIndex.One).IsButtonDown(button))
        ExitMainMenu= true;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.