所有晚上, 我将在历史悠久的传统中开始这个问题,说我已经在SO和更广阔的世界上进行了很好的旧搜索,但我并没有完全理解这个...... 我已经实现了一个非常好用的偷偷摸摸的游戏棒(它让我的精灵很愉快地移动)但是我现在在考虑它的位置时做了一个恶作剧。 我想做的只是将它的位置改为触摸位置并让它移动我的精灵,但这似乎超出了我的知识库。我可能是个白痴,但我无法解决这个问题。
触摸事件已经在sneakyjoystick类中排序(可在github https://github.com/0xPr0xy/sneaky-joystick-cocos2d上获得)。目前,如果我在名为controlsLayer的类中的init方法中创建操纵杆,那么一切正常;操纵杆出现,它允许我移动到精灵周围
-(id) init
{
if( (self=[super init]) ) {
myJoystickBase = [[[SneakyJoystickSkinnedBase alloc] init] autorelease];
myJoystickBase.backgroundSprite = [CCSprite spriteWithFile:@"dpad.png"];
myJoystickBase.thumbSprite = [CCSprite spriteWithFile:@"joystick.png"];
myJoystickBase.joystick = [[SneakyJoystick alloc] initWithRect:CGRectMake(0, 0, 128, 128)];
myJoystickBase.position = ccp(64, 64);
myJoystickBase.backgroundSprite.opacity = 100;
myJoystickBase.thumbSprite.opacity = 100;
[self addChild:myJoystickBase];
myJoystick = [myJoystickBase.joystick retain];
[self scheduleUpdate];
}
return self;
}
首先,我想看看我如何能够简单地展示并隐藏自己并设置它的位置。为此,我创建了一个ccTouchesbegan方法,该方法包含与我以前的init方法完全相同的代码。这可以正常工作(操纵杆在我触摸的任何地方都显示在中心)但现在的问题是我无法与之交互。操纵杆出现在我想要的地方,但它不会识别我的动作(操纵杆上的操纵杆不会移动,这反过来意味着我的精灵也没有被告知要移动)
if( (self=[super init]) ) {
self.isTouchEnabled = YES;
[self scheduleUpdate];
}
return self;
}
-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *touch = [touches anyObject];
CGPoint location = [[CCDirector sharedDirector] convertToGL:[touch locationInView:[touch view]]];
location = [self convertToNodeSpace:location];
myJoystickBase = [[[SneakyJoystickSkinnedBase alloc] init] autorelease];
myJoystickBase.backgroundSprite = [CCSprite spriteWithFile:@"dpad.png"];
myJoystickBase.thumbSprite = [CCSprite spriteWithFile:@"joystick.png"];
myJoystickBase.joystick = [[SneakyJoystick alloc] initWithRect:CGRectMake(0, 0, 128, 128)];
myJoystickBase.position = location;
myJoystickBase.backgroundSprite.opacity = 100;
myJoystickBase.thumbSprite.opacity = 100;
[self addChild:myJoystickBase];
myJoystick = [myJoystickBase.joystick retain];
}
-(void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
[self removeChild:myJoystickBase cleanup:YES];
}
所以对于我不知情的大脑,这就是说当我触摸controlsLayer类时,它很乐意按照我的要求进行操作,但它不会将此触摸传递给其他类。
简而言之,触摸事件可以同时传递给多个类吗?偷偷摸摸的操纵杆类使用CCTargetedTouchDelegate,当它是唯一寻找触摸的东西时工作得很好。但是现在我已经添加了一个 - (void)ccTouchesBegan:在另一个类中它并不开心。
任何人都能告诉我问题是否与我处理触摸的方式有关,还是我在触摸方法中分配操纵杆的方式可能是个问题?我应该在init方法中分配操纵杆并在touchesBegan方法中做其他事情吗?试验和错误并没有让我在任何地方有用。感觉就像我正撞在砖墙上。如果有必要,我很乐意发布完整的类文件。这有意义吗?
答案 0 :(得分:0)
问题是您在触摸开始时创建操纵杆,并在触摸结束时将其移除。这不允许操纵杆接收触摸开始事件,因为事件在创建操纵杆时已经被处理。
由于不必要的保留,你也在泄漏操纵杆(请使用ARC!)。
尝试在init中创建操纵杆,禁用&隐藏它直到触摸开始接收事件。这也比在每次触摸时重新创建操纵杆更快。
此外,如果您启用了多个触摸,请记住,您最多可以接收5个触摸开始事件(5个手指),两者之间没有任何触摸。这会产生5个操纵杆,但只能移除一个!每一次!