2011-09-03 12 views
5

मान लीजिए कि मेरे पास वेबजीएल कैनवास है (getContext ("प्रयोगात्मक-वेबलॉग") को कॉल करके)।स्विच कैनवास संदर्भ

क्या बाद में "2 डी" का उपयोग करने के लिए संदर्भ स्विच करने का कोई तरीका है?

ऐसी चीज का लक्ष्य बीएसओडी-जैसे डीबग प्रदर्शित करना होगा जब प्रतिपादन के दौरान कोई त्रुटि हो रही है।

यदि यह संभव नहीं है, तो है:

  • मैं एक कैनवास पर एक HTML तत्व एम्बेड कर सकते हैं, और बिल्कुल वैसा ही एक ही है करने के लिए इस तत्व के लिए मजबूर है कि कैनवास (भले ही यह पिछले आकार दिया जाता है)?
  • क्या मैं एक डोम नोड को प्रतिस्थापित कर सकता हूं, और परिवर्तन को प्रतिबिंबित करने के लिए पुराने के बारे में हर संदर्भ को अपडेट कर सकता हूं?

[संपादित करें] यह मेरा वर्तमान न्यूनतम कॉल कोड है। कैनवास एक डोम नोड है जिसमें कैनवास होता है जो वेबजीएल एपीआई द्वारा भरा जाता है, और कॉलबैक एक ऐसा फ़ंक्शन होता है जो एकल फ्रेम को संसाधित करता है।

function failure(cvs, e) { 
    var ctx = cvs.getContext('2d'); // Fail here, returns `null' if cvs.getContext('webgl') has been called 
    ctx.fillStyle = 'rgb(0, 0, 0)'; 
    ctx.fillRect(0, 0, cvs.width, cvs.height); 
    ctx.fillStyle = 'rgb(255, 255, 255)'; 
    ctx.font = 'bold 12px sans-serif'; 
    ctx.fillText(e.toString(), 0, 0); 
} 

function foobar(canvas, callback) { 
    try { 
     callback(); 
    } catch (e) { 
     failure(canvas, e); 
     throw e; 
    } finally { 
     requestAnimationFrame(arguments.callee); 
    } 
} 
+0

क्या आप कुछ वास्तविक कोड पोस्ट कर सकते हैं ताकि हमें यह पता चल सके कि इस प्रश्न का सही तरीके से जवाब कैसे दिया जाए और न केवल "हां" के साथ? –

+0

ऐसा हो गया है, मैंने कोड के केवल प्रासंगिक हिस्सों को रखने की कोशिश की है। –

उत्तर

4

संक्षिप्त उत्तर spec के अनुसार बहुत अधिक नहीं है।

प्रत्येक कैनवास में प्राथमिक संदर्भ कहा जाता है। यह पहला संदर्भ है जिसे कैनवास पर बुलाया जाता है। कैनवास पर गैर-प्राथमिक संदर्भ बनाना अलग-अलग ब्राउज़रों पर कुछ चीजें कर सकता है लेकिन मैं कभी भी इस पर निर्भर नहीं रहूंगा।

इसके बजाय मेरे पास दूसरा कैनवास होगा जो पहले ओवरलैड होता है और समान चौड़ाई और ऊंचाई विशेषताओं को बनाए रखता है। मैं फिर एक को छुपा दूंगा और दूसरे को खोल दूंगा (या जब आप इसे देखना चाहते हैं तो 2 डी एक को खोल दें)।

या सादगी के लिए केवल एक पीएनजी का उपयोग करें।, एक डीवीवी के अंदर केंद्रित है जिसमें कैनवास भी है।

Div container has black background and holds: 
    -PNG (centered) 
    -3D Canvas 

फिर जब आप त्रुटि तुम सिर्फ 3 डी कैनवास समाधान मैं साथ चला गया छिपाने (और वैकल्पिक पीएनजी को सामने लाने के)

+0

मैंने ऐसा कुछ किया है। लेकिन मुझे लगता है कि यह एक दर्द है कि कैनवास को "नो-कॉन्टेक्ट" स्थिति में रीसेट करने का कोई तरीका नहीं है। यह एक निश्चित सुविधा नहीं है, लेकिन यह अच्छा होगा। –

1

के बजाय दो कैनवस डालने है, प्रदर्शित करने के लिए png हैं: दूसरे शब्दों में अपने कैनन के साथ मौजूदा कैनवास को प्रतिस्थापित करना था।

var newCvs = cvs.cloneNode(false); 
cvs.parentNode.replaceChild(newCvs, cvs); 
cvs = newCvs; 

सभी मूल कैनवास के गुणों रख लिया जाएगा लेकिन संदर्भ आवंटित करने के लिए के रूप में आप चाहते हैं को मुक्त कर दिया हो जाएगा।

संबंधित मुद्दे