用于iPhone和触摸检测的cocos2D问题

时间:2008-12-18 13:08:50

标签: iphone cocos2d-iphone touch detection

我只是不明白。 我使用cocos2d开发iPhone / Pod上的小游戏。框架很棒,但我在触摸检测时失败了。我读到你只需要在CocosNode子类的实现中覆盖正确的函数(例如“touchesBegan”)。但它不起作用。我能做错什么?

功能:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{NSLog(@"tickle, hihi!");}

我完全错了吗?

谢谢!

7 个答案:

答案 0 :(得分:11)

Layer是唯一可以触及的cocos2d类。

诀窍是所有Layer的实例都会一个接一个地传递触摸事件,所以你的代码必须处理这个。

我是这样做的:

-(BOOL)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInView: [touch view]];
CGPoint cLoc = [[Director sharedDirector] convertCoordinate: location];

float labelX = self.position.x - HALF_WIDTH;
float labelY = self.position.y - HALF_WIDTH;
float labelXWidth = labelX + WIDTH;
float labelYHeight = labelY + WIDTH;

if( labelX < cLoc.x &&
    labelY < cLoc.y &&
    labelXWidth > cLoc.x &&
    labelYHeight > cLoc.y){
        NSLog(@"WE ARE TOUCHED AND I AM A %@", self.labelString);
        return kEventHandled;
    } else {
        return kEventIgnored;
    }

}

请注意,cocos2d库具有“ccTouchesEnded”实现,而不是Apple标准。它允许您返回一个BOOL,指示您是否处理了该事件。

祝你好运!

答案 1 :(得分:5)

您是否已将此添加到图层初始化方法?

    // isTouchEnabled is an property of Layer (the super class).
    // When it is YES, then the touches will be enabled
    self.isTouchEnabled = YES;

    // isAccelerometerEnabled is property of Layer (the super class).
    // When it is YES, then the accelerometer will be enabled
    self.isAccelerometerEnabled = YES;

答案 2 :(得分:3)

为了检测触摸,你需要从UIResponder(UIView也这样做)中继承子类。我不熟悉cocos2D,但快速浏览一下文档就会发现CocosNode并非来自UIResponder。

经过进一步调查,看起来Cocos人员创建了一个派生自CocosNode的Layer类。该类实现了触摸事件处理程序。但那些以cc为前缀。

请参阅http://code.google.com/p/cocos2d-iphone/source/browse/trunk/cocos2d/Layer.h

另请参阅menu.m代码和以下博文文章,了解有关此内容的更多信息:

http://blog.sapusmedia.com/2008/12/cocos2d-propagating-touch-events.html

答案 3 :(得分:3)

maw,CGPoint结构成员x,y是浮点数。使用@“% f ”格式化printf / NSLog的浮点数。

答案 4 :(得分:3)

如果使用0.9 beta的cocos2D,它对CocosNodes有一个非常简单的触摸检测。这种新检测的真正之处在于它可以很好地处理多个触摸跟踪。

这方面的一个例子可以在这里找到

http://code.google.com/p/cocos2d-iphone/source/browse/#svn/trunk/tests/TouchesTest

答案 5 :(得分:1)

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

        //Add a new body/atlas sprite at the touched location
        CGPoint tapPosition;
        for( UITouch *touch in touches ) {
            CGPoint location = [touch locationInView: [touch view]];

            tapPosition = [self convertToNodeSpace:[[CCDirector sharedDirector] convertToGL:location]];     // get the tapped position





    }
}

认为这可以帮助你......

答案 6 :(得分:0)

- 让你的场景符合协议CCTargetedTouchDelegate - 将此行添加到场景的init

[[[CCDirector sharedDirector] touchDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:NO];

- 实现这些功能:

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
 {
   return  YES;
 }
 -(void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event
  {
    //here touch is ended
  }