2013-03-18 6 views
0

저녁 모두, 나는이 훌륭한 질문을 시간의 영광스러운 전통에서 시작하겠다. 그러나 나는이 주위에 내 머리를 꽤 얻지는 못한다 ... 나는 멋지게 작동하는 비열한 조이스틱을 구현했다. (그것은 내 스프라이트를 아주 행복하게 움직인다.) 그러나 나는 그것의 위치에 대해 생각하면서 장난을했다. 내가하고 싶은 것은 단순히 터치 위치로 위치를 변경하고 내 스프라이트를 움직이게하지만 이것은 내 지식 풀에서 벗어난 것 같습니다. 나는 멍청이일지도 모르지만 나는 그것을 해결할 수 없다.Cocos2d - 여러 클래스 (비열한 조이스틱)에서 사용할 수있는 터치 허용

터치 이벤트는 이미 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; 
} 

그래서 시작 스프라이트 이동할 수 있습니다. 이렇게하기 위해 이전에 사용한 init 메서드와 거의 동일한 코드가 포함 된 ccTouchesbegan 메서드를 만들었습니다. 이것은 한 지점까지 잘 작동합니다 (조이스틱은 내가 만진 곳 중앙에 나타납니다). 그러나 문제는 지금 내가 그것과 상호 작용할 수 없다는 것입니다. 내가 원하는 곳 조이스틱이 나타납니다하지만 내 미숙 한 뇌 그래서

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

터치가 시작되는 동안 조이스틱을 만들고 터치가 끝날 때 제거하는 것이 문제입니다. 조이스틱을 만들 때 이벤트가 이미 처리 중이므로 조이스틱이 터치 시작 이벤트를받을 수 없습니다.

불필요한 유지로 인해 조이스틱이 누출됩니다 (ARC를 사용하십시오.).

초기화에서 조이스틱을 만들어보십시오. 터치 시작 이벤트가 수신 될 때까지 &을 숨기십시오. 이것은 모든 터치에서 조이스틱을 재현하는 것보다 빠릅니다.

터치를 여러 번 사용하도록 설정 한 경우 터치가 끝나지 않고 최대 5 개의 터치 시작 이벤트 (5 개의 손가락)를 수신 할 수 있습니다. 그것은 5 개의 조이스틱을 만들지 만 하나만 제거하십시오! 매번!

+0

매우 당혹 스럽네요. 집에서 일하러 갈 때까지 10 분 안에 필요에 따라 이제는 모두 작동합니다. 조이스틱은 이제 init 메소드에서 초기화되고 터치 위치에서 100의 불투명도를 유지하면서 0의 불투명도가 부여됩니다. 터치가 끝나면 0의 불투명도로 사라집니다.비열한 조이스틱 수업에서 나는 터치하지 말고 조이스틱 위치를 만지고 있는지 확인하라. 그렇게하면 당신이 만지는 상관없이 반응합니다. 대단히 감사합니다. 나중에 멀티 터치 요소를 유지하려고하는데, 나중에 어느 시점에서 사용해야 할 것입니다. 다시 한 번 감사드립니다 Steffan – Whackdackery