After my comment, I wanted to create a simple implementation for myself, so here is just a full joystick in full screen mode, which will determine the cardinal directions based on touching relative to the center of the screen.
(FullScreenJoystick)
I am still using cocos2d-iphone 1.1, so .. I'm not sure if there are any mods needed for v2
FSJoy.h
FSJoy.m
#import "FSJoy.h" @implementation FSJoy @synthesize origin, angleCurrent, isActive; -(id) init { if( (self = [super init]) ) { self.isTouchEnabled = YES; CGSize screenSize = [[CCDirector sharedDirector] winSize]; angleCurrent = 0.0f; origin = ccp(screenSize.width / 2.0f, screenSize.height / 2.0f); isActive = NO; } return self; } -(void) registerWithTouchDispatcher { [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:(INT_MIN - 4) swallowsTouches:YES]; } -(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event { CGPoint touchCurrent = [touch locationInView:[touch view]]; touchCurrent = [[CCDirector sharedDirector] convertToGL:touchCurrent]; angleCurrent = [self determineAngleFromPoint:origin toPoint:touchCurrent]; [self determineDirectionFromAngle: angleCurrent]; isActive = YES; return YES; // full screen controller, so always return YES } -(void) ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event { CGPoint touchCurrent = [touch locationInView:[touch view]]; touchCurrent = [[CCDirector sharedDirector] convertToGL:touchCurrent]; angleCurrent = [self determineAngleFromPoint:origin toPoint:touchCurrent]; [self determineDirectionFromAngle: angleCurrent]; } -(void) ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event { isActive = NO; } -(void) ccTouchCancelled:(UITouch *)touch withEvent:(UIEvent *)event { [self ccTouchEnded:touch withEvent:event]; } -(float) determineAngleFromPoint:(CGPoint)from toPoint:(CGPoint)to { float angle = ccpToAngle(ccpSub(to, from)); if (angle <= 0.0f) { angle += M_PI * 2.0f; } angle = CC_RADIANS_TO_DEGREES(angle); // NSLog(@"angle is %f", angle); return angle; } -(ULDR) determineDirectionFromAngle:(float) angle { ULDR dir = DIR_NONE; dir = ((angle >= UR) && (angle <= UL)) ? DIR_UP : dir; dir = ((angle >= DL) && (angle <= DR)) ? DIR_DOWN : dir; dir = ((angle > UL) && (angle < DL)) ? DIR_LEFT : dir; dir = ((angle > DR) || (angle < UR)) ? DIR_RIGHT : dir; NSLog(@"direction is %d", dir); return dir; } @end
Usage - just add a joystick to the scene / layer:
FSJoyTest.h
#import "cocos2d.h" @interface FSJoyTest : CCLayer @end
FSJoyTest.m
#import "FSJoyTest.h" #import "FSJoy.h" @implementation FSJoyTest -(id) init { if( (self=[super init]) ) { [self addChild: [FSJoy node]]; } return self; } @end
source share