Cocos2d iphone 拖到CCLayer上有时会工作

Cocos2d iphone 拖到CCLayer上有时会工作,cocos2d-iphone,Cocos2d Iphone,我很难接触到自定义类的工作 -(void) ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { NSSet *allTouch = [event allTouches]; UITouch *touch = [[allTouch allObjects]objectAtIndex:0]; CGPoint location = [touch locationInView:[touch view]]; location = [[CC

我很难接触到自定义类的工作

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

NSSet *allTouch = [event allTouches];
UITouch *touch = [[allTouch allObjects]objectAtIndex:0];
CGPoint location = [touch locationInView:[touch view]];
location = [[CCDirector sharedDirector]convertToGL:location];


DragItems = [[NSMutableArray alloc]initWithObjects:

             Bubble01,
             Bubble02,
             Bubble03,
             Bubble04,
             Bubble05,
             Bubble06,
             nil];

for(int i = 0; i < [DragItems count]; i++)
{
    sprite = (Bubble *)[DragItems  objectAtIndex:i];
    //sprite = (CCSprite *)[DragItems  objectAtIndex:i];
    //if(CGRectContainsPoint([sprite boundingBox], location))
        if(sprite.tag ==12 && CGRectContainsPoint([sprite boundingBox],location))
    {
        selectedSprite = sprite;
        //[self reorderChild:sprite z:BubbleDepthOntop];
    }
    }
  }


-(void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
//Move touched sprite
NSSet *allTouch = [event allTouches];
UITouch *touch = [[allTouch allObjects]objectAtIndex:0];
CGPoint location = [touch locationInView:[touch view]];
location = [[CCDirector sharedDirector]convertToGL:location];

selectedSprite.position = ccp(location.x, location.y);
NSLog(@"Position: %f %f",location.x, location.y);
}

-(void) ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
NSSet *allTouch = [event allTouches];
UITouch *touch = [[allTouch allObjects]objectAtIndex:0];
CGPoint location = [touch locationInView:[touch view]];
location = [[CCDirector sharedDirector]convertToGL:location];


selectedSprite = nil;
isTouched = NO;

}
////

气泡精灵将作为子对象添加到level01层 然后使用以下代码移动:

 -(void)Scrolltick:(ccTime)ScrollTime
{
[self ScrollSprite:ScrollTime mySprite:Bubble01];
[self ScrollSprite:ScrollTime mySprite:Bubble02];
[self ScrollSprite:ScrollTime mySprite:Bubble03];
[self ScrollSprite:ScrollTime mySprite:Bubble04];
[self ScrollSprite:ScrollTime mySprite:Bubble05];
[self ScrollSprite:ScrollTime mySprite:Bubble06];
}
-(void)ScrollSprite:(ccTime)dt mySprite:(Bubble*)mySprite
{
int MaxHeightofBubbles = 350;
int minHeightofBubbles = 150;

RandomNumber = [self generateRandomNumberBetweenMin:minHeightofBubbles Max:MaxHeightofBubbles];
float ConvertedRandom = [[NSNumber numberWithInt: RandomNumber] floatValue];

mySprite.position = ccp(mySprite.position.x+BubbleSpeed,mySprite.position.y);
if (mySprite.position.x >= 1024+1)
{
    mySprite.position = ccp (0-[mySprite boundingBox].size.width,ConvertedRandom);  //mySprite.position.y+ConvertedRandom
    bubbleStartAgain = YES;
}
}

而不是
CGRectContainsPoint([sprite boundingBox],location))

使用
[self-isTouchOnSprite:location:sprite]

-(BOOL) isTouchOnSprite:(CGPoint)touch:(CCSprite*)clip{
    CGPoint local = [self convertToNodeSpace:touch];
    Boolean b = CGRectContainsPoint([clip boundingBox], local);
    if (b) {
        return YES;
    }else {
        return NO;
    }
}
更新的项目

让我知道这是否有效。

谢谢Rahul,代码中有几个问题:“touch”用作上一个参数的名称,而不是选择器未使用的var“local”的一部分。我修复了这些问题,并将指向(CCSprite*)的指针更改为自定义类(Bubble*),但幸运的是它没有返回touch,不过,谢谢你的建议,我会尝试其他一些想法,看看效果如何。@Natty:好的。我错过了本地的打字。。使用本地而不是触摸。。改变了我的答案。。。您还可以在自定义类中使用
CCTargetedTouchDelegate
。我的一个游戏也遇到了类似的问题。我用触摸来代替每个雪碧
CCTouchBegined
。谢谢Rahul,我用我的旧代码制作了一个正在发生的事情的视频-你会看到触摸正在工作,但是对象(Bubble*)无法理解它是否被取消选择。“selectedSprite=nil”不起作用有时自定义类sprite可以正确拖动,有时另一个(气泡*)跳到touch的当前位置@Natty:您使用的是哪个CoCoCoS2D版本。。。。。。。。。。。CCLayer类是否使用任何物理引擎?。。。。。。。。。。。是否单独移动气泡对象?。。。。。。。。。。将尝试使用自定义类和ping back进行演示。感谢Rahul,我添加了气泡类,气泡应以不同的速度分别在屏幕上移动(移动到屏幕右侧,然后在位置1024+1处-它们移回屏幕开始位置0处-y位置是随机的)场景中没有物理,只有加载到level01层的气泡精灵。我正在运行cocos2diphonev2.1
 -(void)Scrolltick:(ccTime)ScrollTime
{
[self ScrollSprite:ScrollTime mySprite:Bubble01];
[self ScrollSprite:ScrollTime mySprite:Bubble02];
[self ScrollSprite:ScrollTime mySprite:Bubble03];
[self ScrollSprite:ScrollTime mySprite:Bubble04];
[self ScrollSprite:ScrollTime mySprite:Bubble05];
[self ScrollSprite:ScrollTime mySprite:Bubble06];
}
-(void)ScrollSprite:(ccTime)dt mySprite:(Bubble*)mySprite
{
int MaxHeightofBubbles = 350;
int minHeightofBubbles = 150;

RandomNumber = [self generateRandomNumberBetweenMin:minHeightofBubbles Max:MaxHeightofBubbles];
float ConvertedRandom = [[NSNumber numberWithInt: RandomNumber] floatValue];

mySprite.position = ccp(mySprite.position.x+BubbleSpeed,mySprite.position.y);
if (mySprite.position.x >= 1024+1)
{
    mySprite.position = ccp (0-[mySprite boundingBox].size.width,ConvertedRandom);  //mySprite.position.y+ConvertedRandom
    bubbleStartAgain = YES;
}
}
-(BOOL) isTouchOnSprite:(CGPoint)touch:(CCSprite*)clip{
    CGPoint local = [self convertToNodeSpace:touch];
    Boolean b = CGRectContainsPoint([clip boundingBox], local);
    if (b) {
        return YES;
    }else {
        return NO;
    }
}