无法检测嵌套自定义精灵图层上的触摸

时间:2013-01-08 12:21:41

标签: objective-c cocoa-touch cocos2d-iphone

我在下面有一个图层HelloWorldLayer,其中touch可以在任何地方使用,但我希望它只在触摸图层中的精灵时才能工作 - turtle

如果我尝试将self.isTouchEnabled = YES;添加到CCTurtle图层上,则说明

  在对象类型CCTurtle上找不到

属性isTouchEnabled

我的输出如下:

2013-01-08 20:30:14.767 FlashToCocosARC [6746:d503] cocos2d:deallocing

2013-01-08 20:30:15.245 FlashToCocosARC [6746:d503]播放动画2

这是我的HelloWorldLayer代码:

#import "HelloWorldLayer.h"
#import "CCTurtle.h"

@implementation HelloWorldLayer

+(CCScene *) scene
{
    CCScene *scene = [CCScene node];
    HelloWorldLayer *layer = [HelloWorldLayer node];
    [scene addChild: layer];
    return scene;
}

-(id) init
{
    if( (self=[super init])) {
        turtle= [[CCTurtle alloc] init];
        [turtle setPosition:ccp(300, 100)];
        [self addChild:turtle];
        ///addChild:child z:z tag:aTag;
        self.isTouchEnabled = YES;
        turtle. tag=4;
    //

    }
return self;
}



//- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
//{
//    // Processing all touches for multi-touch support
//    UITouch *touch = [touches anyObject];
//    if ([[touch view] isKindOfClass:[turtle class]]) {
//        NSLog(@"[touch view].tag = %d", [touch view].tag);
//        [self toggleTurtle];
//    }
//}
-(BOOL)containsTouch:(UITouch *)touch {
    CGRect r=[turtle textureRect];
    CGPoint p=[turtle convertTouchToNodeSpace:touch];
    return CGRectContainsPoint(r, p );
}
- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    //////GENERAL TOUCH SCREEN
    for (UITouch *touch in touches) {
        CGPoint touchLocation = [touch locationInView:[touch view]];
        touchLocation = [[CCDirector sharedDirector] convertToGL:touchLocation];
        [self toggleTurtle];
        /////
    }

}
-(void) toggleTurtle
{
    NSLog(@"playing walk animation2");
   [turtle playAnimation:@"walk_in" loop:NO wait:YES];
}



@end

// hello world.h

    #import "cocos2d.h"
    #import "CCTurtle.h"

    @interface HelloWorldLayer : CCLayer 
    {
    CCTurtle                *turtle;
    }

    +(CCScene *) scene;

    @end

// CCturtle

    #import <Foundation/Foundation.h>
    #import "FTCCharacter.h"

    @interface CCTurtle : FTCCharacter <FTCCharacterDelegate, CCTargetedTouchDelegate>
    {

    }
    @end

我正在使用Cocos2D cocos2d v1.0.1(已启用arch),并正在ipad 4.3模拟器上进行测试。 感谢Natalie

我试图将触摸直接放入ccturtle.m中,因此它可以使用CCTargetedTouchDelegate处理自己的触摸,但是使用

CCturtle ///我将文件更改为此尝试以不同方式查找触摸区域...

    - (CGRect)rect
   {
   CGSize s = [self.texture contentSize];
   return CGRectMake(-s.width / 2, -s.height / 2, s.width, s.height);
   }

   -(BOOL) didTouch: (UITouch*)touch {
   return CGRectContainsPoint(self.rect, [self convertTouchToNodeSpaceAR:touch]);
   //return CGRectContainsPoint( [self rect], [self convertTouchToNodeSpaceAR: touch] );
   }

   -(BOOL) ccTouchBegan:(UITouch*)touch withEvent: (UIEvent*)event {
   NSLog(@"attempting touch.");
   if([self didTouch: touch]) {
   return [self tsTouchBegan:touch withEvent: event];
   }
   return NO;
   }

但仍然无法编译仍然会返回错误“属性'是TouchEnabled'未找到对象类型'CCTurtle *'

我真的不确定我能做些什么才能让它立即运行...并且真的需要让它工作(我想我可以制作隐形按钮,但是能够正确找到ccturtle会更好了解我做错了什么......希望有人能帮忙

3 个答案:

答案 0 :(得分:1)

首先,我无法看到调用containsTouch:方法的任何地方。这里有几个建议:

使用boundingBox代替textureRect来获取节点的本地矩形(在本例中为乌龟)。或者只是将containsTouch:方法替换为您的乌龟类以填充此类。例如,如果您想让乌龟的触摸区域更大/更小,这可能会有所帮助。你只需要改变你的龟类中的一个小方法。

ccTouchesBegan:withEvent:方法中,只需检查每只乌龟是否被此触碰击中。然后,例如,您可以创建字典,将触摸作为键,将相应的乌龟数组作为值。然后你只需要在ccTouchesMoved:withEvent:方法中更新所有海龟位置以移动触摸,并从ccTouchesEnded:withEvent:和ccTouchCancelled:withEvent:方法中删除字典中的这些海龟数组。

答案 1 :(得分:0)

如果希望CCTurtle对象接受目标触摸,可以通过指定它符合CCTargetedTouchDelegate协议来实现。在你的CCTurtle @interface中,你声明它是这样的:

@interface CCTurtle : CCNode <CCTargetedTouchDelegate>

然后在实现中,告诉它接受触摸并实现ccTouch方法:

@implementation CCTurtle

-(id) init {
.
.
    [[CCDirector sharedDirector].touchDispatcher addTargetedDelegate:self priority:1 swallowsTouches:YES];
    return self;
}

-(void) onExit {
    [[CCDirector sharedDirector].touchDispatcher removeDelegate:self];
}

-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event { 
    CGPoint location = [[CCDirector sharedDirector] convertToGL:[touch locationInView:[touch view]]];
    if (CGRectContainsPoint([self boundingBox], location] {
        // some code here
    }
}


-(void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event { // code here }
-(void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event { // code here}
-(void)ccTouchCancelled:(UITouch *)touch withEvent:(UIEvent *)event { // code here}

答案 2 :(得分:0)

感谢Prototypical,问题解决了, 虽然CCTurtle是一个带有精灵类型的图层,但它是嵌套的精灵 这意味着cocos2d在为我创建正确的边界框时遇到了问题 “包含触摸方法”

所以有了一点魔力,他将“get full bounding box”方法与包含触摸方法相结合,以考虑精灵的子项,现在代码依赖于碰撞检测来处理触摸。 目前我很乐意为他回报一些漂亮的图标

但是想对所有有帮助的人表示感谢,并希望这个方法对于遇到同样问题的人来说非常方便!