2014-04-17 1 views
2

J'utilise LibGDX pour créer une application de bureau/android. Dans une partie de mon application, je vérifie le capteur de lumière si c'est Android. Cela fonctionne bien pour Android, sauf quand je l'implémente dans mon projet LibGDX Je suis confus quant à la façon dont je peux transmettre ces données.Données de capteur de lumière LibGDX

SensorManager sm; 
Sensor s; 
float lux = 0; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
AndroidApplicationConfiguration cfg = new AndroidApplicationConfiguration(); 
sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
s = sm.getDefaultSensor(Sensor.TYPE_LIGHT); 
initialize(new MyLibGDXMain(), cfg); 
} 

@Override 
public void onSensorChanged(SensorEvent event) { 
lux = event.values[0]; 
} 

je peux récupérer mes données de capteur de lumière ici, mais une fois que je MyLibGDXMain je perds initialiser ces données. Si j'ajoute le SensorEventListener à cette classe, je perds la compatibilité avec la version de bureau. J'ai donc essayé de créer un autre constructeur pour que MyLibGDXMain transmette la valeur lux, mais cela ne casse que ce que fait l'application LibGDX. Cette question n'est pas comment récupérer des données de capteur sur Android mais plutôt Comment est-ce que j'irais obtenir ces données de capteur dans mon principal LibGDX sans casser la compatibilité avec le projet de bureau?

Répondre

3

Vous devez créer une interface entre votre application et le code spécifique à la plateforme ...

https://github.com/libgdx/libgdx/wiki/Interfacing-with-platform-specific-code

Une façon serait de créer une interface LightSensorInterface dans votre projet principal, contenant une méthode float getCurrentLux();

public interface LightSensorInterface { 
    public float getCurrentLux(); 
} 

Vous devrez alors créer une classe qui implémente cette interface dans votre projet Android et un dans votre projet de bureau aussi bien. Puisque vous n'avez pas de capteur de lumière sur votre application de bureau, la méthode implémentée ici pourrait juste retourner une valeur fixe.

et la mise en œuvre getCurrentLux() dans le projet Android doit retourner la valeur lux que vous avez la dernière fois onSensorChanged() a été appelé ...

Le constructeur de votre MyLibGDXMain() aura besoin d'une référence à un LightSensorInterface et quand initialiser votre application, vous passeriez la classe spécifique à la plateforme:

onCreate() { 
    .... 
    AndroidLightSensor sensor = new AndroidLightSensor(...); 
    initialize(new MyLibGDXMain(sensor); 
} 

Si vous voulez avoir toujours la valeur actuelle, vous devez chercher la valeur actuelle de votre boucle de rendu ... espérons que vous obtenez ce que je veux dire ...

Espérons que ça aide ..: :)

+0

Merci! Will certainement essayer cela bientôt et revenir à vous! Juste quelques questions rapides, et alors je reviendrai pour plus de vous dire si cela a fonctionné ou non. Il me dit d'enlever '@ Override' sur ma méthode' GetCurrentLux() '. Je ne sais pas si c'est quelque chose que j'ai fait mais ça me donne une erreur (ça marche bien si je supprime le override). Deuxièmement, devrais-je créer deux classes distinctes AndroidLightSensor avec le même nom dans mon dossier Android et Desktop? Ou devrais-je appeler le Desktop un DummyAndroidLightSensor? Quelle est la pratique standard pour cela? Je suis tellement contente que j'ai enfin une réelle utilité pour les interfaces. – CodeCamper

+0

Vous voulez également construire mon code de la bonne façon. Dois-je créer un onResume et une onPause séparément dans mon AndroidLightSensor et les transférer dans ma MainActivity? En ce moment j'ai fait un AndroidLightSensor onResume pour enregistrer l'écouteur et ensuite je le passe dans ma MainActivity. Je sais que tout cela est une préférence, mais je cherchais des conseils organisationnels. – CodeCamper

+0

Le "Supprimer @Override" semble étrange. Avez-vous oublié le "implémente LightSensorInterface?Habituellement, il dit seulement que lorsque dans la classe parent que cette classe hérite de ou dans les classes des interfaces, il n'y a pas une telle méthode ... Mais je suppose que si vous le supprimez et ça fonctionne toujours bien c'est ok ...;) Et à droite, vous mettriez le 'LightSensorInterface' dans votre projet principal quelque part. Et dans le projet Android, vous pouvez créer votre 'AndroidLightSensor' et dans votre projet Desktop créer une classe' DummyDesktopLightSensor' ou quoi que ce soit ... – evident

Questions connexes