Advertisement
julong

GestureRecognizer

Mar 9th, 2014
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Example initialization:
  2.  
  3. CCGestureRecognizer* recognizer = [CCGestureRecognizer CCRecognizerWithRecognizerTargetAction:[[[UIRotationGestureRecognizer alloc]init] autorelease] target:self action:@selector(rotate:node:)];
  4.  
  5. Example usage:
  6.  
  7. - (void) rotate:(UIGestureRecognizer*)recognizer node:(CCNode*)node
  8. {
  9. UIRotationGestureRecognizer* rotate = (UIRotationGestureRecognizer*)recognizer;
  10. float r = node.rotation;
  11. node.rotation += CC_RADIANS_TO_DEGREES(rotate.rotation) -r;
  12. }
  13.  
  14. CCGestureRecognizer.h
  15.  
  16. #ifndef __CCGestureRecognizer_H__
  17. #define __CCGestureRecognizer_H__
  18.  
  19. #import "ccTypes.h"
  20. #import "CCNode.h"
  21. #import <UIKit/UIKit.h>
  22.  
  23. @class CCNode;
  24.  
  25. @interface CCGestureRecognizer : NSObject <UIGestureRecognizerDelegate>
  26. {
  27. UIGestureRecognizer* m_gestureRecognizer;
  28. CCNode* m_node;
  29.  
  30. id<UIGestureRecognizerDelegate> m_delegate;
  31.  
  32. id m_target;
  33. SEL m_callback;
  34. }
  35.  
  36. @property(nonatomic,readonly) UIGestureRecognizer* gestureRecognizer;
  37. @property(nonatomic,assign) CCNode* node;
  38. @property(nonatomic,assign) id<UIGestureRecognizerDelegate> delegate;
  39. @property(nonatomic,assign) id target;
  40. @property(nonatomic,assign) SEL callback;
  41.  
  42. - (id) initWithRecognizerTargetAction:(UIGestureRecognizer*)gestureRecognizer target:(id)target action:(SEL)action;
  43. + (id) CCRecognizerWithRecognizerTargetAction:(UIGestureRecognizer*)gestureRecognizer target:(id)target action:(SEL)action;
  44.  
  45. - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;
  46. - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
  47. - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;
  48.  
  49. // this is the function the gesture recognizer will callback and we will add our CCNode onto it
  50. - (void) callback:(UIGestureRecognizer*)recognizer;
  51. @end
  52.  
  53. #endif  // end of __CCGestureRecognizer_H__
  54.  
  55. CCGestureRecognizer.m
  56. #import "CCGestureRecognizer.h"
  57. #import "CCDirector.h"
  58. #import "ccMacros.h"
  59. #import "CGPointExtension.h"
  60.  
  61. @implementation CCGestureRecognizer
  62.  
  63. -(void)dealloc
  64. {
  65. [m_delegate release];
  66. [super dealloc];
  67. }
  68.  
  69. - (UIGestureRecognizer*)gestureRecognizer
  70. {
  71. return m_gestureRecognizer;
  72. }
  73.  
  74. - (CCNode*)node
  75. {
  76. return m_node;
  77. }
  78.  
  79. - (void)setNode:(CCNode*)node
  80. {
  81. // we can't retain the node, otherwise a node will never get destroyed since it contains a
  82. // ref to this.  if node gets unrefed it will destroy this so all should be good
  83. m_node = node;
  84. }
  85.  
  86. - (id<UIGestureRecognizerDelegate>)delegate
  87. {
  88. return m_delegate;
  89. }
  90.  
  91. - (void) setDelegate:(id<UIGestureRecognizerDelegate>)delegate
  92. {
  93. [m_delegate release];
  94. m_delegate = delegate;
  95. [m_delegate retain];
  96. }
  97.  
  98. - (id)target
  99. {
  100. return m_target;
  101. }
  102.  
  103. - (void)setTarget:(id)target
  104. {
  105. [m_target release];
  106. m_target = target;
  107. [m_target retain];
  108. }
  109.  
  110. - (SEL)callback
  111. {
  112. return m_callback;
  113. }
  114.  
  115. - (void)setCallback:(SEL)callback
  116. {
  117. m_callback = callback;
  118. }
  119.  
  120. - (id)initWithRecognizerTargetAction:(UIGestureRecognizer*)gestureRecognizer target:(id)target action:(SEL)action
  121. {
  122. if( (self=[super init]) )
  123. {
  124. m_gestureRecognizer = gestureRecognizer;
  125. [m_gestureRecognizer retain];
  126. [m_gestureRecognizer addTarget:self action:@selector(callback:)];
  127.  
  128. // setup our new delegate
  129. m_delegate = m_gestureRecognizer.delegate;
  130. m_gestureRecognizer.delegate = self;
  131.  
  132. m_target = target;
  133. [m_target retain];
  134. m_callback = action;
  135. }
  136. return self;
  137. }
  138.  
  139. + (id)CCRecognizerWithRecognizerTargetAction:(UIGestureRecognizer*)gestureRecognizer target:(id)target action:(SEL)action
  140. {
  141. [[[self alloc] initWithRecognizerTargetAction:gestureRecognizer target:target action:action] autorelease];
  142. }
  143.  
  144. - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
  145. {
  146. CGPoint pt = CCDirector sharedDirector] convertToGL:[touch locationInView: [touch view];
  147.  
  148. BOOL rslt = [m_node isPointInArea:pt];
  149.  
  150. if( rslt )
  151. {
  152. // still ok, now check children of parents after this node
  153. CCNode* node = m_node;
  154. CCNode* parent = m_node.parent;
  155. while( node != nil && rslt)
  156. {
  157. CCNode* child;
  158. BOOL nodeFound = NO;
  159. CCARRAY_FOREACH(parent.children, child)
  160. {
  161. if( !nodeFound )
  162. {
  163. if( !nodeFound && node == child )
  164. nodeFound = YES;  // we need to keep track of until we hit our node, any past it have a higher z value
  165. continue;
  166. }
  167.  
  168. if( [child isNodeInTreeTouched:pt] )
  169. {
  170. rslt = NO;
  171. break;
  172. }
  173. }
  174.  
  175. node = parent;
  176. parent = node.parent;
  177. }
  178. }
  179.  
  180. if( rslt && m_delegate )
  181. rslt = [m_delegate gestureRecognizer:gestureRecognizer shouldReceiveTouch:touch];
  182.  
  183. return rslt;
  184. }
  185.  
  186. - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
  187. {
  188. if( !m_delegate )
  189. return YES;
  190. return [m_delegate gestureRecognizer:gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:otherGestureRecognizer];
  191. }
  192.  
  193. - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
  194. {
  195. if( !m_delegate )
  196. return YES;
  197. return [m_delegate gestureRecognizerShouldBegin:gestureRecognizer];
  198. }
  199.  
  200. - (void)callback:(UIGestureRecognizer*)recognizer
  201. {
  202. if( m_target )
  203. [m_target performSelector:m_callback withObject:recognizer withObject:m_node];
  204. }
  205. @end
  206.  
  207. ////////////
  208. CCNode
  209. -(BOOL) isPointInArea:(CGPoint)pt
  210. {
  211. if( !visible_ )
  212. return NO;
  213.  
  214. /*  convert the point to the nodes local coordinate system to make it
  215. easier to compare against the area the node occupies*/
  216. pt = [self convertToNodeSpace:pt];
  217.  
  218. // we have to take the anchor point into account for checking
  219. CGRect rect;
  220. /*  we should be able to use touchableArea here, even if a node doesn't set
  221. this, it will return the contentArea.  */
  222. rect.size = self.touchableArea;
  223. CGPoint anchor = anchorPoint_;
  224.  
  225. // we pretty much need to undo the anchor to get our rect to start at the lower left
  226. anchor.x = 0.5f - anchor.x;
  227. anchor.y = 0.5f - anchor.y;
  228.  
  229. rect.origin = CGPointMake( -(rect.size.width*anchor.x), -(rect.size.height*anchor.y) );
  230.  
  231. if( CGRectContainsPoint(rect,pt) )
  232. return YES;
  233. return NO;
  234. }
  235.  
  236. -(BOOL) isNodeInTreeTouched:(CGPoint)pt
  237. {
  238. if( [self isPointInArea:pt] )
  239. return YES;
  240.  
  241. BOOL rslt = NO;
  242. CCNode* child;
  243. CCARRAY_FOREACH(children_, child )
  244. {
  245. if( [child isNodeInTreeTouched:pt] )
  246. {
  247. rslt = YES;
  248. break;
  249. }
  250. }
  251. return rslt;
  252. }
  253.  
  254. -(CGSize) touchableArea
  255. {
  256. // we use content size if touchable area is 0
  257. if( touchableArea_.width != 0.0f &&
  258. touchableArea_.height != 0.0f )
  259. return touchableArea_;
  260. else
  261. return contentSize_;
  262. }
  263.  
  264. -(void) setTouchableArea:(CGSize)area
  265. {
  266. touchableArea_ = area;
  267. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement