Cocos2D Multi-Touch и CCMotionStreak
Я пытаюсь использовать мультитач в своем приложении.... но я должен отображать полосу, когда палец движется по экрану... но я вижу только одну полосу, а не две! Как я могу создавать и перемещать 2 полосы вместе?
Вот мой код:
-(void)touchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
NSSet *allTouches = [event allTouches];
for (int n=0; n < [allTouches count]; n++)
{
UITouch *touch = [[allTouches allObjects] objectAtIndex:n];
CGPoint touchLoc = [touch locationInNode:self];
streak = [CCMotionStreak streakWithFade:0.3 minSeg:20 width:13 color:[CCColor colorWithUIColor:[UIColor whiteColor]] textureFilename:@"scia.png"];
[streak setPosition:touchLoc];
[self addChild:streak z:30];
}
}
-(void)touchMoved:(UITouch *)touch withEvent:(UIEvent *)event
{
NSSet *allTouches = [event allTouches];
for (int n=0; n < [allTouches count]; n++)
{
UITouch *touch = [[allTouches allObjects] objectAtIndex:n];
CGPoint touchLoc = [touch locationInNode:self];
[streak setPosition:touchLoc];
[self detectObjects:touchLoc];
}
}
1 ответ
Для мультитача внутри CCLayer вы можете использовать мультитач с помощью функции CCStandardTouchDelegate. встроить cocos2d, если вы ищете эффект Fruit Ninja Blade.. используйте CCBlade
вместо CCMotionStreak
https://github.com/hiepnd/CCBlade
/// .h File
CFMutableDictionaryRef map;
// .m File
void releaseStreak(CFAllocatorRef allocator, const void *value)
{
[(CCMotionStreak*)value removeFromParentAndCleanup:YES];
}
CFDictionaryValueCallBacks valueCallbacks = {
0,
NULL,
releaseStreak,
NULL,
NULL
};
-(id) init
{
if( (self=[super init])) {
isTouchEnabled_ = 1;
[[[CCDirector sharedDirector] openGLView] setMultipleTouchEnabled:YES];
map = CFDictionaryCreateMutable(NULL,0,NULL,&valueCallbacks);
}
}
- (void) ccTouchesBegan:(NSSet *) touches withEvent:(UIEvent *) event
{
for (UITouch *touch in touches) {
CCMotionStreak *streak = [CCMotionStreak streakWithFade:0.3 minSeg:20 width:13 color:[CCColor colorWithUIColor:[UIColor whiteColor]] textureFilename:@"scia.png"];
CFDictionaryAddValue(map,touch,streak);
CGPoint pos = [touch locationInView:touch.view];
pos = [[CCDirector sharedDirector] convertToGL:pos];
[streak setPosition: pos];
[self addChild:streak z:30];
}
}
- (void) ccTouchesMoved:(NSSet *) touches withEvent:(UIEvent *) event{
{
for (UITouch *touch in touches) {
CGPoint pos = [touch locationInView:touch.view];
pos = [[CCDirector sharedDirector] convertToGL:pos];
CCMotionStreak *_streak = (CCMotionStreak *)CFDictionaryGetValue(map, touch);
[streak setPosition:pos];
[self detectObjects:pos];
}
}
- (void) ccTouchesEnded:(NSSet *) touches withEvent:(UIEvent *) event{
for (UITouch *touch in touches) {
CCMotionStreak *_streak = (CCMotionStreak *)CFDictionaryGetValue(map, touch);
CFDictionaryRemoveValue(map,touch);
//i already added removeFromParent above no need to add release code.
}
}
дайте мне знать, если приведенный выше код работает для вас.