একটি মূল প্রেস শুরু করার পরে বিলম্ব অপসারণ


11

আমি একটি সহজ গেম তৈরি করছি, এবং আমি যে সমস্যার মুখোমুখি হয়েছি তার মধ্যে একটি হ'ল বিরক্তিকর বিলম্ব যখন একটি ক্রমাগত কী টিপুন।

সুতরাং মূলত, যখন আমি উদাহরণস্বরূপ (খুব দীর্ঘ সময়ের জন্য) Upটিপছি তখন আমার অবজেক্টটি 1 ইউনিট উপরে চলে যাবে, সরবে না (প্রায় 1 সেকেন্ডের জন্য), এবং তারপরে ধারাবাহিকভাবে 1 ইউনিট উপরে চলে যাবে (কোনও বিলম্ব ছাড়াই)।

বর্তমানে, আমি অবজেক্টটি (এসডিএল 2) স্থানান্তর করতে এটি ব্যবহার করছি:

while (SDL_PollEvent(&event))
{
    switch (event.type)
    {
    case SDL_KEYDOWN:
        switch (event.key.keysym.sym)
        {
        case SDLK_UP:
            //Move object 1 unit up
            break;
        //Other unrelated things omitted
        }
        break;
    //Omitted other cases
    }
}

আমি যা চাই তা হ'ল বিলম্বটি সরিয়ে ফেলা, যাতে অবজেক্টটি তাত্ক্ষণিকভাবে Upখুব দ্রুত সরাতে পারে । এই কাজ করতে কোন উপায় আছে কি?

উত্তর:


19

কী-ডাউন ইভেন্টগুলি বহিষ্কার হওয়ার জন্য অপেক্ষা করে, আপনি সম্ভবত কী ইভেন্টের পুনরাবৃত্তির হারের করুণায় রয়েছেন যা ওএস নিয়ন্ত্রণ করে (এবং কোন ব্যবহারকারীরা সেগুলি নির্দিষ্ট করতে পারে)।

পরিবর্তে, কীবোর্ডের স্থিতি পেতে SDL_GetKeyboardStateআপনার গেম আপডেট লুপের ( প্রতিটি ফ্রেম ঘটবে এমন আপডেটের অংশটি, কোনও ইভেন্ট এসেছিল কিনা) শীর্ষে আপনি কল করতে চাইতে পারেন এবং এটি পরীক্ষা করে দেখুন কিনা কী কোনও স্বতন্ত্র ফ্রেমের সময় ডাউন বা না থাকে।


উইন্ডো বার্তা শুনতে ভাল না? পোলিং ব্যবহার করে আমি কখনও কখনও খুব সংক্ষিপ্ত কী প্রেসগুলি মিস করি এবং ফ্রেমরেট কম হলে এই সমস্যাটি আরও খারাপ হয়।
রায় টি।

@RoyT। এটি সত্যিই আপনার গেম এবং কী কী ধরণের ক্রিয়া আপনি কী দিয়ে ট্রিগার করতে চান তার উপর নির্ভর করে। যদি কী-প্রেসটি কোনও এক-অফ জিনিস, "অ্যাকশন" কী এর মতো, যা একটি ডায়ালগ বন্ধ করে দেয় তবে একটি বার্তার সারিটি সঠিক পন্থা - আপনি কোনও পারমাণবিক ইভেন্টের জন্য শুনতে চান। - অন্যদিকে যদি কী-স্ট্যাটাসটি "মুভ" কী এর মতো চলমান অবস্থার প্রতিনিধিত্ব করে তবে যুক্তিটি সাধারণত হয় while key UP is down move 30 units per second- এবং প্রতি সেকেন্ডে কেবল তখনই তাত্পর্যপূর্ণ হয় যখন আপনার কী নীচে এবং উপরের মধ্যে পরিমাপযোগ্য সময় হয় - সাধারণত এক ফ্রেমের বেশি।
ফ্যালকো 25'16

@RoyT। আপনি বার্তাগুলি শুনতেও পেলেন (এবং এগুলি নিজের কীবোর্ডের রাজ্য অ্যারে আপডেট করতে ব্যবহার করুন); আমি এই পদ্ধতির সরলতার জন্য পরামর্শটি বেছে নিয়েছি। আপনি অবশ্যই অন্য উত্তর লিখতে পারেন যদিও। গুরুত্বপূর্ণ অংশটি হ'ল কীটি ধারাবাহিকভাবে নিচে রয়েছে কিনা তা যাচাই করার জন্য ওএস বার্তাগুলির উপর নির্ভর করা এড়ানো , কারণ এটিই আপনাকে ওএস কী পুনরাবৃত্তির হারে চেইন করে।

এবং ফ্রেমে আপনি গেমের টিক বলতে চান, ভিডিও ফ্রেম নয়, তাই না? কারণ আমরা রব লুপে প্রবস এবং এনকোডিং গেম লজিক নই। :-)
corsiKa

@ জোশপেট্রি আমি সম্পূর্ণরূপে একমত, কেবল এই প্রেসিডের পরিবর্তে যদি আপনার 'প্রেস' পরিবর্তে 'ক্লিক' পরীক্ষা করতে হয় তবে এই ছোট ক্যাভেটটি নির্দেশ করতে চেয়েছিলেন। :)
রায় টি।

10

একটি বিকল্প উপায় (জোশের দৃষ্টিভঙ্গিও দুর্দান্ত!) একটি বুলিয়ান সেটআপ করা হবে SDL_KEYDOWNএবং সম্ভবত সমস্ত পুনরাবৃত্তি কী ইভেন্টগুলিও উপেক্ষা করা হবে। আপনি repeatকী ইভেন্টটির সদস্যকে পরীক্ষা করে দেখতে পারেন ।

তারপরে আপনি নিজের টাইমার বাস্তবায়ন করতে পারেন, যা কিছু অভিনব হতে হবে না এবং কী পুনরাবৃত্তি আপনার নিজের প্রয়োগ করতে পারে। আপনি হয় সরাসরি টাইমার থেকে ক্রিয়াটি ট্রিগার করতে পারেন, বা এমনকি কোনও SDL_KEYDOWNইভেন্ট তৈরি করতে এবং সমাধানগুলিকে একীভূত করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.