2011-03-25 12 views
7

मेरा ऐप मेरे विचार के onDraw() विधि में निम्नलिखित को फोन करके अपनी ही स्प्राइट लागू करता है के ट्वीन एनीमेशन:एंड्रॉयड: एक बिटमैप

canvas.drawBitmap(sprite.getBitmap(), sprite.getX(), sprite.getY(), null); 

अनुप्रयोग एक भौतिकी सिमुलेशन है, और अब तक इस महान बाहर काम किया है। लेकिन अब जब कुछ घटनाएं होती हैं तो मैं sprites के लिए छवियों के बीच मोर्फ़िंग करके एनीमेशन को बढ़ाना चाहता हूं।

उदाहरण के लिए- जब टकराव होता है, तो मैं एक विस्फोट की एनीमेशन खेलना चाहता हूं। मेरा विचार विस्फोट पीएनजी के साथ सामान्य स्प्राइट बिटमैप को प्रतिस्थापित करना था, और विस्फोट को बड़ा करने के लिए एंड्रॉइड "ट्विन एनीमेशन" का उपयोग करना था।

लेकिन एंड्रॉइड tween animation example मानता है कि आपके पास ImageView आपके XML कॉन्फ़िगरेशन में कहीं भी स्थिर रूप से परिभाषित है।

क्या ट्विन एनीमेशन का उपयोग करके onDraw() में खींचा गया बिटमैप एनिमेट करने का कोई तरीका है? या क्या मुझे अपने sprites को ImageView का उपयोग करने के लिए बदलने की ज़रूरत है? यदि उत्तरार्द्ध, क्या आप मुझे एंड्रॉइड में उचित स्प्राइट एनीमेशन के उदाहरण के लिए इंगित कर सकते हैं?

धन्यवाद

उत्तर

10

मैंने जावा में एक सामान्य टिव इंजन बनाया है जिसका उपयोग आप अपने sprites सहित कुछ भी एनिमेट करने के लिए कर सकते हैं। यह एंड्रॉइड और गेम्स के लिए अनुकूलित है क्योंकि यह कचरा संग्रह से बचने के लिए रनटाइम पर कुछ भी आवंटित नहीं करता है। इसके अलावा, ट्वीन्स पूल किए जाते हैं, वास्तव में: कोई कचरा संग्रह बिल्कुल नहीं!

आप एक एंड्रॉइड एप्लिकेशन के रूप में एक पूर्ण डेमो here देख सकते हैं, या here वेबग्ल HTML पृष्ठ (क्रोम की आवश्यकता है) के रूप में देख सकते हैं!

आपको बस अपने सभी sprites को टिवन समर्थन जोड़ने के लिए TweenAccessor इंटरफ़ेस को लागू करना है। आपको अपनी स्प्राइट क्लास को भी बदलना नहीं है, बस SpriteTweenAccessor कक्षा बनाएं जो TweenAccessor<Sprite> लागू करती है, और इसे प्रारंभ में इंजन पर पंजीकृत करें। बस GetStarted wiki page पर एक नजर है;)

http://code.google.com/p/java-universal-tween-engine/

logo

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

पूरे इंजन को अत्यधिक दस्तावेज किया गया है (सभी सार्वजनिक तरीकों और कक्षाओं में विस्तृत जावाडोक है), और सिंटैक्स ग्रीसॉक के टिनमैक्स/ट्विनलाइट इंजन के समान है जो फ़्लैश दुनिया में उपयोग किया जाता है। ध्यान दें कि यह हर रॉबर्ट पेननर आसान समीकरण का समर्थन करता है।

// Arguments are (1) the target, (2) the type of interpolation, 
// and (3) the duration in seconds. Additional methods specify 
// the target values, and the easing function. 

Tween.to(mySprite, Type.POSITION_XY, 1.0f).target(50, 50).ease(Elastic.INOUT); 

// Possibilities are: 

Tween.to(...); // interpolates from the current values to the targets 
Tween.from(...); // interpolates from the given values to the current ones 
Tween.set(...); // apply the target values without animation (useful with a delay) 
Tween.call(...); // calls a method (useful with a delay) 

// Current options are: 

yourTween.delay(0.5f); 
yourTween.repeat(2, 0.5f); 
yourTween.repeatYoyo(2, 0.5f); 
yourTween.pause(); 
yourTween.resume(); 
yourTween.setCallback(callback); 
yourTween.setCallbackTriggers(flags); 
yourTween.setUserData(obj); 

// You can of course chain everything: 

Tween.to(...).delay(1.0f).repeat(2, 0.5f).start(); 

// Moreover, slow-motion, fast-motion and reverse play is easy, 
// you just need to change the speed of the update: 

yourTween.update(delta * speed); 
बेशक

, कोई ट्वीन इंजन एक तरीका प्रदान शक्तिशाली दृश्यों :)

Timeline.createSequence() 
    // First, set all objects to their initial positions 
    .push(Tween.set(...)) 
    .push(Tween.set(...)) 
    .push(Tween.set(...)) 

    // Wait 1s 
    .pushPause(1.0f) 

    // Move the objects around, one after the other 
    .push(Tween.to(...)) 
    .push(Tween.to(...)) 
    .push(Tween.to(...)) 

    // Then, move the objects around at the same time 
    .beginParallel() 
     .push(Tween.to(...)) 
     .push(Tween.to(...)) 
     .push(Tween.to(...)) 
    .end() 

    // And repeat the whole sequence 2 times 
    // with a 0.5s pause between each iteration 
    .repeatYoyo(2, 0.5f) 

    // Let's go! 
    .start(); 

मुझे आशा है कि आप आश्वस्त कर रहे हैं का निर्माण करने के बिना पूर्ण नहीं हो :) वहाँ बहुत से लोगों को पहले से ही प्रयोग कर रहे हैं अपने खेल में इंजन या एंड्रॉइड यूआई एनीमेशन के लिए।

+0

वाह देखें, यह बहुत अच्छा है, धन्यवाद। –

+0

मैंने अभी थोड़ा सा विवरण अपडेट किया है, क्योंकि इंजन ने पहली बार जवाब लिखा था क्योंकि इंजन ने बड़ी प्रगति की है :) –

+0

@ AurélienRibon, क्या यह एक स्प्राइट से एक अलग स्प्राइट में एनीमेशन प्रदान करता है? –

1

आप ImageView एक xml फ़ाइल से आ रही बिना ट्वीन एनीमेशन कर सकते हैं, लेकिन यह वास्तव में आपके विचार पदानुक्रम में एक दृश्य होने की जरूरत है।

आपके Canvas में जो चित्र आप कर रहे हैं वह दृश्य पदानुक्रम के लिए अपारदर्शी है। मुझे लगता है कि आप दो विकल्प हैं:

  1. ओवरले एक ImageView अपने कस्टम दृश्य के शीर्ष पर और कहा कि ट्वीन एनिमेशन का उपयोग कर चेतन।
  2. अपने विस्फोट को एनिमेट करने के लिए Canvas ड्रा दिनचर्या का उपयोग करें।

मैं कहना चाहता हूँ कि Canvas दिनचर्या का उपयोग कर, उनके maxtrix परिवर्तनों के साथ-साथ, यह देखते हुए समझ में आता है कि आप शायद पहले से ही अपने अनुप्रयोग में एक एनीमेशन धागा है।

+1

यदि आप किसी गेम को क्रेट कर रहे हैं, तो आप अपनी छवियों की स्थिति को अपडेट करने के लिए वेक्टर (गणितीय) का उपयोग कर सकते हैं और फिर getX और getY के साथ आकर्षित कर सकते हैं। आपको कुछ गति के माध्यम से कुछ दिशा में इस वेक्टर को फिर से चालू और अद्यतन करना चाहिए। –

+0

@ मार्कोस: मैं पहले से ही अपने स्प्राइट क्लास (x/y स्थान, x/y veclocities) में एक प्रकार का वेक्टर लागू करता हूं। क्या इसके लिए एक मानक वर्ग है जिसे मैंने अनदेखा कर दिया है? –

+0

क्या आपको लगता है कि किसी प्रकार की पूर्ण स्थिति के साथ sprites के लिए ImageViews का उपयोग करना समझ में आता है, और फिर ड्राइंग के लिए भी उन पर भरोसा करते हैं? यही एनीमेशन है जिसका उपयोग मैं कोर एनीमेशन के साथ आईफोन पर करने के लिए किया जाता हूं, और मुझे आश्चर्य हुआ कि एंड्रॉइड में कुछ ऐसा ही अनुशंसित उदाहरण नहीं था। एंड्रॉइड नियमित अंतराल पर कैनवास को मैन्युअल रूप से अपडेट करने के लिए प्रोत्साहित करता है। मुझे आश्चर्य है कि यह सिर्फ इसलिए है क्योंकि मैंने जो उदाहरण चुना वह भौतिकी सिमुलेशन था, और दर्जनों कणों को मॉडल करने के लिए कोई स्वचालित तरीका नहीं है, प्रत्येक दूसरों पर गुरुत्वाकर्षण बल डालता है। –

0

आप आकर्षित और एडोब फ्लैश में अपने विस्फोट चेतन सकता है, swfSheet या इसी तरह के और का उपयोग कर तो Frame animation

0

का उपयोग आप एक खेल बना रहे हैं स्प्राइट छवियाँ निर्यात करते हैं, आप वाहक (गणितीय) का उपयोग कर सकते की स्थिति को अद्यतन करने के अपनी छवियों और फिर getX और getY के साथ खींचें। आपको कुछ गति के माध्यम से कुछ दिशा में इस वेक्टर को फिर से चालू और अद्यतन करना चाहिए।

वे वेक्टर मूल नहीं हैं (गेम एपीआई है)।

आपको स्थिति को फिर से चलाने और अद्यतन करने के लिए एक लूप की आवश्यकता है, फिर पुन: निकालें।

खेलों के लिए, एनीमेशन बनाने के लिए ऐसे छवि दृश्यों को घटाना अच्छा नहीं है। उन्हें समय के साथ बार-बार सभी लेआउट को कैल्क करने के लिए सिस्टम की आवश्यकता होती है।

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