首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cocos2d -允许多个类使用触摸(偷偷使用操纵杆)

Cocos2d -允许多个类使用触摸(偷偷使用操纵杆)
EN

Stack Overflow用户
提问于 2013-03-19 07:40:21
回答 1查看 810关注 0票数 0

大家晚上好,我将以这个由来已久的传统开始这个问题,首先我会说,我在SO和更广泛的世界上进行了一次很好的旧搜索,但我还没有完全理解这一点……我已经实现了一个sneakyJoystick,它工作得很好(它非常愉快地移动我的精灵),但是我现在在思考它的定位时却做了一个恶作剧。我想要做的是简单地将它的位置更改为触摸位置,并让它移动我的精灵,但这似乎超出了我的知识池。我可能是个笨蛋,但我做不到。

触摸事件已经在sneakyjoystick类中进行了排序(在github https://github.com/0xPr0xy/sneaky-joystick-cocos2d上可用)。目前,如果我在初始化方法期间在一个名为controlsLayer的类中创建了操纵杆,那么一切都会正常工作;操纵杆会出现,并允许我移动到子画面

代码语言:javascript
复制
-(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方法几乎相同。这在一定程度上工作得很好(无论我在哪里触摸,操纵杆都显示在中心位置),但现在的问题是我无法与其交互。操纵杆出现在我想要的地方,但它不会识别我的动作(操纵杆上的操纵杆没有移动,这反过来意味着我的精灵也没有被告知移动)

代码语言:javascript
复制
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,当它是唯一需要触摸的东西时,它工作得很好。但是,现在我已经添加了一个-(空)ccTouchesBegan:在另一个类中,它不是很好。

谁能告诉我是我处理触摸的方式有问题,还是我在触摸方法中分配操纵杆的方式有问题?我是否应该在init方法中分配操纵杆,并在touchesBegan方法中执行其他操作?试错目前对我没有任何用处。感觉我的头撞到了砖墙上。如果需要的话,我很乐意上传完整的类文件。这有意义吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-19 09:09:32

问题是你在触摸开始时创建了操纵杆,而在触摸结束时将其移除。这不允许操纵杆接收触摸开始事件,因为在创建操纵杆时该事件已经被处理。

由于不必要的保留,您还会泄漏操纵杆(请使用ARC!)。

尝试在init中创建操纵杆,禁用并隐藏它,直到收到触摸开始事件。这也比在每次触摸时重新创建操纵杆要快。

此外,如果您启用了多个触摸,请记住,您可以接收最多5个触摸开始事件(5个手指),而不会在两个触摸之间结束任何触摸。这将创建5个操纵杆,但只删除一个!每次都是这样!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15488988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档