2014-04-17 4 views
2

저는 LibGDX를 사용하여 데스크탑/안드로이드 응용 프로그램을 만들고 있습니다. 내 응용 프로그램의 일부에서는 그것이 안드로이드 있다면 빛의 센서를 확인입니다. 이것은 내 LibGDX 프로젝트에 구현할 때를 제외하고 안드로이드에서 잘 작동합니다.이 데이터를 어떻게 전달할 수 있는지 혼란 스럽습니다.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]; 
} 

여기에서 광 센서 데이터를 검색 할 수 있지만 일단 MyLibGDXMain을 초기화하면이 데이터가 손실됩니다. 해당 클래스에 SensorEventListener를 추가하면 데스크톱 버전과의 호환성이 없어집니다. 그래서 MyLibGDXMain이 lux 값을 넘겨 줄 다른 생성자를 만들려고했으나 LibGDX 응용 프로그램이 무엇을 하던지간에 중단됩니다.

이 질문은 안드로이드에서 센서 데이터를 검색하는 방법이 아니라 이 센서 데이터를 데스크톱 프로젝트와의 호환성을 손상시키지 않고 LibGDX 메인으로 가져 오는 방법은 무엇입니까?

당신은 당신의 응용 프로그램 및 플랫폼 별 코드 사이의 인터페이스를 만들어야합니다

답변

3

... 방법 float getCurrentLux();을 포함, 주요 프로젝트에 인터페이스 LightSensorInterface을 생성하는 것입니다

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

한 가지 방법

그런 다음 Android 프로젝트에서 인터페이스를 구현하는 클래스를 만들고 데스크톱 프로젝트에서도 인터페이스를 구현해야합니다.

public class AndroidLightSensor implements LightSensorInterface, SensorEventListener { 
    private float currentLux = 0; 

    @Override 
    public float getCurrentLux() { 
     return currentLux; 
    } 

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

바탕 화면 응용 프로그램에 광 센서가 없으므로 구현 된 방법은 일부 고정 값을 반환 할 수 있습니다.

그리고 안드로이드 프로젝트는 당신이 onSensorChanged()라는 마지막 시간을 가지고 럭스 값을 반환 할 필요에 구현 된 getCurrentLux() ...

당신의 MyLibGDXMain의 생성자()는 LightSensorInterface 때에 대한 참조가 필요합니다 귀하의 응용 프로그램을 초기화하는 것은, 당신이 플랫폼 특정 클래스에 합격 것 :

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

당신은 항상 현재의 값을 가지고 싶다면, 당신은 당신의 렌더링 루프 내에서 현재 값을 가져 오기 위해 필요를 ... 당신이 무슨 뜻인지 얻을 희망 ...

희망이 있습니다. : :)

+0

고마워요! 확실히 이것을 곧 시도하고 당신에게 돌아갈 것입니다! 몇 가지 간단한 질문을 한 다음, 작동하는지 아닌지에 대해 자세히 알려 드리겠습니다. 내'GetCurrentLux()'메소드에서'@ Override'를 제거하라고 알려줍니다. 그것은 내가 뭘했는지 모르겠지만 그것은 오류를 제공합니다 (내가 재정의를 제거하면 잘 작동하는 것). 두 번째로 Android 및 Desktop 폴더에 동일한 이름의 AndroidLightSensor라는 두 개의 별도 클래스를 만들어야합니까? 아니면 데스크탑이라고 불리는 DummyAndroidLightSensor를 사용해야합니까? 이것에 대한 표준 관행은 무엇입니까? 마침내 인터페이스를 실제로 사용하게 된 것을 기쁘게 생각합니다. – CodeCamper

+0

또한 올바른 방법으로 내 코드를 작성하려고합니다. 내 AndroidLightSensor에서 onResume 및 onPause를 별도로 만들고 MainActivity로 전달해야하나요? 바로 지금 AndroidLightSensor를 작성하여 리스너를 등록한 다음 MainActivity로 전달합니다. 나는 이것이 모든 선호라고 알고 있지만 약간의 조직적 조언을 원했습니다. – CodeCamper

+0

"Remove @Override"가 이상하게 보입니다. "LightSensorInterface를 구현 한 것을 잊었습니까?일반적으로 부모 클래스에서이 클래스가 인터페이스의 클래스에서 상속 받거나 클래스의 클래스에서 상속 될 경우 해당 메소드가 없다고 말하면서 만 ... 그러나 제거하면 괜찮습니다.);) 그리고 오른쪽에있는 'LightSensorInterface'를 주 프로젝트의 어딘가에 넣으십시오. 그리고 안드로이드 프로젝트 내에서 당신은'AndroidLightSensor'를 만들 수 있고 데스크톱 프로젝트에서'DummyDesktopLightSensor' 클래스를 생성 할 수 있습니다. – evident

관련 문제