Question

J'ai un bug collant que je ne peux pas à comprendre, et je pense qu'il a quelque chose à voir avec la façon dont touchesMoved est mis en œuvre.

touchesMoved, je vérifie pour voir où le contact est (instruction if) et en conséquence, appelez setNeedsDisplayWithRect sur 40 de 40 zone proche du point de contact. Qu'est-ce qui se passe dans drawRect est qu'une image noire est mise bas s'il y avait une image blanche auparavant, et vice versa. En même temps j'appelle setNeedsDisplayWithRect, je définir une variable booléenne dans un tableau de booléens, donc je peux garder une trace de ce que l'image actuelle est, et donc afficher le contraire. (En fait, je ne flippe pas toujours l'image ... Je regarde ce que le premier contact va faire, comme passer du noir au blanc, puis mettre des images blanches sur toutes les touches suivantes, donc il est un peu comme le dessin ou effacer les images).

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{
    UITouch *touch = [touches anyObject];
    CGPoint touchPoint = [touch locationInView:self];
    CGPoint lastTouchPoint = [touch previousLocationInView:self];

    touchX = touchPoint.x;
    touchY = touchPoint.y;

    int lastX = (int)floor((lastTouchPoint.x+0.001)/40);
    int lastY = (int)floor((lastTouchPoint.y+0.001)/40);
    int currentX  = (int)(floor((touchPoint.x+0.001)/40));
    int currentY  = (int)(floor((touchPoint.y+0.001)/40));

    if  ((abs((currentX-lastX)) >=1) || (abs((currentY-lastY)) >=1))
    {
        if ([soundArray buttonStateForRow:currentX column:currentY] == firstTouchColor){
            [soundArray setButtonState:!firstTouchColor row:(int)(floor((touchPoint.x+0.001)/40)) column:(int)(floor((touchPoint.y+0.001)/40))];

            [self setNeedsDisplayInRect:(CGRectMake((CGFloat)(floor((touchPoint.x+0.001)/40)*40), (CGFloat)(floor((touchPoint.y+0.001)/40)*40), (CGFloat)40.0, (CGFloat)40.0))];
        }
    }
}

Mon problème est que le tableau booléen semble être chamboulée avec les images que je suis en train de descendre. Cela ne se produit si je fais glisser très rapidement à travers l'écran. Finalement, le tableau booléen et les images ne sont plus synchronisés, même si je les mets en même temps. Toute idée de ce qui est à l'origine cela, ou ce que je peux faire pour y remédier?

Voici mon drawRect:

- (void)drawRect:(CGRect)rect {

    if ([soundArray buttonStateForRow:(int)(floor((touchX+0.001)/40)) column:(int)(floor((touchY+0.001)/40))])
        [whiteImage drawAtPoint:(CGPointMake((CGFloat)(floor((touchX+0.001)/40)*40), (CGFloat)(floor((touchY+0.001)/40))*40))]; 
    else
        [blackImage drawAtPoint:(CGPointMake((CGFloat)(floor((touchX+0.001)/40)*40), (CGFloat)(floor((touchY+0.001)/40))*40))]; 


}
Était-ce utile?

La solution

Je me suis dit la réponse à cette question. touchX et TOUCHY étaient variables d'instance, et ils ont été remis à zéro en obtiennent touchesMoved avant chaque appel à drawRect était complète. Par conséquent, si je me suis déplacé rapidement à l'écran, touchesMoved obtiendrait appelé, puis appelez drawRect, puis touchesMoved se serait appelé à nouveau avant drawRect avait utilisé touchX et chatouilleux, de sorte que le dessin ne se désynchroniser avec le back-end de tableau booléen.

pour résoudre ce problème, je me suis arrêté à l'aide touchX et chatouilleux à drawRect, et a commencé à dériver le même point en utilisant le rect sale qui était passé dans de touchesMoved.

Tada!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top