2009-06-27 14 views
13

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

दुर्भाग्य से, थोड़ा सा जांच करने के बाद, ऐसा लगता है कि आप उन्हें उपयोग करने से पहले छवियों को मैन्युअल रूप से एम्बेड करना होगा। मैं वर्तमान में इसे इस तरह सेटअप:

Resource.as वर्ग फ़ाइल:

package 
{ 
    public final class Resource 
    { 
     [Embed (source="/assets/ships/1.gif")] 
     public static const SHIPS_1:Class; 
    } 
} 

तो, सिर्फ एक जहाज के लिए मैं इतना के लिए है करने के लिए:

सही फ़ोल्डर में छवि रखो साथ सही नाम नाम यह Resource.as में एक ही तरीके से फाइल Resource.as में एक ही नाम के साथ लगातार बनाएं फाइल

भले ही फ़ाइल को किसी निर्दिष्ट फ़ोल्डर में डालने से यह सब संभव हो।

var test:Bitmap = new Resource.SHIPS_1(); 

वहाँ बेहतर तरीके संसाधनों को संभालने के लिए जब बहुत बड़ी अनुप्रयोग बनाने होना चाहिए:

चीजों को और भी बदतर बनाने के लिए, मैं तब भी उसका उपयोग कॉल करने के लिए है? कल्पना कीजिए कि मुझे हजारों छवियों की आवश्यकता है, यह प्रणाली बस फिट नहीं होगी।

+2

खेल के विकास के बारे में कुछ भी नहीं पता, लेकिन क्या आपको वास्तव में हजारों छवियों को एम्बेड करने की आवश्यकता होगी? ऐसा लगता है कि एसएफएफ बहुत भारी – Ronn

उत्तर

6

var test:Bitmap = new Resource.SHIPS_1(); 

के बजाय

उपयोग

myImage.source = Resource.SHIPS_1; 

एम्बेडिंग सही है। : डी जिस तरह से आप इसका इस्तेमाल गलत है :)

एड्रियन

+1

मिलेगा लेकिन एम्बेडिंग के इस तरीके से बहुत परेशानी होती है। क्या कोई बेहतर तरीका नहीं है? – Tom

+0

संपादित करें: संसाधन कैसे हो सकता है। HIPS_1 सही हो जब संसाधन को भी परिभाषित नहीं किया जाता है? – Tom

+0

1. संसाधन। एचआईपीएस_1 पहले परिभाषित किया जाना चाहिए। 2. कोई अन्य तरीका नहीं है .. सीएसएस फ़ाइलों के अंदर एम्बेड करके छोड़कर, लेकिन यह भी बदतर है :( –

5

यह वास्तव में क्या फ्लैश CS4 के लिए है। यद्यपि आपका तरीका मेरे लिए ठीक लगता है - हालांकि मैं कक्षा के नाम के लिए सभी कैप्स का उपयोग नहीं करता हूं, भले ही यह स्थिर हो। बस अपना सिर नीचे रखो और कॉपी-पेस्टिंग प्राप्त करें!

वैकल्पिक रूप से आप फ़ाइलों को रनटाइम पर लोड कर सकते हैं।

+2

+1 रनटाइम पर फ़ाइलों को लोड करने पर +1। अन्यथा, आपको वास्तव में आवश्यकता होने की तुलना में एक बड़े एसडब्ल्यूएफ के साथ समाप्त हो सकता है। – Jacob

+0

आप कह रहे हैं कि मुझे उन्हें वेबसर्वर से लोड करना चाहिए तो? – Tom

+1

(बड़ा) नुकसान यह होगा कि हर कोई सिर्फ मेरी सभी ग्राफिकल सामग्री डाउनलोड कर सकता है। – Tom

16

आप संसाधनों की एक बड़ी संख्या आप इन 3 चरणों का पालन कर सकते संभाल करने की जरूरत है: एक असम्पीडित ज़िप संग्रह

  • एम्बेड बाइनरी डेटा के रूप में ज़िप फ़ाइल में

    1. प्लेस उन्हें:

      [एम्बेड करें (स्रोत = 'संसाधन.जिप', mimeType = 'application/octet-stream')]

    2. संसाधनों का उपयोग करें जी FZip

    आप एक अलग तरीके है कि लोड हो रहा है बाहरी फ़ाइलें पता है कि कुछ फ़्लैश खेल वेबसाइटों खेल वे मेजबान एक एकल swf फ़ाइल के भीतर समाहित करने की आवश्यकता होती हो शामिल है चुनें।

  • -1

    काफी बेहतर दृष्टिकोण http://itfailed.blogspot.com/2011/02/howt-o-embed-images-in-actionscript-3.html

    +0

    यह किसी भी चीज़ से "बेहतर" कैसे है? यह सिर्फ सबसे सरल मानक दृष्टिकोण है, और इसका मूल प्रश्न और कई उत्तरों में भी उल्लेख किया गया है: पी – SasQ

    1

    यह निर्भर करता है कितना बड़ा अपने अलग-अलग चित्र हैं, लेकिन आप एक spritesheet की तरह एक छवि में उन सब को डाल सकता है। यदि आप किसी विशेष जहाज को आकर्षित करना चाहते हैं तो उस जहाज के लिए छवि में सही xy ऑफ़सेट का उपयोग करें और कॉपीपिक्स का उपयोग अपने बिटमैप पर खींचने के लिए करें।

    2

    यह पुराना है लेकिन जब से मैं इसे भर में ठोकर खाई कुछ अलग मैं यहाँ भावी पीढ़ियों के लिए लिखेंगे के लिए खोज:)

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

    मुझे यह दृष्टिकोण अधिक व्यवस्थित लगता है। जब आप फ़ाइलों को सही आयात करके इसे बना सकते हैं तो संपूर्ण संसाधन वर्ग क्यों लिखें? ;)

    +2

    क्योंकि डेवलपर्स * uckin 'फ़्लैश ऑथरिंग टूल (सीएस 5, सीएस 4, सीएस 3 इत्यादि) से नफरत करते हैं। यह पुराना है, यह पुराना है। मेरा मतलब है - मुझे फ़्लैश पसंद है लेकिन एडोब ने फ्लैश ऑथरिंग सॉफ्टवेयर को गड़बड़ कर दिया। डेवलपर्स फ्लेक्स फ्रेमवर्क के साथ संयोजन के अपने स्वयं के टेक्स्ट एडिटर्स का उपयोग करना चाहते हैं। आपके सुझाव का मतलब यह होगा कि एक डेवलपर को फ्लैश और एक संपादक के बीच स्विच करना था - और वह नरक की तरह बेकार है! – drpelz

    +1

    मैं असहमत, सम्मान से सहमत हूं। भले ही मैं विकास के लिए फ़्लैश पर्यावरण से बिल्कुल नफरत करता हूं (मैं एक फ्लैश डेवलपर लड़का हूं), जब उपलब्ध लेआउट के लिए एक पूरी तरह से काम कर रहे ग्राफिकल वातावरण है, तो वहां अपना लेआउट करें!कौन एक्स और वाई निर्देशांक की प्रतिलिपि बनाना और पेस्ट करना चाहता है, जब आप फ्लैश में अपनी फ़ोटोशॉप मॉकअप से पूरी चीज इकट्ठा कर सकते हैं? खैर, मुझे लगता है कि यह सब आपके वर्कफ़्लो पर निर्भर करता है, और आप कितने शुद्ध-प्ले डेवलपर हैं। –

    +0

    @TomAuger संलेखन सॉफ़्टवेयर का उपयोग करने में एक और समस्या है: यह पूरी तरह से विक्रेता-लॉक है। एक बार जब आपका आर्टवर्क एडोब पर्यावरण में आता है, तो यह हमेशा के लिए फंस जाता है, क्योंकि इसका उपयोग एडोब के महंगे ब्लूटवेयर के अलावा किसी भी सॉफ्टवेयर में नहीं किया जा सकता है। – SasQ

    1
    package 
    { 
        public final class Resource 
        { 
         [Embed (source="/assets/ships/1.gif")] 
         public static const SHIPS_1:Class; 
        } 
    } 
    
    0
    [Embed (source="/assets/ships/1.gif")] 
        public static const SHIPS_1:Class; 
    
    0

    मैं इस तरह मेरी लाइब्रेरी कक्षाएं करना पसंद।

    मैं सिंगलटन के लिए GSkinners कोड लिया: http://gskinner.com/blog/archives/2006/07/as3_singletons.html

    package 
    { 
        import flash.display.Bitmap; 
        import flash.display.BitmapData; 
    
        public class Lib 
        { 
         /* 
         Make this an Singleton, so you only load all the images only Once 
         */ 
    
         private static var instance:Lib; 
         public static function getInstance():Lib { 
          if (instance == null) { 
           instance = new Lib(new SingletonBlocker()); 
          } 
          return instance; 
         } 
         public function Lib(p_key:SingletonBlocker):void { 
          // this shouldn't be necessary unless they fake out the compiler: 
          if (p_key == null) { 
           throw new Error("Error: Instantiation failed: Use Singleton.getInstance() instead of new."); 
          } 
         } 
    
         /* 
         The actual embedding 
         */ 
         [Embed(source="assets/images/someImage.png")] 
         private var ImageClass:Class; 
         private var _imageClass:Bitmap = new ImageClass() as Bitmap; 
    
         [Embed(source="assets/images/someOtherImage.png")] 
         private var OtherImageClass:Class; 
         private var _otherImageClass:Bitmap = new ImageClass() as Bitmap; 
    
         public function get imgClass():Bitmap{ 
          return _imageClass; 
         } 
         public function get imgClassData():BitmapData{ 
          return _imageClass.BitmapData; 
         } 
    
         public function get otherImageClass():Bitmap{ 
          return _otherImageClass; 
         } 
         public function get otherImageClassData():BitmapData{ 
          return _otherImageClass.BitmapData; 
         } 
        } 
    } 
    internal class SingletonBlocker {} 
    
    0

    [एम्बेड (स्रोत = "/ संपत्ति/images/123.png")] सार्वजनिक स्थिर स्थिरांक className: कक्षा;

    2

    मैं सिर्फ स्टार्लिंग ढांचे पर इस महान ट्यूटोरियल देखा: आपको लगता है कि spritesheet कहा जाता है एक बड़ा बनावट में सभी को अपने व्यक्तिगत बनावट बंडल और: http://www.hsharma.com/tutorials/starting-with-starling-ep-3-sprite-sheets/

    यह spritesheets की तरह लगता है कि वास्तव में क्या आप देख रहे हैं कर रहे हैं एक एक्सएमएल फ़ाइल बनाएं जिसमें सूचनाएं हों जहां बनावट spritesheet के भीतर हों। ऐसा करने के लिए आप इस टूल का उपयोग कर सकते हैं: http://www.codeandweb.com/texturepacker

    मुझे यकीन नहीं है कि क्या आप इसे वाणिज्यिक परियोजनाओं के लिए उपयोग कर सकते हैं और जिन पाठों की आप बात कर रहे हैं, वह ऐसा नहीं है जैसे आप ऐसा कर रहे हैं एक शौक के रूप में, तो आप लाइसेंस की जांच करना चाहेंगे। एक समर्थक संस्करण भी उपलब्ध है।

    Texturepacker दो फाइलें बनाता है: spritesheet.png और spritesheet.xml। आप बस उन्हें अपनी परियोजना में कॉपी करें। फिर आप इस कोड को अपनी कक्षाओं में से एक में जोड़ दें।

    private static var gameTextureAtlas:TextureAtlas; 
    
        [Embed(source="../media/graphics/mySpriteSheet.png")] 
        public static const AtlasTextureGame:Class; 
    
        [Embed(source="../media/graphics/mySpritesheet.xml", mimeType="application/octet-stream")] 
        public static const AtlasXmlGame:Class; 
    
        public static function getAtlas():TextureAtlas 
        { 
         if(gameTextureAtlas==null) 
         { 
          var texture:Texture=getTexture("AtlasTextureGame"); 
          var xml:XML=XML(new AtlasXmlGame()); 
          gameTextureAtlas=new TextureAtlas(texture,xml); 
         } 
         return gameTextureAtlas; 
        } 
    

    अब आप बुला

    YourClass.getAtlas().getTexture("name"); 
    

    यह बस कमाल का है द्वारा spritesheet के सभी बनावट पहुँच सकते हैं। जब आप texturepacker का उपयोग कर रहे हैं तो स्पिसाइटशीट में बंडल किए गए प्रत्येक स्प्राइट्स का फ़ाइल नाम उसका बनावट बन जाता है।

    शायद आपकी मदद करने में बहुत देर हो चुकी है, लेकिन मुझे उम्मीद है कि भविष्य के आगंतुक इस सुरुचिपूर्ण समाधान से लाभ उठा सकते हैं।

    मैं इस बात पर जोर देना चाहता हूं कि यह उत्तर मूल रूप से शर्मा के ट्यूटोरियल से एक अंश है। मैंने अपने स्क्रीनकास्ट में इस्तेमाल किए गए कोड को पुन: पेश करने के लिए भी स्वतंत्र महसूस किया।सभी क्रेडिट उसे

    0

    अच्छा विचार है, LHK

    VTF और VMT VTF = छवि VMT = लिपि (xml या जावास्क्रिप्ट की तरह)

    अच्छा मैं के साथ स्रोत-इंजन की तरह अच्छा समाधान है कि हो जाता है TexturePacker, TexturePath या TextureTarget के लिए सुझाव देना चाहते हैं: पी

    टिप के लिए धन्यवाद।

    उदाहरण के लिए: mytexture.js:

    xml या जावास्क्रिप्ट:

    समारोह mytexture() {basedir = "/assets/mytexture.png", normalmap = "/ आस्तियों/mytexture_bump .png ", सामान्यक्यूब) [1, 1, 1]};

    मैं क्योंकि डिफ़ॉल्ट बनावट त्रुटि हो जाता है नहीं लगता कि कहीं mytexture.png मौजूद नहीं है की तुलना में यह फिर से होता है :)

    [एम्बेड (स्रोत = "../ संपत्ति/संपादक/error_texture है .png ")] सार्वजनिक स्थिर const ERROR_TEX: कक्षा; ...

    मुझे कैसे पता चलेगा कि एक्शनस्क्रिप्ट 3 को jsBirdge या ExternalInterface.call() जैसे जावास्क्रिप्ट को "पढ़ना" चाहिए;

    क्या यह संभव है?

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