2010-11-15 13 views
9

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

मैं इस खेल को प्रत्येक फोन पर एक ही पैमाने पर देखना चाहता हूं, इस हद तक कि यदि आपने क्यूवीजीए फोन पर गेम का स्क्रीनशॉट लिया है, और स्क्रीनशॉट को WVGA आकार में बदल दिया है, तो यह लगभग समान दिखाई देगा जैसा कि गेम डब्लूवीजीए फोन पर दिखता है। दूसरे शब्दों में, पैडल की चौड़ाई हमेशा स्क्रीन चौड़ाई के 1/32 होना चाहिए, गेंद का व्यास हमेशा स्क्रीन चौड़ाई के 1/16 होना चाहिए।

एप्लिकेशन को पेंट करने का उचित तरीका क्या होगा? यह मानक SurfaceView में चलाया जाएगा जो Canvas पर खींचा जाएगा।

मान लें कि मेरे पास पैडल, बॉल और गेम फ़ॉन्ट (स्कोरबोर्ड, मुख्य मेनू) के लिए उच्च-रिज़ॉल्यूशन पीएनजी है।

मैं शारीरिक संकल्प पता लगाना है, तो scale(float sx, float sy) के माध्यम से Canvas पैमाने (QVGA और WVGA पर) मेरे सारे कैनवस ही आभासी संकल्प है बनाने के लिए, और उसके बाद प्रत्येक स्क्रीन पर प्रत्येक स्थिति पर बिल्कुल वैसा ही पुरातन आकर्षित आकार?

या क्या मैं कैनवास में किसी भी तरह घनत्व-स्वतंत्र पिक्सेल (डुबकी) का उपयोग कर सकता हूं?

उत्तर

4

मैं केवल ड्रा कैनवास कार्यों के साथ एक बार खेला है और फिर सभी को opengl पर स्विच किया लेकिन तर्क वही रहता है (मुझे लगता है)।

पहला मुद्दा आप एक अनुपात निरंतर फॉर्म एक फोन को दूसरे रखना चाहते हैं। मेरे ऐप में मैं प्रत्येक तरफ एक "ब्लैक बैंड" प्रभाव जोड़ता हूं। ऑनसुरफेस में, आप अनुपात की गणना करना चाहेंगे, यह अनुपात आपको यह निर्धारित करने की अनुमति देगा कि आपके ड्राइंग पर लगातार पहलू रखने के लिए आपको प्रत्येक पक्ष को कितनी जगह निकालना है। यह आप एक डेल्टा एक्स या वाई के लिए लागू करने के लिए दे देंगे आपके सभी ड्रॉ निम्नलिखित कोड कुछ मैं ओजीएल संस्करण से अनुकूलित तो यह थोड़ा tweeked करना पड़ सकता है है

@Override 
    public void onSurfaceChanged(int w, int h){ 
    float ratioPhysicScreen = nativeScreenResoltionW/nativeScreenResoltionH; 
    float ratioWanted = GameView.getWidth()/GameView.getHeight(); 
    if(ratioWanted>ratioPhysicScreen){ 
     newHeight = (int) (w*GameView.getHeight()/GameView.getWidth()); 
     newWidth = w; 
     deltaY = (int) ((h-newHeight)/2); 
    deltaX = 0; 
    }else{ 
     newWidth = (int) (h/GameView.getHeight()*GameView.getWidth()); 
     newHeight = h; 
     deltaX = (int) ((w-newWidth)/2); 
     deltaY = 0;  
} 

तो आप भी चाहता हूँ वहां वास्तविक आकार की तुलना में कैनवास के आकार के साथ-साथ कैनवास पर अपनी तस्वीरों को आकर्षित करने में सक्षम हो जाएं और जहां image.getWidth() (चित्र का वास्तविक आकार) और एक image.getScaledWidth (कैनवास) के बीच का अंतर है। आपको डीपी में तत्व का आकार दें जिसका अर्थ है कि यह स्क्रीन पर कितना बड़ा दिखाई देगा) महत्वपूर्ण है। नीचे उदाहरण देखें।

public class MainMenuView extends PixelRainView{ 
private Bitmap bmpPlay = null; 
private float playLeft = 0; 
private float playRight = 0; 
private float playBottom = 0; 
private float playTop = 0; 

public MainMenuView(Context context, AttributeSet attrs) { 
    super(context,attrs); 
} 



@Override 
public void unLoadBitmaps() { 
    super.unLoadBitmaps(); 
    if(bmpPlay != null){ 
     bmpPlay.recycle(); 
     bmpPlay = null; 
    } 
} 



@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    if(bmpPlay == null){ 
     bmpPlay = getBitmapFromRessourceID(R.drawable.play_bt); 
     playLeft = (this.getWidth()-bmpPlay.getScaledWidth(canvas))/2; 
     playRight = playLeft + bmpPlay.getScaledWidth(canvas); 
     playTop = (this.getHeight()-bmpPlay.getScaledHeight(canvas))/2; 
     playBottom = playTop+bmpPlay.getScaledHeight(canvas); 
    } 
    canvas.drawBitmap(bmpPlay,playLeft, playTop, null); 

    }  
} 


@Override 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(w, h, oldw, oldh); 
} 



@Override 
public boolean onTouchEvent(MotionEvent event) { 
    if(event.getAction() == MotionEvent.ACTION_DOWN){ 
     float x = event.getX(); 
     float y = event.getY(); 
     //test central button 
     if(x>playLeft && x<playRight && y<playBottom && y>playTop){ 
      Log.e("jason", "touched play"); 
      PixelRainView.changeView(R.layout.composedlayoutgroup); 
     } 
    return super.onTouchEvent(event); 
} 
} 

यह सब अपने अनुपात समस्या पार plateforms का समाधान करना चाहिए मैं ओपन सुझाव है क्योंकि यह एक स्थिर पहलू रखने के लिए अपनी जरूरत को सरल बनाएगा हैं, लेकिन मैं अपने एक विकल्प नहीं ^^

आशा इस यदि आपके पास पर्याप्त मदद करता है लगता है

2

उपयोग डुबकी और पैडल रंग बजाय PNG का

+0

मैं कैनवास विधियों जैसे ड्रॉलाइन() में डुबकी का उपयोग कैसे करूं? – Axarydax

+0

ठीक है चलो पोंग क्लोन भूल जाओ और चलो टाइल-आधारित गेम जैसे पीएसी-मैन या सिमसिटी से बात करते हैं। तो पीएनजी में संग्रहित टाइल्स हैं और पोंग शायद एक उदाहरण का बहुत आसान था। – Axarydax

-1

मुझे लगता है कि केवल 3 मानक प्रस्तावों उपलब्ध (LDIP, mdip, hdip) देखते हैं कि का उपयोग कर के और आप उनमें से प्रत्येक के लिए एक संसाधन फ़ोल्डर होना चाहिए।

http://developer.android.com/guide/practices/screens_support.html

आप मैन्युअल रूप से बड़े पैमाने अपने पीएनजी के 3 उपलब्ध प्रस्तावों में से प्रत्येक के फिट करने के लिए हैं, तो फोन एक पारदर्शी तरीके से विशिष्ट संसाधन फ़ोल्डर लोड करना चाहिए

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