سؤال

وأنا تطوير لعبة 2D وعن اي فون باستخدام cocos2d.

وأنا استخدم الكثير من العفريت الصغير (الصورة) في لعبي. أريد أن أتطرق نوعين مماثلة من شبح (الصورة) وبعد ذلك كل العفريت (صورة) سوف تكون مخفية.

وكيف يمكنني الكشف عن اتصال في العفريت معين (صورة)؟

هل كانت مفيدة؟

المحلول

في طبقة الذي يحتوي العفريت الخاص بك، فإنك بحاجة إلى أن أقول:

self.isTouchEnabled = YES;

وبعد ذلك يمكنك استخدام نفس الأحداث التي ستستخدم في UIView، لكنهم اسمه بشكل مختلف قليلا:

- (void)ccTouchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
   UITouch* touch = [touches anyObject];
  //in your touchesEnded event, you would want to see if you touched
  //down and then up inside the same place, and do your logic there.
}

نصائح أخرى

وهناك طريقة أفضل للقيام بذلك هي في الواقع لاستخدام المربع المحيط على العفريت نفسه (وهو CGRect). في هذه التعليمات البرمجية، أضع كل ما عندي من العفاريت في NSMutableArray وأنا فحص بسيط إذا لمس العفريت هو في المربع المحيط. تأكد من تشغيل الكشف عن اتصال في الحرف الأول. إذا لاحظت أنا أيضا قبول / رفض اللمسات على طبقة بالعودة YES (إذا كنت تستخدم اللمس) أو NO (إذا كنت لا)

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event 
{
  CGPoint location = [self convertTouchToNodeSpace: touch];

  for (CCSprite *station in _objectList)
  {
    if (CGRectContainsPoint(station.boundingBox, location))
    {
      DLog(@"Found sprite");
      return YES;
    }
  }

  return NO;
}

وبعد تعليمات جوناس، وإضافة على ذلك أكثر قليلا ...

- (void)ccTouchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
   UITouch* touch = [touches anyObject];
   CGPoint location = [[[Director sharedDirector] convertCoordinate: touch.location];
   CGRect particularSpriteRect = CGMakeRect(particularSprite.position.x, particularSprite.position.y, particularSprite.contentSize.width, particularSprite.contentSize.height);
   if(CGRectContainsPoint(particularSpriteRect, location)) {
     // particularSprite touched
     return kEventHandled;
   }
}

وقد تحتاج إلى ضبط س / ص قليلا لحساب "توسيط" في جزر كوكوس

وdavid، رمز لديه بعض الأخطاء المطبعية لكوكوس 0.7.3 و2.2.1، وتحديدا CGRectMake بدلا من CGMakeRect و[موقع مسة] الآن [مسة locationInView: touch.view].

وهنا ما فعلته:

- (BOOL)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch * touch = [touches anyObject];

    CGPoint location = [[Director sharedDirector] convertCoordinate: [touch locationInView:touch.view]];
    CGRect myRect = CGRectMake(sprite.position.x, sprite.position.y, sprite.contentSize.width, sprite.contentSize.height);


    if(CGRectContainsPoint(myRect, location)) {
        // particularSprite touched
        return kEventHandled;
    }
}

وGenericrich: CGRectContainsPoint يعمل في CocosLand بسبب الدعوة خطوط 2 أعلاه:

[[Director sharedDirector] convertCoordinate:]

وسيتم الكائنات Cocos2D باستخدام برنامج OpenGL النظام، حيث 0،0 من أسفل اليسار، والإحداثيات UIKit (مثل التي وقع فيها اللمس) تنسيق ديك 0،0 هو أعلى اليسار. convertCoordinate: هو جعل الوجه من UIKit إلى برنامج OpenGL بالنسبة لك.

وهنا كيف أنها عملت لي ... حيث spriteSize ومن الواضح أن حجم والعفريت و...: P

- (BOOL)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch * touch = [touches anyObject];

    CGPoint location = [[Director sharedDirector] convertCoordinate: [touch locationInView:touch.view]];
    CGRect myRect = CGRectMake(sprite.position.x-spriteSize/2, sprite.position.y-spriteSize/2, spriteSize, spriteSize);


    if(CGRectContainsPoint(myRect, location)) {
        // particularSprite touched
        return kEventHandled;
    }
}

وهذا هو تعليمي جيد لشرح نظام اتصال الأساسي http://ganbarugames.com/2010/12/detecting- لمس الأحداث في cocos2d-فون /

أولا، والكتابة

self.isTouchEnabled = YES;

وبعد ذلك، تحتاج إلى تنفيذ وظائف ccTouchesEnded، ccTouchesBegan، الخ

ومن ما فهمت، وتريد أن تكون قادرة على "مباراة" اثنين من العفاريت التي يمكن أن تكون على إحداثيات مختلفة على الشاشة.

وطريقة للقيام بذلك ..: (ايم متأكد من ثيريس العديد من الأساليب الأخرى)

والنظر في وجود 2 المتغيرات العالمية.

وهكذا في كل مرة لمسة يلمس العفريت، يمكنك استخدام وظيفة CGRectContainsPoint المذكور عدة مرات لإيجاد الذي العفريت تم لمسها. ثم، يمكنك حفظ 'علامة' من أن شبح في واحدة من المتغيرات العالمية.

وأنت تفعل الشيء نفسه بالنسبة للاللمسة الثانية، ثم قارنت المتغيرات العالمية 2.

ويجب أن تكون قادرة على معرفة بقية ولكن التعليق على ما اذا كانت لديك مشاكل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top