2014-10-24 38 views
5

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

स्थिर वेक्टर "(5,5)" मैं स्वाइप की गति और दिशा से गणना की जरूरतों का उपयोग कर रहा हूं। साथ ही, मुझे यह सुनिश्चित करने की ज़रूरत है कि एक बार जब मैं ऑब्जेक्ट के साथ पहला संपर्क करता हूं, तो यह ऑब्जेक्ट को डबल मारने से बचने के लिए नहीं होता है। यहाँ मैं वर्तमान में क्या कर रहा हूँ है:

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 

for (UITouch *touch in touches) { 
    CGPoint location = [touch locationInNode:self]; 

    SKNode* node = [self nodeAtPoint:location]; 
    [node.physicsBody applyImpulse:CGVectorMake(5, 5) atPoint:location]; 
} 
} 

उत्तर

9

यहाँ कैसे एक कड़ी चोट इशारा पता लगाने के लिए का एक उदाहरण है।

CGPoint start; 
    NSTimeInterval startTime; 

स्पर्श में, एक स्पर्श घटना का स्थान/समय बचाएं।

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    /* Avoid multi-touch gestures (optional) */ 
    if ([touches count] > 1) { 
     return; 
    } 
    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInNode:self]; 
    // Save start location and time 
    start = location; 
    startTime = touch.timestamp; 
} 

स्वाइप इशारा के पैरामीटर को परिभाषित करें। तदनुसार इन्हें समायोजित करें।

#define kMinDistance 25 
#define kMinDuration 0.1 
#define kMinSpeed  100 
#define kMaxSpeed  500 

touchesEnded में, यह निर्धारित करता है, तो उपयोगकर्ता के इशारे प्रारंभ व समापन स्थान और समय टिकटों के बीच मतभेद की तुलना द्वारा एक कड़ी चोट थी।

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 

    UITouch *touch = [touches anyObject]; 
    CGPoint location = [touch locationInNode:self]; 
    // Determine distance from the starting point 
    CGFloat dx = location.x - start.x; 
    CGFloat dy = location.y - start.y; 
    CGFloat magnitude = sqrt(dx*dx+dy*dy); 
    if (magnitude >= kMinDistance) { 
     // Determine time difference from start of the gesture 
     CGFloat dt = touch.timestamp - startTime; 
     if (dt > kMinDuration) { 
      // Determine gesture speed in points/sec 
      CGFloat speed = magnitude/dt; 
      if (speed >= kMinSpeed && speed <= kMaxSpeed) { 
       // Calculate normalized direction of the swipe 
       dx = dx/magnitude; 
       dy = dy/magnitude; 
       NSLog(@"Swipe detected with speed = %g and direction (%g, %g)",speed, dx, dy); 
      } 
     } 
    } 
} 
+0

आपका बॉस! धन्यवाद भाई! –

+0

यह काम नहीं करता है जैसे स्वाइप नहीं करना। –

+0

@ iTroyd23 आवश्यक – 0x141E

0

touchesBegan में एक CGPoint आप अपने अनुप्रयोग भर उपयोग कर सकते हैं के रूप में स्पर्श स्थान बचाने के।

touchesEnded में अपने शुरुआती स्पर्श (स्पर्श बेगन) की दूरी और दिशा की गणना करें और स्पर्श स्पर्श (स्पर्श करें)। फिर उपयुक्त इंपल्स लागू करें।

डबल मारने से बचने के लिए, एक बूल कैनिट जोड़ें जिसे आप लागू करते हैं जब आवेग लागू होता है और जब आप फिर से हिट करने के लिए तैयार होते हैं तो वापस सेट करते हैं। आवेग लागू करने से पहले, सुनिश्चित करें कि CanHit YES पर सेट है।

पहले, प्रारंभिक स्थान और समय स्टोर करने के लिए उदाहरण चर निर्धारित:

+0

मुझे समझ में आता है, लेकिन मुझे इसके लिए कोड निकालने में कठिनाई हो रही है। क्या आप एक कोड नमूना प्रदान कर सकते हैं? –

1

एक और तरीका यह करने के लिए नहीं है, तो आप एक पैन इशारा जोड़ सकते हैं और फिर इसे से वेग मिलती है:

सबसे पहले अपने ध्यान में रखते हुए पैन इशारा जोड़ें:

UIPanGestureRecognizer *gestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)]; 
    [self.view addGestureRecognizer:gestureRecognizer]; 

फिर संभाल इशारा:

- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer 
{ 
    if (recognizer.state == UIGestureRecognizerStateBegan) { 
     CGPoint location = [recognizer locationInView:recognizer.view]; 
     if ([_object containsPoint:location]){ 
      self.movingObject = YES; 
      <.. object start moving ..> 
     } 

    } else if (recognizer.state == UIGestureRecognizerStateChanged) { 

     if (!self.movingObject) 
      return; 

     CGPoint translation = [recognizer translationInView:recognizer.view]; 
     object.position = CGPointMake(object.position.x + translation.x, object.position.y + translation.y); 

     [recognizer setTranslation:CGPointZero inView:recognizer.view]; 

    } else if (recognizer.state == UIGestureRecognizerStateEnded) { 

     if (!self.movingObject) 
      return; 

     self.movingObject = NO; 
     float force = 1.0f; 
     CGPoint gestureVelocity = [recognizer velocityInView:recognizer.view]; 
     CGVector impulse = CGVectorMake(gestureVelocity.x * force, gestureVelocity.y * force); 

     <.. Move object with that impulse using an animation..> 
    } 
} 
संबंधित मुद्दे