2012-06-25 2 views
5

का आकार बदलने के बिना केंद्र के चारों ओर बिटमैप घुमाएं। मैं अपने केंद्र के चारों ओर एक घूर्णन बिटमैप खींचने के लिए संघर्ष कर रहा हूं और बिटमैप का आकार बदलने के बिना घूर्णन कर रहा हूं। मैं अपने सभी sprites को एक गेम थ्रेड के माध्यम से स्क्रीन पर खींच रहा हूं, इसलिए मैं ऐसे समाधान की तलाश में हूं जो मूल बिटमैप को शामिल करता है न कि कैनवास।एंड्रॉइड

अग्रिम धन्यवाद।

यह मेरा कोड है अब तक, यह अपने केंद्र के चारों ओर एक बिटमैप बदलता है, फिर भी इसका आकार बदलता है।

i = i + 2; 
      transform.postRotate(i, Assets.scoresScreen_LevelStar.getWidth()/2, Assets.scoresScreen_LevelStar.getHeight()/2); 
      Bitmap resizedBitmap = Bitmap.createBitmap(Assets.scoresScreen_LevelStar, 0, 0, Assets.scoresScreen_LevelStar.getWidth(), Assets.scoresScreen_LevelStar.getHeight(), transform, true); 

      game.getGraphics().getCanvasGameScreen().drawBitmap(resizedBitmap, null, this.levelStar.getHolderPolygons().get(0), null); 

अद्यतन:

मैंने देखा है यह जितना आसान यह लग रहा है नहीं है। मेरा घूर्णन कोड समस्या नहीं है। बिटमैप घुमाता है, फिर भी डीएसटी रेक्ट को रोटेशन के कोण के आधार पर बढ़ाना/घटाना होगा, या फिर बिमाप छोटे दिखाई देगा, क्योंकि यह एक निश्चित डीएसटी रेक्ट में खींचा जाता है। तो मुझे अनुमान है कि मुझे कुछ विधि विकसित करना होगा जो एक डीएसटी रेक्ट वापस कर देगा। तो तरीकों के बिना एक बिटमैप बारी बारी से करने के लिए आवश्यक आकार बदलने दिखाई दिया:

public static Bitmap rotateBitmap(Bitmap bitmap, int rotation) // I've got this method working 

और

public static Rect rotateRect(Rect currentDst, int rotation) // Don't got this 

मैं चुनौती के लिए ऊपर समझते हैं कि यह कुछ गणित (trig) की आवश्यकता होगी, किसी को? : पी

+0

आपने अभी तक क्या प्रयास किया है? क्या आप कुछ उदाहरण पोस्ट कर सकते हैं जो आपके लिए काम नहीं कर चुके हैं? –

+0

सीधे एंड्रॉइड या कोकोस 2 डी-एक्स? – Fallenreaper

+0

कोड के साथ अद्यतन प्रश्न, @Fallenreaper, मैं अपने स्वयं के जीई का उपयोग कर रहा हूं, तो सीधे एंड्रॉइड। –

उत्तर

0

यह मेरे लिए काम किया!

मैंने एक विधि बनाई है जो एक मैट्रिक्स देता है। निम्नलिखित ड्राइंग विधि में मैट्रिक्स का उपयोग किया जा सकता है:

public void drawBitmap (Bitmap bitmap, Matrix matrix, Paint paint) 

यहां आप जाओ! (पैरामीटर आकार आसानी से प्रतिस्थापित किया जा सकता है, अगर आपको लगता है कि चाहते हैं, बस एक टिप्पणी छोड़):

public static Matrix rotateMatrix(Bitmap bitmap, Shape shape, int rotation) { 

     float scaleWidth = ((float) shape.getWidth())/bitmap.getWidth(); 
     float scaleHeight = ((float) shape.getHeight())/bitmap.getHeight(); 

     Matrix rotateMatrix = new Matrix(); 
     rotateMatrix.postScale(scaleWidth, scaleHeight); 
     rotateMatrix.postRotate(rotation, shape.getWidth()/2, shape.getHeight()/2); 
     rotateMatrix.postTranslate(shape.getX(), shape.getY()); 


     return rotateMatrix; 

    } 

एनबी: आप एक एनिमेटेड रोटेशन चाहते हैं, रोटेशन पैरामीटर नए मूल्यों के साथ अद्यतन करना होगा हर फ्रेम उदाहरण के लिए। 1 फिर 2 फिर 3 ...

7

आपको Matrix कक्षा का उपयोग करके बिटमैप खींचना चाहिए। नीचे एक बहुत ही बुनियादी विचार माना जाता है कि आप एक "जहाज" वर्ग के अंदर एक छवि को घुमाने के लिए चाहते हैं। आप अपडेट विधि के अंदर वर्तमान स्थिति मैट्रिक्स को अद्यतन करते हैं। ऑनड्रा() में आप नई अद्यतन स्थिति मैट्रिक्स का उपयोग करके बिटमैप खींचते हैं। यह घूर्णन बिटमैप को आकार देने के बिना आकर्षित करेगा।

public class Ship extends View { 

    private float x, y; 
    private int rotation; 
    private Matrix position;  
    private Bitmap bitmap; 

    ... 

    @Override 
    public void onDraw(Canvas canvas) { 
     // Draw the Bitmap using the current position 
     canvas.drawBitmap(bitmap, position, null); 
    } 

    public void update() { 
     // Generate a new matrix based off of the current rotation and x and y coordinates. 
     Matrix m = new Matrix(); 
     m.postRotate(rotation, bitmap.getWidth()/2, bitmap.getHeight()/2); 
     m.postTranslate(x, y); 

     // Set the current position to the updated rotation 
     position.set(m); 

     rotation += 2; 
    } 

    .... 

} 

आशा है कि मदद करता है!

यह भी ध्यान रखें कि गेम लूप के अंदर एक नया Bitmap ऑब्जेक्ट उत्पन्न करना संसाधन गहन होगा।

+0

क्या आप फिर से लिख सकते हैं, कि मैं rotateBitmap (बिटमैप बिटमैप, इंट रोटेशन) नामक एक स्थैतिक विधि को कॉल कर सकता हूं, जो बिटमैप घुमाए गए बिमाप ऑब्जेक्ट को वापस कर देगा? –

+0

विधि आपके द्वारा पारित बिटमैप को बदलती है, इसलिए आपका निजी चर "निजी बिटमैप बिटमैप;" घुमाया नहीं है।बस "वापसी बिटमैप करें"; और विधि हस्ताक्षर बदलें। – Aziz

+0

क्षमा करें, यह मेरे लिए काम नहीं करता है। –