ActionScript 3
ड्राइंग बिटमैप
खोज…
बिटमैप डेटा में डिस्प्ले ऑब्जेक्ट ड्रा करें
किसी वस्तु की बिटमैप प्रतिलिपि बनाने के लिए एक सहायक कार्य। इसका उपयोग वेक्टर ऑब्जेक्ट्स, टेक्स्ट या जटिल नेस्टेड स्प्राइट के एक चपटा बिटमैप में बदलने के लिए किया जा सकता है।
function makeBitmapCopy(displayObj:IBitmapDrawable, transparent:Boolean = false, bgColor:uint = 0x00000000, smooth:Boolean = true):Bitmap {
//create an empty bitmap data that matches the width and height of the object you wish to draw
var bmd:BitmapData = new BitmapData(displayObj.width, displayObj.height, transparent, bgColor);
//draw the object to the bitmap data
bmd.draw(displayObj, null, null, null, null, smooth);
//assign that bitmap data to a bitmap object
var bmp:Bitmap = new Bitmap(bmd, "auto", smooth);
return bmp;
}
उपयोग:
var txt:TextField = new TextField();
txt.text = "Hello There";
var bitmap:Bitmap = makeBitmapCopy(txt, true); //second param true to keep transparency
addChild(bitmap);
पंजीकरण बिंदु के किसी भी निर्देशांक के साथ एक प्रदर्शन वस्तु बनाएं
public function drawDisplayObjectUsingBounds(source:DisplayObject):BitmapData {
var bitmapData:BitmapData;//declare a BitmapData
var bounds:Rectangle = source.getBounds(source);//get the source object actual size
//round bounds to integer pixel values (to aviod 1px stripes left off)
bounds = new Rectangle(Math.floor(bounds.x), Math.floor(bounds.y), Math.ceil(bounds.width), Math.ceil(bounds.height));
//to avoid Invalid BitmapData error which occures if width or height is 0
//(ArgumentError: Error #2015)
if((bounds.width>0) && (bounds.height>0)){
//create a BitmapData
bitmapData = new BitmapData(bounds.width, bounds.height, true, 0x00000000);
var matrix:Matrix = new Matrix();//create a transform matrix
//translate if to fit the upper-left corner of the source
matrix.translate(-bounds.x, -bounds.y);
bitmapData.draw(source, matrix);//draw the source
return bitmapData;//return the result (exit point)
}
//if no result is created - return an empty BitmapData
return new BitmapData(1, 1, true, 0x00000000);
}
एक साइड नोट: getBounds()
लिए वैध वैल्यू वापस करने के लिए ऑब्जेक्ट को कम से कम एक बार स्टेज एक्सेस करना होगा, अन्यथा मान फर्जी हैं। एक कोड जोड़ा जा सकता है यह सुनिश्चित करने के लिए कि पारित source
में चरण है, और यदि नहीं, तो इसे चरण में जोड़ा जा सकता है फिर हटा दिया गया।
एक स्प्राइट शीट को एनिमेटेड करना
परिभाषा के अनुसार एक स्प्राइट शीट एक बिटमैप है जिसमें एक निश्चित एनीमेशन होता है। पुराने खेल ग्रिड प्रकार स्प्राइट शीट का उपयोग करते हैं, अर्थात, प्रत्येक फ्रेम एक समान क्षेत्र पर कब्जा कर लेता है, और किनारों को एक आयत बनाने के लिए किनारों द्वारा संरेखित किया जाता है, शायद कुछ रिक्त स्थान के साथ। बाद में, बिटमैप के आकार को कम करने के लिए, आयताकार के चारों ओर अतिरिक्त व्हाट्सएप को हटाकर शीट्स को "पैक" किया जाना शुरू होता है, जिसमें प्रत्येक फ्रेम होता है, लेकिन फिर भी प्रत्येक फ्रेम कॉपी संचालन को आसान बनाने के लिए एक आयत होता है।
स्प्राइट शीट को चेतन करने के लिए, दो तकनीकों का उपयोग किया जा सकता है। सबसे पहले, आप उपयोग कर सकते हैं BitmapData.copyPixels()
अपने स्प्राइट शीट की एक निश्चित क्षेत्र कॉपी करने के लिए एक से प्रदर्शित करने के लिए Bitmap
, एक एनिमेटेड चरित्र का निर्माण किया। यह दृष्टिकोण बेहतर है यदि आप एकल प्रदर्शित Bitmap
उपयोग करते हैं जो पूरी तस्वीर को होस्ट करता है।
var spriteSheet:BitmapData;
var frames:Vector.<Rectangle>; // regions of spriteSheet that represent frames
function displayFrameAt(frame:int,buffer:BitmapData,position:Point):void {
buffer.copyPixels(spriteSheet,frames[frame],position,null,null,true);
}
दूसरी तकनीक का उपयोग किया जा सकता है यदि आपके पास प्रदर्शन सूची पर बहुत सारे Sprite
एस या Bitmap
एस हैं, और वे समान स्प्राइट शीट साझा करते हैं। यहां, लक्ष्य बफर अब एक एकल ऑब्जेक्ट नहीं है, लेकिन प्रत्येक ऑब्जेक्ट का अपना बफर है, इसलिए उचित रणनीति बिटमैप्स की bitmapData
संपत्ति में हेरफेर करना है। हालांकि, ऐसा करने से पहले, स्प्राइट शीट को अलग-अलग फ्रेम में काट दिया जाना चाहिए।
public class Stuff extends Bitmap {
static var spriteSheet:Vector.<BitmapData>;
function displayFrame(frame:int) {
this.bitmapData=spriteSheet[frame];
}
// ...
}