Gamepad API की मदद से, रुकावटों को पार करना

परिचय

नए लोगों को एडवेंचर गेम के लिए अपने कीबोर्ड इस्तेमाल करने दें. फ़लों को काटने के लिए, अपनी बहु-स्पर्शी उंगलियों का इस्तेमाल करने दें. साथ ही, माइकल जैक्सन की तरह डांस करने के लिए, अपने नए-नए मोशन सेंसर का इस्तेमाल करने दें. (खबरदारी: ऐसा नहीं किया जा सकता.) लेकिन आप अलग हैं. आप बेहतर हैं. आपने पेशेवर की तरह काम किया है. आपके लिए, गेम शुरू और खत्म होने का मतलब है कि आपके हाथों में गेमपैड होना.

रुकिए. क्या अपने वेब ऐप्लिकेशन में गेमपैड का इस्तेमाल नहीं किया जा सकता? अब नहीं. Gamepad API की मदद से, कंप्यूटर से कनेक्ट किए गए किसी भी गेमपैड कंट्रोलर की स्थिति को पढ़ा जा सकता है. इसके लिए, JavaScript का इस्तेमाल किया जाता है. यह सुविधा हाल ही में लॉन्च की गई है. इसे पिछले हफ़्ते ही Chrome 21 में जोड़ा गया है. यह Firefox में भी काम करने वाली है. फ़िलहाल, यह खास वर्शन में उपलब्ध है.

यह फ़ैसला सही साबित हुआ, क्योंकि हमें हाल ही में Hurdles 2012 Google डूडल में इसका इस्तेमाल करने का मौका मिला. इस लेख में, हमने डूडल में Gamepad API को जोड़ने का तरीका और इस प्रोसेस के दौरान मिली जानकारी के बारे में कम शब्दों में बताया है.

Hurdles 2012 Google doodle
Hurdles 2012 Google doodle

गेमपैड टेस्टर

इंटरैक्टिव डूडल, कुछ समय के लिए ही उपलब्ध होते हैं. हालांकि, इनके पीछे की प्रोसेस काफ़ी जटिल होती है. हमने डूडल से गेमपैड कोड लिया है और एक आसान गेमपैड टेस्टर बनाया है, ताकि आपको यह समझने में आसानी हो कि हम किस बारे में बात कर रहे हैं. इसका इस्तेमाल करके, यह देखा जा सकता है कि आपका यूएसबी गेमपैड सही तरीके से काम कर रहा है या नहीं. साथ ही, यह भी देखा जा सकता है कि यह कैसे काम करता है.

फ़िलहाल, यह सुविधा किन ब्राउज़र पर काम करती है?

ब्राउज़र के इस्तेमाल से जुड़ी सहायता

  • Chrome: 21.
  • Edge: 12.
  • Firefox: 29.
  • Safari: 10.1.

सोर्स

किन गेमपैड का इस्तेमाल किया जा सकता है?

आम तौर पर, आपके सिस्टम पर काम करने वाला कोई भी आधुनिक गेमपैड काम करेगा. हमने अलग-अलग ब्रैंड के यूएसबी कंट्रोलर से लेकर, Mac पर डोंगल के ज़रिए कनेक्ट किए गए PlayStation 2 गेमपैड और Chrome OS वाले नोटबुक के साथ जोड़े गए ब्लूटूथ कंट्रोलर तक, कई गेमपैड की जांच की है.

गेमपैड
गेमपैड

यह कुछ कंट्रोलर की फ़ोटो है. इनका इस्तेमाल, हमने अपने डूडल की जांच करने के लिए किया था – "हां, माँ, सचमुच मैं ऑफ़िस में यही काम करता/करती हूं." अगर आपका कंट्रोलर काम नहीं करता है या कंट्रोलर गलत तरीके से मैप किए गए हैं, तो कृपया Chrome या Firefox के लिए गड़बड़ी की शिकायत करें . (कृपया हर ब्राउज़र के सबसे नए वर्शन में जांच करें, ताकि यह पक्का किया जा सके कि समस्या पहले से ठीक नहीं है.)

Gamepad API की सुविधा का पता लगाना<

Chrome में यह आसानी से किया जा सकता है:

var gamepadSupportAvailable = !!navigator.webkitGetGamepads || !!navigator.webkitGamepads;

फ़िलहाल, Firefox में इसका पता लगाना मुमकिन नहीं है – इसमें हर चीज़ इवेंट पर आधारित होती है और सभी इवेंट हैंडलर को विंडो से अटैच करना ज़रूरी होता है. इससे, इवेंट हैंडलर का पता लगाने की सामान्य तकनीक काम नहीं करती.

हालांकि, हमें यकीन है कि यह समस्या कुछ समय के लिए है. Modernizr पहले से ही आपको Gamepad API के बारे में बताता है. इसलिए, हमारा सुझाव है कि गेमपैड की पहचान करने से जुड़ी सभी मौजूदा और आने वाली ज़रूरतों के लिए, इसका इस्तेमाल करें:

var gamepadSupportAvailable = Modernizr.gamepads;

कनेक्ट किए गए गेमपैड के बारे में जानकारी

गेमपैड को कनेक्ट करने के बाद भी, जब तक उपयोगकर्ता उसका कोई बटन नहीं दबाता, तब तक यह किसी भी तरह से नहीं दिखेगा. ऐसा फ़िंगरप्रिंटिंग को रोकने के लिए किया जाता है. हालांकि, इससे उपयोगकर्ता अनुभव में थोड़ी समस्या आती है: उपयोगकर्ता से बटन दबाने के लिए नहीं कहा जा सकता या गेमपैड के लिए खास निर्देश नहीं दिए जा सकते, क्योंकि आपको नहीं पता कि उन्होंने अपना कंट्रोलर कनेक्ट किया है या नहीं.

हालांकि, इस समस्या को हल करने के बाद (माफ़ करें…), आपको और भी समस्याओं का सामना करना पड़ सकता है.

पोल

Chrome में एपीआई लागू करने पर, एक फ़ंक्शन – navigator.webkitGetGamepads() – दिखता है. इसका इस्तेमाल करके, सिस्टम में प्लग इन किए गए सभी गेमपैड की सूची देखी जा सकती है. साथ ही, उनकी मौजूदा स्थिति (बटन + स्टिक) भी देखी जा सकती है. कनेक्ट किए गए पहले गेमपैड को कलेक्शन में पहली एंट्री के तौर पर दिखाया जाएगा. इसके बाद, दूसरे गेमपैड को दूसरी एंट्री के तौर पर दिखाया जाएगा.

(इस फ़ंक्शन कॉल ने हाल ही में एक अरे को बदल दिया है जिसे सीधे तौर पर ऐक्सेस किया जा सकता था – navigator.webkitGamepads[]. अगस्त 2012 की शुरुआत तक, Chrome 21 में इस ऐरे को ऐक्सेस करना ज़रूरी है. हालांकि, फ़ंक्शन कॉल Chrome 22 और उसके बाद के वर्शन में काम करता है. आने वाले समय में, एपीआई का इस्तेमाल करने के लिए फ़ंक्शन कॉल का सुझाव दिया जाता है. यह सुविधा, धीरे-धीरे इंस्टॉल किए गए सभी Chrome ब्राउज़र पर उपलब्ध हो जाएगी.)

स्पेसिफ़िकेशन के अब तक लागू किए गए हिस्से के मुताबिक, आपको गेमपैड की स्थिति की लगातार जांच करनी होगी. साथ ही, ज़रूरत पड़ने पर, उसकी तुलना पिछले गेमपैड से करनी होगी. ऐसा करने के बजाय, जब भी कुछ बदलाव होता है, तो इवेंट ट्रिगर करें. हमने requestAnimationFrame() का इस्तेमाल करके, पोलिंग को सबसे असरदार और बैटरी के हिसाब से सबसे सही तरीके से सेट अप किया है. हमारे डूडल के लिए, हमारे पास पहले से ही ऐनिमेशन के साथ काम करने वाला requestAnimationFrame() लूप है. इसके बावजूद, हमने एक दूसरा अलग लूप बनाया – इसे कोड करना आसान था और इसकी वजह से परफ़ॉर्मेंस पर किसी भी तरह का असर नहीं पड़ा.

टेस्टर का कोड यहां दिया गया है:

/**
 * Starts a polling loop to check for gamepad state.
 */
startPolling: function() {
    // Don't accidentally start a second loop, man.
    if (!gamepadSupport.ticking) {
    gamepadSupport.ticking = true;
    gamepadSupport.tick();
    }
},

/**
 * Stops a polling loop by setting a flag which will prevent the next
 * requestAnimationFrame() from being scheduled.
 */
stopPolling: function() {
    gamepadSupport.ticking = false;
},

/**
 * A function called with each requestAnimationFrame(). Polls the gamepad
 * status and schedules another poll.
 */
tick: function() {
    gamepadSupport.pollStatus();
    gamepadSupport.scheduleNextTick();
},

scheduleNextTick: function() {
    // Only schedule the next frame if we haven't decided to stop via
    // stopPolling() before.
    if (gamepadSupport.ticking) {
    if (window.requestAnimationFrame) {
        window.requestAnimationFrame(gamepadSupport.tick);
    } else if (window.mozRequestAnimationFrame) {
        window.mozRequestAnimationFrame(gamepadSupport.tick);
    } else if (window.webkitRequestAnimationFrame) {
        window.webkitRequestAnimationFrame(gamepadSupport.tick);
    }
    // Note lack of setTimeout since all the browsers that support
    // Gamepad API are already supporting requestAnimationFrame().
    }
},

/**
 * Checks for the gamepad status. Monitors the necessary data and notices
 * the differences from previous state (buttons for Chrome/Firefox,
 * new connects/disconnects for Chrome). If differences are noticed, asks
 * to update the display accordingly. Should run as close to 60 frames per
 * second as possible.
 */
pollStatus: function() {
    // (Code goes here.)
},

अगर आपको सिर्फ़ एक गेमपैड का डेटा चाहिए, तो उसे पाने का तरीका इतना आसान हो सकता है:

var gamepad = navigator.webkitGetGamepads && navigator.webkitGetGamepads()[0];

अगर आपको थोड़ा ज़्यादा बेहतर तरीके से काम करना है या एक से ज़्यादा खिलाड़ियों को एक साथ गेम खेलने की सुविधा देनी है, तो आपको कोड की कुछ और लाइनें जोड़नी होंगी. इससे, आपको ज़्यादा मुश्किल स्थितियों (दो या उससे ज़्यादा गेमपैड कनेक्ट होने, गेम के बीच में कुछ गेमपैड डिसकनेक्ट होने वगैरह) से निपटने में मदद मिलेगी. इस समस्या को हल करने के एक तरीके के बारे में जानने के लिए, हमारे टेस्टर फ़ंक्शन pollGamepads() का सोर्स कोड देखें.

इवेंट

Firefox, Gamepad API स्पेसिफ़िकेशन में बताए गए किसी अन्य बेहतर तरीके का इस्तेमाल करता है. यह आपसे पोल करने के बजाय, दो इवेंट – MozGamepadConnected और MozGamepadDisconnected – दिखाता है. ये इवेंट तब ट्रिगर होते हैं, जब गेमपैड प्लग इन किया जाता है (या ज़्यादा सटीक तरीके से, प्लग इन किया जाता है और उसके किसी बटन को दबाकर "एलान" किया जाता है) या अनप्लग किया जाता है. गेमपैड ऑब्जेक्ट, इवेंट ऑब्जेक्ट के .gamepad पैरामीटर के तौर पर पास किया जाता है. यह ऑब्जेक्ट, आने वाले समय में गेमपैड की स्थिति दिखाता रहेगा.

टेस्टर के सोर्स कोड से:

/**
 * React to the gamepad being connected. Today, this will only be executed
 * on Firefox.
 */
onGamepadConnect: function(event) {
    // Add the new gamepad on the list of gamepads to look after.
    gamepadSupport.gamepads.push(event.gamepad);

    // Start the polling loop to monitor button changes.
    gamepadSupport.startPolling();

    // Ask the tester to update the screen to show more gamepads.
    tester.updateGamepads(gamepadSupport.gamepads);
},

खास जानकारी

आखिर में, टेस्टर में हमारा शुरुआती फ़ंक्शन, दोनों तरीकों के साथ काम करता है. यह ऐसा दिखता है:

/**
 * Initialize support for Gamepad API.
 */
init: function() {
    // As of writing, it seems impossible to detect Gamepad API support
    // in Firefox, hence we need to hardcode it in the third clause.
    // (The preceding two clauses are for Chrome.)
    var gamepadSupportAvailable = !!navigator.webkitGetGamepads ||
        !!navigator.webkitGamepads ||
        (navigator.userAgent.indexOf('Firefox/') != -1);

    if (!gamepadSupportAvailable) {
    // It doesn't seem Gamepad API is available – show a message telling
    // the visitor about it.
    tester.showNotSupported();
    } else {
    // Firefox supports the connect/disconnect event, so we attach event
    // handlers to those.
    window.addEventListener('MozGamepadConnected',
                            gamepadSupport.onGamepadConnect, false);
    window.addEventListener('MozGamepadDisconnected',
                            gamepadSupport.onGamepadDisconnect, false);

    // Since Chrome only supports polling, we initiate polling loop straight
    // away. For Firefox, we will only do it if we get a connect event.
    if (!!navigator.webkitGamepads || !!navigator.webkitGetGamepads) {
        gamepadSupport.startPolling();
    }
    }
},

गेमपैड की जानकारी

सिस्टम से कनेक्ट किए गए हर गेमपैड को इस तरह के ऑब्जेक्ट से दिखाया जाएगा:

id: "PLAYSTATION(R)3 Controller (STANDARD GAMEPAD Vendor: 054c Product: 0268)"
index: 1
timestamp: 18395424738498
buttons: Array[8]
    0: 0
    1: 0
    2: 1
    3: 0
    4: 0
    5: 0
    6: 0.03291
    7: 0
axes: Array[4]
    0: -0.01176
    1: 0.01961
    2: -0.00392
    3: -0.01176

सामान्य जानकारी

सबसे ऊपर मौजूद कुछ फ़ील्ड, आसान मेटाडेटा होते हैं:

  • id: गेमपैड के बारे में टेक्स्ट में दी गई जानकारी
  • index: एक पूर्णांक, जो एक कंप्यूटर से जुड़े अलग-अलग गेमपैड को अलग-अलग बताने के लिए काम आता है
  • timestamp: बटन/ऐक्सिस की स्थिति के आखिरी अपडेट का टाइमस्टैंप. फ़िलहाल, यह सुविधा सिर्फ़ Chrome में काम करती है

बटन और स्टिक

आज के गेमपैड, आपके दादाजी के इस्तेमाल किए गए गेमपैड से काफ़ी अलग हैं. इनमें दो ऐनालॉग स्टिक के अलावा, कम से कम सोलह अलग-अलग बटन (कुछ डिस्क्रेट, कुछ ऐनालॉग) होते हैं. Gamepad API, आपको उन सभी बटन और ऐनालॉग स्टिक के बारे में बताएगा जिनकी जानकारी ऑपरेटिंग सिस्टम देता है.

गेमपैड ऑब्जेक्ट में मौजूदा स्थिति मिलने के बाद, .buttons[] के ज़रिए बटन और .axes[] कलेक्शन के ज़रिए स्टिक को ऐक्सेस किया जा सकता है. यहां इनके बारे में विज़ुअल की मदद से खास जानकारी दी गई है:

गेमपैड का डायग्राम
गेमपैड डायग्राम

स्पेसिफ़िकेशन में ब्राउज़र से कहा जाता है कि वह पहले सोलह बटन और चार ऐक्सिस को इन पर मैप करे:

gamepad.BUTTONS = {
    FACE_1: 0, // Face (main) buttons
    FACE_2: 1,
    FACE_3: 2,
    FACE_4: 3,
    LEFT_SHOULDER: 4, // Top shoulder buttons
    RIGHT_SHOULDER: 5,
    LEFT_SHOULDER_BOTTOM: 6, // Bottom shoulder buttons
    RIGHT_SHOULDER_BOTTOM: 7,
    SELECT: 8,
    START: 9,
    LEFT_ANALOGUE_STICK: 10, // Analogue sticks (if depressible)
    RIGHT_ANALOGUE_STICK: 11,
    PAD_TOP: 12, // Directional (discrete) pad
    PAD_BOTTOM: 13,
    PAD_LEFT: 14,
    PAD_RIGHT: 15
};

gamepad.AXES = {
    LEFT_ANALOGUE_HOR: 0,
    LEFT_ANALOGUE_VERT: 1,
    RIGHT_ANALOGUE_HOR: 2,
    RIGHT_ANALOGUE_VERT: 3
};

अतिरिक्त बटन और ऐक्सिस, ऊपर मौजूद बटन और ऐक्सिस में जोड़ दिए जाएंगे. कृपया ध्यान दें कि यह ज़रूरी नहीं है कि डिवाइस में 16 बटन या चार ऐक्सिस हों. हालांकि, हो सकता है कि इनमें से कुछ बटन या ऐक्सिस की जानकारी न दी गई हो.

बटन की वैल्यू 0.0 (दबाया नहीं गया) से 1.0 (पूरी तरह दबाया गया) के बीच हो सकती है. ऐक्सिस -1.0 (पूरी तरह से बाईं ओर या ऊपर) से 0.0 (बीच में) से 1.0 (पूरी तरह से दाईं ओर या नीचे) तक होते हैं.

एनालॉग या डिस्क्रेट?

हर बटन, एनालॉग हो सकता है. उदाहरण के लिए, शॉल्डर बटन के लिए ऐसा आम तौर पर होता है. इसलिए, सीधे तौर पर 1.00 से तुलना करने के बजाय, थ्रेशोल्ड सेट करना बेहतर होता है. अगर ऐनालॉग बटन थोड़ा गंदा हो, तो क्या होगा? यह शायद कभी 1.00 तक न पहुंच पाए). हम अपने डूडल में ऐसा इस तरह करते हैं:

gamepad.ANALOGUE_BUTTON_THRESHOLD = .5;

gamepad.buttonPressed_ = function(pad, buttonId) {
    return pad.buttons[buttonId] &&
            (pad.buttons[buttonId] > gamepad.ANALOGUE_BUTTON_THRESHOLD);
};

एनालॉग स्टिक को डिजिटल जॉयस्टिक में बदलने के लिए, यही तरीका अपनाएं. हां, डिजिटल पैड (डी-पैड) हमेशा मौजूद होता है, लेकिन हो सकता है कि आपके गेमपैड में यह न हो. इसे हैंडल करने के लिए, यहां हमारा कोड दिया गया है:

gamepad.AXIS_THRESHOLD = .75;

gamepad.stickMoved_ = function(pad, axisId, negativeDirection) {
    if (typeof pad.axes[axisId] == 'undefined') {
    return false;
    } else if (negativeDirection) {
    return pad.axes[axisId] < -gamepad.AXIS_THRESHOLD;
    } else {
    return pad.axes[axisId] > gamepad.AXIS_THRESHOLD;
    }
};

बटन दबाने और स्टिक की गतिविधियां

इवेंट

कुछ मामलों में, जैसे कि फ़्लाइट सिम्युलेटर गेम में, स्टिक की पोज़िशन या बटन दबाने पर लगातार जांच करना और उस पर कार्रवाई करना ज़्यादा सही होता है… लेकिन Hurdles 2012 डूडल जैसी चीज़ों के लिए? आपको शायद यह आश्चर्य हो कि: मुझे हर फ़्रेम में बटन की जांच क्यों करनी होगी? मुझे कीबोर्ड या माउस के अप/डाउन बटन की तरह इवेंट क्यों नहीं मिल रहे हैं?

अच्छी खबर यह है कि ऐसा किया जा सकता है. बुरी खबर यह है कि – आने वाले समय में. यह स्पेसिफ़िकेशन में है, लेकिन अभी तक किसी भी ब्राउज़र में लागू नहीं किया गया है.

पोल

इस दौरान, मौजूदा और पिछली स्थिति की तुलना करें. अगर आपको कोई अंतर दिखता है, तो फ़ंक्शन को कॉल करें. उदाहरण के लिए:

if (buttonPressed(pad, 0) != buttonPressed(oldPad, 0)) {
    buttonEvent(0, buttonPressed(pad, 0) ? 'down' : 'up');
}
for (var i in gamepadSupport.gamepads) {
    var gamepad = gamepadSupport.gamepads[i];

    // Don't do anything if the current timestamp is the same as previous
    // one, which means that the state of the gamepad hasn't changed.
    // This is only supported by Chrome right now, so the first check
    // makes sure we're not doing anything if the timestamps are empty
    // or undefined.
    if (gamepadSupport.prevTimestamps[i] &&
        (gamepad.timestamp == gamepadSupport.prevTimestamps[i])) {
    continue;
    }
    gamepadSupport.prevTimestamps[i] = gamepad.timestamp;

    gamepadSupport.updateDisplay(i);
}

Hurdles 2012 डूडल में कीबोर्ड-फ़र्स्ट अप्रोच

आज के डूडल में गेमपैड के बिना, कीबोर्ड से इनपुट करने का विकल्प उपलब्ध है. इसलिए, हमने गेमपैड के लिए भी कीबोर्ड के इनपुट के तरीके को ही इस्तेमाल किया है. इसका मतलब है कि तीन फ़ैसले लेने होंगे:

  1. डूडल में सिर्फ़ तीन बटन की ज़रूरत होती है – दो बटन दौड़ने के लिए और एक बटन कूदने के लिए. हालांकि, गेमपैड में ज़्यादा बटन हो सकते हैं. इसलिए, हमने उन तीन लॉजिकल फ़ंक्शन पर सभी सोलह बटन और दो स्टिक को इस तरह से मैप किया है जो हमें सबसे सही लगा, ताकि लोग इन तरीकों से दौड़ सकें: A/B बटन को बारी-बारी से दबाकर, कंधे के बटन को बारी-बारी से दबाकर, डी-पैड पर बाईं/दाईं ओर दबाकर या किसी भी स्टिक को तेज़ी से बाईं और दाईं ओर स्विंग करके. बेशक, इनमें से कुछ तरीके दूसरों की तुलना में ज़्यादा असरदार होंगे. उदाहरण के लिए:

    newState[gamepad.STATES.LEFT] =
        gamepad.buttonPressed_(pad, gamepad.BUTTONS.PAD_LEFT) ||
        gamepad.stickMoved_(pad, gamepad.AXES.LEFT_ANALOGUE_HOR, true) ||
        gamepad.stickMoved_(pad, gamepad.AXES.RIGHT_ANALOGUE_HOR, true),
    
    newState[gamepad.STATES.PRIMARY_BUTTON] =
        gamepad.buttonPressed_(pad, gamepad.BUTTONS.FACE_1) ||
        gamepad.buttonPressed_(pad, gamepad.BUTTONS.LEFT_SHOULDER) ||
        gamepad.buttonPressed_(pad, gamepad.BUTTONS.LEFT_SHOULDER_BOTTOM) ||
        gamepad.buttonPressed_(pad, gamepad.BUTTONS.SELECT) ||
        gamepad.buttonPressed_(pad, gamepad.BUTTONS.START) ||
        gamepad.buttonPressed_(pad, gamepad.BUTTONS.LEFT_ANALOGUE_STICK),
    
  2. हमने पहले बताए गए थ्रेशोल्ड फ़ंक्शन का इस्तेमाल करके, हर ऐनालॉग इनपुट को अलग-अलग इनपुट के तौर पर माना.

  3. हमने डूडल में गेमपैड इनपुट को शामिल करने के बजाय, उसे बोल्ट किया है – हमारा पोलिंग लूप, ज़रूरी keydown और keyup इवेंट को सही keyCode के साथ सिंथेसाइज़ करता है और उन्हें DOM में वापस भेजता है:

    // Create and dispatch a corresponding key event.
    var event = document.createEvent('Event');
    var eventName = down ? 'keydown' : 'keyup';
    event.initEvent(eventName, true, true);
    event.keyCode = gamepad.stateToKeyCodeMap_[state];
    gamepad.containerElement_.dispatchEvent(event);

बस इतना ही!

सुझाव और तरकीबें

  • याद रखें कि बटन दबाए जाने से पहले, गेमपैड आपके ब्राउज़र में बिल्कुल नहीं दिखेगा.
  • अगर एक साथ अलग-अलग ब्राउज़र में गेमपैड की जांच की जा रही है, तो ध्यान दें कि उनमें से सिर्फ़ एक ब्राउज़र में गेमपैड का इस्तेमाल किया जा सकता है. अगर आपको कोई इवेंट नहीं मिल रहा है, तो पक्का करें कि आपने वे सभी पेज बंद कर दिए हों जो इसका इस्तेमाल कर रहे हों. साथ ही, हमारे अनुभव के मुताबिक, कभी-कभी कोई ब्राउज़र, टैब बंद करने या ब्राउज़र को बंद करने के बाद भी गेमपैड को "होल्ड" कर सकता है. कभी-कभी समस्याओं को ठीक करने का एकमात्र तरीका, सिस्टम को रीस्टार्ट करना होता है.
  • हमेशा की तरह, Chrome Canary और अन्य ब्राउज़र के मिलते-जुलते वर्शन का इस्तेमाल करें. इससे आपको सबसे अच्छी सहायता मिलती रहेगी. अगर आपको पुराने वर्शन में कोई समस्या दिखती है, तो उससे जुड़ी ज़रूरी कार्रवाई करें.

आने वाला समय

हमें उम्मीद है कि इससे आपको इस नए एपीआई के बारे में कुछ जानकारी मिली होगी. हालांकि, अभी इसमें कुछ समस्याएं हैं, लेकिन यह पहले से ही काफ़ी मज़ेदार है.

एपीआई के कुछ हिस्सों (जैसे, इवेंट) और ब्राउज़र के लिए ज़्यादा सहायता के अलावा, हमें उम्मीद है कि आने वाले समय में हमें रंबल कंट्रोल, पहले से मौजूद गायरोस्कोप का ऐक्सेस वगैरह जैसी सुविधाएं भी मिलेंगी. साथ ही, अलग-अलग तरह के गेमपैड के लिए ज़्यादा सहायता भी मिलेगी. अगर आपको कोई ऐसी सुविधा मिलती है जो गलत तरीके से काम करती है या काम ही नहीं करती, तो कृपया Chrome के लिए गड़बड़ी की शिकायत करें और/या Firefox के लिए गड़बड़ी की शिकायत करें.

हालांकि, इससे पहले Hurdles 2012 डूडल खेलें और देखें कि गेमपैड पर इसे खेलने में कितना मज़ा आता है. क्या आपने अभी कहा था कि आपके पास 10.7 सेकंड से कम समय में यह काम करने की क्षमता है? ठीक है.

इसके बारे में और पढ़ें