2010-05-31 12 views
6

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

मैं सोच रहा हूं कि अगर मैं किसी भी तरह से एक सरणी प्राप्त कर सकता हूं जिसमें सभी कैलियर के पॉइंटर्स शामिल हैं जिनमें क्लिक पॉइंट होता है, तो मैं उनके माध्यम से कुछ फ़िल्टर कर सकता हूं। हालांकि एक ही रास्ता मैं अब तक सरणी बनाने के लिए मिल गया है है:

NSMutableArray* anArrayOfLayers = [NSMutableArray array]; 
    for (CALayer* aLayer in mapLayer.sublayers) 
    { 
     if ([aLayer containsPoint:mouseCoord]) 
      [anArrayOfLayers addObject:aLayer]; 
    } 

फिर CALayer के z के मूल्यों से सरणी सॉर्ट तो जाँच के माध्यम से जाने यदि स्थान पर पिक्सेल अल्फा है या नहीं। हालांकि, सॉर्ट और अल्फा चेक के बीच यह एक अविश्वसनीय प्रदर्शन हॉग प्रतीत होता है। (आप अल्फा को भी कैसे देखेंगे?)

क्या ऐसा करने का कोई तरीका है?

उत्तर

10

कुछ मैं ठोकर खाई, जबकि एक समान समस्या के ऊपर मेरे सिर खरोंच भर में है कि CALayer containsPoint: का उपयोग करता है जब आप इसे भेजने hitTest:

इसकी डिफ़ॉल्ट व्यवहार सीमा के खिलाफ परीक्षण करने के लिए है, लेकिन हम ओवरराइड और यह अल्फा की जाँच करने के प्राप्त कर सकते है चैनल, और बस का उपयोग CALayer की हिट-परीक्षण में बनाया बाकी को संभालने के लिए:

- (BOOL) containsPoint:(CGPoint)p 
{ 
    return CGRectContainsPoint(self.bounds, p) && !ImagePointIsTransparent(self.contents, p)) return YES; 
} 

वहाँ Retrieving a pixel alpha value for a UIImage

टी पर एक एकल पिक्सेल के अल्फा के लिए परीक्षण की चर्चा है मेरी प्रयोजनों के लिए अपने काम किया:

static BOOL ImagePointIsTransparent(CGImageRef image, CGPoint p) 
{ 
    uint8_t alpha; 

    CGContextRef context = CGBitmapContextCreate(&alpha, 1, 1, 8, 1, NULL, kCGImageAlphaOnly); 
    CGContextDrawImage(context, CGRectMake(-p.x, -p.y, CGImageGetWidth(image), CGImageGetHeight(image)), image); 
    CGContextRelease(context); 

    return alpha == 0; 
} 

(आप renderInContext: का उपयोग कर रहे CALayer को आकर्षित करने के लिए करने के बजाय उसकी सामग्री को संपत्ति की स्थापना है, तो यह और अधिक जटिल हो जा रहा है। यह उस मामले में उपयोगी हो सकता है: http://www.cimgf.com/2009/02/03/record-your-core-animation-animation/)

+0

क्रिस, यह बहुत ही भयानक है! आपके लिए प्रश्न: जब बिंदु में गुजरते हैं, तो ऐसा लगता है कि इसकी उत्पत्ति निचले बाएं बनाम ऊपरी-दाएं होनी चाहिए। मुझे संदेह है कि यह कुछ ऐसा है जो यहां बिंदु को पार करने से पहले होना चाहिए, है ना? (छवि की ऊंचाई का उपयोग करने के अलावा y को चारों ओर फ़्लिप करने के अलावा।) मुझे लगता है कि मैं यह निर्धारित करने की कोशिश कर रहा हूं कि समायोजन कहां सही जगह है - ImagePointIstransparent में, या इशारा/स्पर्श हैंडलर में। –

+0

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

+0

क्रिस, मुझे अभी एहसास हुआ: आप एक मैक ऐप लिख रहे हैं। मैं एक आईओएस ऐप लिख रहा हूं। यह पता चला है कि, रेटिना डिस्प्ले का उपयोग करते समय, यह परीक्षण काम नहीं करता है (आईफोन 4 पर या रेटिना मोड में सिम्युलेटर)। क्वार्ट्ज 2 डी प्रोग्रामिंग गाइड अनुशंसा करता है कि मैं निग्राफिक्सबिनजिन इमेज कॉन्टेक्स्ट विथऑप्शन बनाम निम्न-स्तरीय क्वार्ट्ज फ़ंक्शंस का उपयोग करता हूं, इसलिए मुझे यह देखना होगा कि क्या यह सीटीएम के साथ मदद करता है और इसी तरह। (यह भी समझा सकता है कि प्रतिक्रिया रेटिना पर "जगह पर" क्यों दिखाई देती है।) Http://stackoverflow.com/questions/7506248/alpha-detection-in-layer-ok-on-simulator-not-iphone –

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