2010-10-27 45 views
0

Je voudrais essayer de mettre en œuvre un glissement visuel pour un projet iPhone, comme dans certains jeux, comme Fruit Ninja. Lorsque vous faites glisser votre doigt sur l'écran, il laisse une trace qui disparaît après un certain temps. Je pense que vous pourriez avoir un nombre fixe de points dans la "chaîne" et que de nouveaux points sont ajoutés à l'avant, les anciens sont retirés de l'arrière. Je peux voir en utilisant -touchesMoved pour générer de nouveaux points et un NSMutableArray pour garder une trace des points. Je ne peux simplement pas imaginer quelle méthode j'utiliserais pour dessiner les segments. En ferais-je un CALayer et dessiner une ligne reliant les points actifs? Ou utilisez un autre objet de vue et joignez-les ensemble aux points ...Comment créer et dessiner un geste de glissement visuel

Des idées?

Répondre

0

Quelque chose comme ça fonctionnerait, si vous aviez rempli des 'points' avec des CGPoints. Avertissement: il s'agit d'un travail de coupure, de collage et d'édition rapide - il y aura probablement des erreurs. En outre, j'utilise stl :: vector pour 'points'. Vous voudrez peut-être utiliser une autre structure.

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGMutablePathRef dataPath = CGPathCreateMutable(); 
bool firstPoint = YES; 

for (int i=0; i < points.size(); ++i) 
    { 
    CGPoint point = points[i]; 
    if (firstPoint) 
     { 
     CGPathMoveToPoint(dataPath, NULL, point.x, point.y); 
     firstPoint = NO; 
     } 
    else 
     { 
     CGPathAddLineToPoint(dataPath, NULL, point.x, point.y); 
     } 
    } 

CGContextSetRGBStrokeColor(context, 1.0, 0.0, 0.0, 1.0); 
CGContextSetLineWidth(context, 5); 
CGContextBeginPath(context); 
CGContextAddPath(context, dataPath); 
CGContextDrawPath(context, kCGPathStroke); 

CGPathRelease(dataPath); 
+0

Cool! Donc est-ce dans la méthode '-drawRect' d'un' UIView? 'Aussi, je ne connais pas 'stl :: vector' - est-ce une sorte de structure? – Steve

+0

Oui, c'est vrai. Ce serait dans -drawRect :. Quant à stl :: vector <>, il fait partie de la bibliothèque de templates standard qui fait partie de C++. L'inclure dans Obj-C ajoute quelques problèmes supplémentaires en termes d'installation (en changeant principalement .m en .mm et en ajoutant quelques lignes #include), mais les avantages sont importants. Par exemple, stl :: vector <> vous donne des tableaux mutables, mais à un niveau inférieur et avec beaucoup moins de frais généraux que NSMutableArray - qui ne peut contenir que NSObjects. – westsider

+0

Merci, @westsider - Je ne l'ai pas encore fait, mais je suis en route. J'utilise le tableau C normal de 'CGPoints' dès maintenant. Le truc "stl" est trop loin de ma zone de confort à ce stade. Je pourrais essayer 'CFMutableArray' - je pense qu'il pourrait être en mesure de prendre' CGPoints, 'et est sans frais ponté' NSMutableArray.' – Steve