2017-02-20 10 views
12

मैं स्टार्लिंग (एक्शन स्क्रिप्ट 3) में एक बोर्ड गेम प्रोग्रामिंग कर रहा हूं। मैं जिस स्टारलिंग संस्करण का उपयोग कर रहा हूं वह स्प्राइट 3 डी नामक एक वर्ग है, जो मुझे इस गेम में इस्तेमाल किए गए कार्डों की फ़्लिपिंग को आसानी से और आसानी से कोड करने की अनुमति देता है। मैं इस तथ्य से परेशान हूं कि फ़्लिप होने पर मेरा कार्ड आयाम बदलता है, और मुझे परिवर्तन का स्रोत नहीं मिल रहा है।इस कार्ड को आयाम बदलने के कारण क्या हो रहा है? [वीडियो और कोड]

सभी मदद की सराहना की जाती है।

समस्या this youtube video पर देखी जा सकती है।

कोड this github page पर जिथब पर पूरा देखा जा सकता है।

मैं यहां अधिक विस्तार से जारी रखूंगा ... निम्नलिखित सभी जानकारी वीडियो में शामिल है।

कार्ड श्रेणी में कोई दृश्य जानकारी नहीं है। यह एक नियंत्रक वर्ग है। यह दो sprites पकड़ो। एक स्प्राइट सामने के चेहरे को भरता है, और दूसरा स्प्राइट पीछे का चेहरा भरता है। कार्ड क्लास में मास्क लागू और आयाम गुण भी होते हैं ताकि चेहरे बराबर आकार और आकार के हों।

कार्ड क्लास में एनीमेशन कोड भी है। कार्ड को एनिमेट करने के लिए कोड स्टार्लिंग ब्लॉग पर मिले वीडियो में इस्तेमाल किए गए कोड के समान ही है जो दिखाता है कि स्टेज 3 डी का उपयोग मेमोरी के 2 डी गेम में बहुत जल्दी और आसानी से कैसे किया जा सकता है। कार्ड क्लास कार्ड की rotationY संपत्ति 0 से पीआई और पीआई से 0 तक टच इवेंट्स पर बदलने के लिए ट्विन का उपयोग करके रोटेशन को एनिमेट करती है। flipping की प्रक्रिया के दौरान त्रुटि तब होती है, इसलिए मैं यहाँ flipping कोड में शामिल होंगे:

public function flip() : void { 
    _state = !(this._state); 
    if(this.animations){ 
     var tween : starling.animation.Tween = new Tween(this, 2, starling.animation.Transitions.EASE_OUT_BOUNCE); 
     var card : Card = this; 
     var didFlip : Boolean = false; 
     tween.animate("rotationY", this._state == Card.FACE_UP ? Math.PI : 0); 
     tween.onUpdate = updateVisibility; 
     Starling.juggler.add(tween); 
    } 
} 
private function updateVisibility():void 
{ 
    var sHelper:Vector3D = new Vector3D(); 
    var card : Card = this; 
    stage.getCameraPosition(card, sHelper); 
    if(sHelper){ 
     this._front_face.visible = sHelper.z < 0; 
     this._back_face.visible = sHelper.z >= 0; 
    } 
} 

FrontFace और backface कक्षाएं दोनों वर्ग CardFace से निकाले जाते हैं। कार्डफेस क्लास एक संदर्भ के रूप में एक कार्ड लेता है और कार्ड के मुखौटा के आकार और आकार के बराबर एक मुखौटा सेट करता है। यह संभवतः अनावश्यक है, क्योंकि कार्ड के मास्क को सभी बच्चों को डिस्प्ले ऑब्जेक्ट्स मास्क करना चाहिए, लेकिन हम वैसे भी करते हैं।

बैकफ़ेस में टेक्स्ट, लोगो, एक बनावट और रंग है।

फ्रंटफ़ेस कुछ भी नहीं करता है। यह विशिष्ट व्यवहार के साथ subclassed है और एक डेटा ऑब्जेक्ट को एक प्रदर्शन लेआउट में परिवर्तित करेगा।

इस मामले में, हम FrontFace प्रोफाइलफ्रंटफ़ेस के साथ subclassing कर रहे हैं। प्रोफाइलफ्रंटफ़ेस कार्ड ऑब्जेक्ट और प्रोफाइल डेटा ऑब्जेक्ट को कन्स्ट्रक्टर तर्क के रूप में लेता है। कार्ड ऑब्जेक्ट को सुपरफ़ेस कॉल के माध्यम से कार्डफ़ेस में पास किया जाता है, और प्रोफाइल ऑब्जेक्ट बाद के उपयोग के लिए सहेजा जाता है।

जब प्रोफाइलफ्रंटफ़ेस मंच में जोड़ा जाता है, तो कक्षा प्रोफ़ाइल डेटा ऑब्जेक्ट से शीर्षक, आय और व्यय निकालती है। यह इन वस्तुओं में से प्रत्येक के लिए टेक्स्ट फ़ील्ड बनाता है। यह नकद प्रवाह की भी गणना करता है और इस मूल्य के लिए एक टेक्स्ट फ़ील्ड बनाता है। एक पीएनजी बनावट का उपयोग करके एक पृष्ठभूमि बनाई जाती है, जो कि एक साधारण सफेद वर्ग है, जो कार्ड के आयामों के पूरे चेहरे पर फैला हुआ है। इस सफेद वर्ग पर, हम एक रंग बनावट लागू करते हैं। इसे बनाने के बाद, पृष्ठभूमि छवि परिवर्तित नहीं होती है। कोड निम्नानुसार दिखाई देता है:

//we remove the event listener so this function code is only executed once 
this.removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 
var width : int = this.cardWidth; /* 400 */ 
var height : int = this.cardHeight; /* 300 */ 
var bg : Image = new Image(Game.assets.getTexture("blank")); 
/* start the background in the top left */ 
bg.x = 0; 
bg.y = 0; 
/* have the background fill the card dimension space */ 
bg.width = width; 
bg.height = height; 
/* apply a color so that the background is not pure white */ 
bg.color = ColorScheme.OPAL; 
/* add the background to the stage */ 
this.addChild(bg); 

शेष कार्य में, हम टेक्स्ट बनाते हैं और इसे प्रदर्शित करते हैं। मैं सादगी के लिए यहां उस कोड को शामिल नहीं कर रहा हूं। परीक्षण में, मैंने उस कोड को हटा दिया है और देखा है कि इसका असाधारण व्यवहार पर कोई प्रभाव नहीं पड़ता है जो सामने के चेहरे पर फ़्लिप होने पर कार्ड के आयामों को बदलता है।

क्या किसी ने ऐसा कोई मामला देखा है जहां स्प्राइट 3 डी पर मास्क मास्क के रूप में प्रदर्शन करने में विफल रहता है?

क्या किसी ने ऐसे मामलों को देखा है जहां एक मुखौटा नियमित स्प्राइट ऑब्जेक्ट पर प्रदर्शन करने में विफल रहता है?

Tween.animate() विधि के बारे में क्या अजीब व्यवहार हो सकता है जब टिवन को ऑब्जेक्ट पर "रोटेशन वाई" के मान को बदलने के लिए उपयोग किया जाता है?

कोई भी और सभी उत्तर मदद करेंगे। धन्यवाद!

उत्तर

5

फिक्स्ड !!!!! मुझे यह मिला!

मुझे पता चला कि समस्या सामने का चेहरा नहीं था। मैंने कार्ड पर एक मुखौटा लगाया था, जो स्प्राइट 3 डी ऑब्जेक्ट था। वह मुखौटा समस्या पैदा कर रहा था। जब मैंने इसे हटा दिया, बैकफ़ेस (एक स्प्राइट ऑब्जेक्ट) सामने के चेहरे के समान आकार में विस्तारित हुआ, और अब जब मैं कार्ड आयाम सेट करता हूं, तो दोनों चेहरों का बराबर आकार होता है।

मैंने मूल बैकफ़ेस लेआउट से मेल खाने के लिए कार्ड आयामों को 400x250 में अपडेट किया है, और अब सब कुछ ठीक से काम कर रहा है।

युक्ति: स्प्राइट ऑब्जेक्ट्स पर अपने मास्क सेट करें, जब संभव हो तो स्प्राइट 3 डी ऑब्जेक्ट्स नहीं। यह 2 डी ऑब्जेक्ट्स पर 2 डी मैनिपुलेशन रखता है।

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