Spostamento e rotazione di uno sprite con accelerometro in SpriteKit

Sto cercando di fare il mio primo gioco usando Spritekit, quindi ho uno sprite che ho bisogno di spostarmi usando il mio accelerometro. Bene, nessun problema a farlo; i movimenti sono davvero fluidi e reattivi, il problema è che quando provo a ruotare il mio sprite per farlo affrontare il suo stesso movimento spesso lo faccio "tremare" come se avesse il parkinson. (: D)

Mi sono reso conto che questo accade quando i dati dell'accelerometro sono troppo vicini a 0 su uno degli assi x, y.

Quindi la domanda: c'è una soluzione per il mio animale domestico parkinson ?? : D

Ecco un codice:

-(void) update:(NSTimeInterval)currentTime{ static CGPoint oldVelocity; //static CGFloat oldAngle; if(_lastUpdatedTime) { _dt = currentTime - _lastUpdatedTime; } else { _dt = 0; } _lastUpdatedTime = currentTime; CGFloat updatedAccelX = self.motionManager.accelerometerData.acceleration.y; CGFloat updatedAccelY = -self.motionManager.accelerometerData.acceleration.x+sinf(M_PI/4.0); CGFloat angle = vectorAngle(CGPointMake(updatedAccelX, updatedAccelY)); _velocity = cartesianFromPolarCoordinate(MAX_MOVE_PER_SEC, angle); if(oldVelocity.x != _velocity.x || oldVelocity.y != _velocity.y){ _sprite.physicsBody.velocity = CGVectorMake(0, 0); [_sprite.physicsBody applyImpulse:CGVectorMake(_velocity.x*_sprite.physicsBody.mass, _velocity.y*_sprite.physicsBody.mass)]; _sprite.zRotation = vectorAngle(_velocity); oldVelocity = _velocity; } } static inline CGFloat vectorAngle(CGPoint v){ return atan2f(vy, vx); } 

Ho provato a lanciare l'aggiornamento del vector _velocity solo quando updateAccelX o updatedAccelY sono, in valore assoluto> = di alcuni valori, ma il risultato è che ho ottenuto il movimento non liscio, quando si cambia direzione se il valore è compreso tra 0,1 e 0,2 e il problema non stava scomparendo quando il valore era inferiore a 0,1.

mi piacerebbe mantenere la direzione retriggers, ma vorrei anche aggiustare questo "shake" della rotazione dello sprite.

Mi dispiace per il mio pessimo inglese, e grazie in anticipo per qualsiasi consiglio.

Solutions Collecting From Web of "Spostamento e rotazione di uno sprite con accelerometro in SpriteKit"

Puoi provare un filter passa-basso (per isolare l'effetto di gravità) o un filter passa-alto (per isolare gli effetti dell'accelerazione dell'utente).

  #define filteringFactor 0.1 - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { //low pass accelerX = (acceleration.x * filteringFactor) + (accelerX * (1.0 - filteringFactor)); //idem … accelerY //idem … accelerZ //or high pass accelerX = acceleration.x - ( (acceleration.x * filteringFactor) + (accelerX * (1.0 - filteringFactor)) ); //idem … accelerY //idem … accelerZ }