Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [Objective-C] Problema con position del mouse

    Ciao a tutti, ho un problema con il settaggio della posizione del mouse. Nello specifico sto creando un'applicazione client/server attraverso Bonjour per comandare il mouse del Mac attraverso l'iPhone.
    Ora, con le connessioni sono ok, il tutto funziona alla perfezione, riesco ad effettuare la connessione e a scambiare dati tra i 2 ma sto sbagliando qualcosa nella funzione per muovere il mouse attraverso il touchpad dell'iPhone.
    Ho pensato di rilevare la distanza tra i punti del touchpad dell'iPhone e passarla al server installato sul Mac, in modo da sommarla alla posizione del mouse sullo schermo... Sto sbagliando sicuramente l'algoritmo, in quanto sfarfalla proprio . Vi posto qualche porzione di codice, grazie per l'aiuto!

    iPhone (locationBegan è la posizione dell'event touchesBegan, _connect si riferisce alla classe che comunica col socket)
    codice:
    - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
    {
        CGPoint location = [[touches anyObject] locationInView:nil];
        CGFloat locationX = (location.x - locationBegan.x);
        CGFloat locationY = (location.y - locationBegan.y);
        CGPoint distance = CGPointMake(locationX, locationY);
        [_connect mouseReceived:&distance];
    }
    OS X
    codice:
    - (void)socket:(GCDAsyncSocket *)aSocket didReadData:(NSData *)data withTag:(long)tag
    {
        [aSocket readDataWithTimeout:-1.0 tag:0];
        CGPoint dataReaded = *(CGPoint*)[data bytes];
        CGPoint mouseLoc = [NSEvent mouseLocation];
        CGPoint newPosition = CGPointMake((mouseLoc.x+dataReaded.x), (mouseLoc.y+dataReaded.y));
        CGWarpMouseCursorPosition(newPosition);
        CGAssociateMouseAndMouseCursorPosition(true);
    }

  2. #2
    Una volta ho avuto un problema molto simile, ed invece di cercare la perfetta corrispondenza ho usato un brutale metodo empirico.
    Hai provato ad usare una frazione di distance?
    Magari facendo dei test riesci a trovare una costante che ti sistema tutto. Sulla _connect passa distance/2 o distance/100, poi per trovare velocemente un valore che vada bene puoi usare un metodo di bisezione
    (esempio: se con distance/100 non si muove e con distance si muove troppo provi con distance/50, se con questo si muove troppo provi con 75, altrimenti la soluzione è evidentemente fra 1 e 50, e provi con 25. In genere con un metodo simile bastano 4-5 iterazioni)
    Fammi sapere

  3. #3
    Ciao, scusa se ti rispondo solo ora ma non ho avuto modo di provare questi giorni... comunque ho seguito il tuo consiglio ma continua a non funzionare come dovrebbe, muovendo nell'area touch dal basso verso l'altro, il mouse si sposta sul piano orizzontale saltando tra 2 punti verticali di continuo, non so se mi son spiegato bene! possibile che debba tenere in considerazione le diverse risoluzioni 960x480 dell'iPhone contro la 1440x960 del pc?

  4. #4
    Ok il problema vero e proprio sta nel receiver... i parametri CGPoint li ho inseriti in un NSData e inviati tramite socket al server, il quale riceve l'NSData e lo riconverte in CGPoint. Il fatto è che i valori sono totalmente sfasati!Dipende forse dal socket?
    codice:
    -(void)mouseReceived:(CGPoint *) location
    {
        NSData *myData = [NSData dataWithBytes:location length:sizeof(CGPoint)];
        [self.socket writeData:myData withTimeout:-1.0 tag:0];
    
        CGPoint dataReaded = *(CGPoint*)[myData bytes];
        NSLog(@"%@", NSStringFromCGPoint(dataReaded));
    }
    Qua nel client i valori vengono letti in maniera corretta, se la stessa funzione la applico nel server, i valori sono però sfasati...
    codice:
    - (void)socket:(GCDAsyncSocket *)socket didAcceptNewSocket:(GCDAsyncSocket *)newSocket
    {
        NSLog(@"Socket accettato da %@:%hu", [newSocket connectedHost], [newSocket connectedPort]);
        [self setSocket:newSocket];
        [newSocket writeData:myData withTimeout:-1.0 tag:0];
        NSString *message = @"Connessione effetuata correttamente.";
        [self sendPacket:message];
    }
    Questo metodo richiama il didReadData
    codice:
    - (void)socket:(GCDAsyncSocket *)aSocket didReadData:(NSData *)data withTag:(long)tag
    {
        [aSocket readDataWithTimeout:-1.0 tag:0];
        CGPoint dataReaded = *(CGPoint*)[data bytes];
        NSPoint value = NSPointFromCGPoint(dataReaded);
        NSLog(@"%@", NSStringFromPoint(value));
        CGWarpMouseCursorPosition(value);
        CGAssociateMouseAndMouseCursorPosition(true);
    }
    Il server in output legge il CGPoint così come segue, e non sono assolutamente degli NSPoint
    codice:
    2014-01-09 21:49:25.650 Bonjour OS X Server[30760:303] {2.1398226099252536e+21, 0}
    2014-01-09 21:49:25.667 Bonjour OS X Server[30760:303] {2.1213758657549073e+21, 0}
    2014-01-09 21:49:25.684 Bonjour OS X Server[30760:303] {2.1213758656969253e+21, 0}
    2014-01-09 21:49:25.701 Bonjour OS X Server[30760:303] {2.1213758656582705e+21, 0}
    2014-01-09 21:49:25.718 Bonjour OS X Server[30760:303] {2.1213758656196158e+21, 0}
    2014-01-09 21:49:25.796 Bonjour OS X Server[30760:303] {2.1029291215459063e+21, 0}
    Mentre il client legge correttamente
    codice:
    2014-01-09 21:49:25.650 Bonjour iOS Client[30647:70b] {315, 884}
    2014-01-09 21:49:25.667 Bonjour iOS Client[30647:70b] {303.75, 883}
    2014-01-09 21:49:25.684 Bonjour iOS Client[30647:70b] {297, 883}
    2014-01-09 21:49:25.701 Bonjour iOS Client[30647:70b] {292.5, 883}
    2014-01-09 21:49:25.718 Bonjour iOS Client[30647:70b] {288, 883}
    2014-01-09 21:49:25.796 Bonjour iOS Client[30647:70b] {288, 882}
    Qualche idea sul perchè si comporti così?

  5. #5
    Ok scusa ma mi tiro fuori :-) a questo punto si entra troppo nello specifico di un linguaggio di programmazione del quale ho solo letto una breve guida, e per il quale non ho i mezzi per fare test.
    Spero che passi qualcuno in grado di aiutarti.

    Credo comunque sia importante notare che per il server il valore di y (del punto) è sempre lo stesso (0)... Se dovessi fare un debug, partirei da qui: dal capire esattamente quel valore da dove venga, e poi capire perchè sia costante rispetto all'input
    Ultima modifica di MegaAlchimista; 10-01-2014 a 01:35

  6. #6
    Grazie ugualmente per l'aiuto

  7. #7
    Per curiosità comunque.... Hai provato a moltiplicare sul server, la x del punto per (315/2.1398226099252536e+21) ?

  8. #8
    No ma perchè per 315/point? Comunque ho sempre la point.y a 0 nel server, c'è come una perdita di dati quando invia tramite socket

  9. #9
    Lo dico perchè è evidente che per come vanno le cose adesso 2.1eccetera*e21 corrisponde a 315. Quindi magari normalizzando tutti i valori su questo rapporto ottieni quello che vuoi (ovvero: se sei fortunato questa trasformazione indesiderata è lineare, quindi puoi fregartente del motivo).
    Se non fosse lineare allora questo metodo non andrebbe bene e dovrài sbatterci la testa... Ma tanto vale provare

  10. #10
    Sono riuscito a risolvere convertendo il CGPoint in NSString e riconvertendolo in seguito nel server... ora finalmente funziona!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.