self.isTouchEnabled = YES; 在init方法中。
-(void) ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInView:[touch view]];
location = [[CCDirector sharedDirector] convertToGL:location];
}
-(void) ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event
{
CGPoint location = [touch locationInView:[touch view]];
location = [[CCDirector sharedDirector] convertToGL:location];
}
在上面的代码ccTouchesMoved工作正常,但ccTouchMoved不调用.. 有什么帮助吗?!
答案 0 :(得分:3)
Cocos2d支持两种处理触摸事件的方式。它们由两种不同类型的委托定义(均在CCTouchDelegateProtocol.h中定义)。
标准触摸代表: @optional
- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)ccTouchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;
这些是您在标准CocoaTouch应用程序中获得的相同类型的事件。你会得到所有的事件和所有接触;您可以在多点触控环境中理清您关心的内容。要在CCLayer子类中获取这些事件,您只需设置isTouchEnabled = YES,如下所示:
self.isTouchEnabled = YES;
有针对性的触摸代表
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event;
@optional
- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event;
- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event;
- (void)ccTouchCancelled:(UITouch *)touch withEvent:(UIEvent *)event;
注意目标触摸委托和标准触摸委托之间的两个重要差异:
这些方法只提供一次触摸,而不是一组触摸 - 因此,方法名称以“ccTouch”开头,而不是“ccTouches”。
ccTouchBegan方法是必需的,并返回一个布尔值。
因此,对于每个可用的触摸,将单独调用ccTouchBegan,并返回YES表示您关心的触摸。 ccTouchBegan声明的触摸随后将传递给Moved,Ended和Cancelled事件(所有这些都是可选的)。
要接收这些事件,您必须使用全局调度程序注册为目标触摸代理。在CCLayer子类中,重写registerWithTouchDispatcher,如下所示:
- (void)registerWithTouchDispatcher {
[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];
}
(这意味着在文件顶部导入“CCTouchDispatcher.h”)。
使用哪种?
除了更复杂的注册外,目标触摸代理通常更容易使用,因为您不必自己拆分NSSet,而且您不必继续检查是否事件是您在Moved / Ended / Cancelled事件中想要的事件。 但如果您想在一种方法中处理多个触摸(例如,因为您将它们组合成缩放或旋转输入),您可能希望使用标准触摸委托。 请注意,您只能使用其中一种。
答案 1 :(得分:0)
有两种行为:一种用于标准触摸,一种用于多次触摸。您不必addTargetedDelegate:::
,只需将touchMode
属性设置为您喜欢的值即可。 CCLayer
会为您处理注册。
- (void)onEnter
{
[self setTouchMode: kCCTouchesAllAtOnce]; //resp kCCTouchesOneByOne
}
在幕后,更改touchMode
将禁用然后重新启用触摸,启用触摸(enableTouch
)将通过调用addStandardDelegate
为您注册正确的代理或addTargetedDelegate
。