2014-01-25 5 views
2

온라인에서 둘러보고 다음에 대한 유효한 답변을 찾을 수 없습니다. 안드로이드에서 SurfaceView와 Thread를 사용하여 게임 루프를 돕는 경우, 일반적으로 onDraw 호출은 영구적으로 실행됩니다. 게임을 렌더링하는 데는 문제가 없지만 게임 논리가 조건 (게임 오버, 마우스 이벤트 등)을 확인하는 루프에 있기 때문에 한 번만 실행해야하는 코드가 있다면 어떻게해야할까요?Android Game Loop Logic Confusion

내가 이것이 불분명하다고 생각하기 때문에, 예를 들어 보겠습니다.

나는 여러 주에서 게임을하고 있습니다. 상태가 title로 설정되면, 게임 루프는 titleScreenRendering() 메소드를 수행하는데, 0에서 1 사이의 알파벳이 희미 해지는 이미지가 있습니다. 스플래시 화면과 같은 것입니다. 이 호출은 게임 루프에 있기 때문에 "titleScreenRendering"은 9999999 번 호출되기 때문에 이미지 페이딩 로직이 작동하지 않으며 분명히 작동하지 않습니다.

해킹처럼 느껴지는 한 가지 방법은 게임 루프가 메서드를 처음 실행할 때 부울을 만들고 false로 설정하는 것입니다. 따라서 코드 999999에서 적어도 코드의 일부만 호출하면됩니다. 더 이상 실행되지 않습니다.

내가 뭘 잘못하고 있니? 내 디자인이 잘못 되었습니까? 그렇다면 안드로이드 게임 자습서 중 99 %가이 방법을지지하는 이유는 무엇입니까? 나를 올바른 방향으로 인도 할 수있는 영리한 동료가있게하십시오. 나는 이것을 스스로하고 싶다. 그러나 나는 도서관을 사용하기를 매우 유혹한다.

답변

0

실제로 성능에 영향을 미치지 않는 방식으로 원하는 것을 정확하게 수행하는 논리를 사용하십시오. 여기에 문제가 보이지 않습니다.

이것은 상태 시스템과 관련이있는 경우 다른 것으로부터 상태 (title?)로 다시 전환하면 부울이 재설정됩니다.

함수가 실행되는지 여부를 결정하는 조건부 만 만들면됩니다. 이러한 종류의 최초 실행 방법은 존재하며 공통적입니다. 일반적으로, 특히 자바에서는 생성자 내에서 처음 실행 한 모든 작업을 수행 할 수 있습니다. 그러나 이것이 항상 선택 적이거나 최적 인 것은 아닙니다.

if(shouldInutRun != false) { 
    initTitleScreen(); 
} 
+0

안녕하십니까. 안녕하세요. 따라서 부울을 사용하여 코드의 일부를 한 번만 실행하도록 제한하고 루프를 끝없이 렌더링하도록 제안 하시겠습니까? 나는 마치 게임 루프가 이런 식으로 작동해서는 안되는 것처럼 느낍니다. 왜 "initTitleScreen"같은 것을 한 번만 호출하지 않고 9999x 번 호출해야합니까? 이게 내가 디자인 한 실수라고 생각해. – Fenix

+0

내 대답이 업데이트되었습니다. – Nocare

0

선택하면 다른 스레드에 게임 논리를 적용 할 수 있습니다. 그래픽 스레드의 논리 계산은 작은 게임에서도 괜찮은 편이지만 게임마다 매번 실행할 필요가없는 여러 섹션이 많은 경우 각 조건을 확인할 때마다 CPU 전력을 낭비하게됩니다 당신이 달리는 시간. 그 외에도 게임의 모든 단계에서 5 페이지 길이의 onDraw 메서드를 사용하는 것이 좋지 않습니다. 게임에 많은 로직이있는 경우 시스템에서 onDraw()가 반환 될 때까지 대기하기 때문에 렌더링 속도가 느려질 수 있습니다.

어디에서 그려야하는지와 같은 그래픽 정보 만 포함하는 Scene 클래스를 사용하는 것이 좋습니다. onDraw 메소드에서, Scene 클래스의 정보로 SurfaceView를 구성하십시오. 게임 논리 스레드에서 사용자 입력 및 스프라이트 위치 등을 처리하고 Scene 객체를 구성/수정합니다.

마지막으로, 그리기 스레드와 논리 스레드 사이의 동기화를 원할 경우 마지막으로 한 가지 방법을 권해 드리겠습니다.이 방법으로 중간 수정 된 Scene 개체를 얻지 않을 것입니다.

1

Android에서 내 게임을 수행하고있는 것과 비슷한 방식으로 구현했습니다. 화면을 시뮬레이트하는 엔진에 "레이어"를 추가했습니다. 게임 코어 루프에서 나는 화면 만 페인트하고 업데이트합니다. 이런 식으로 메뉴 등 여러 개의 화면이있는 경우 그 중 하나만 페인트하고 업데이트합니다. 엔진에 현재 화면에 대한 참조가 있습니다.

화면을 여러 상태로 나눌 수도 있습니다. 그런 다음 상태 또는 상태 시스템은 화면의 특정 상태에서 어떤 종류의 계산 또는 그림을 수행해야 하는지를 알고 있습니다.

은 결국 당신은 어딘가에 논리의 어떤 종류 (제어 흐름)가 필요하지만 어떤 일에 대한 책임 클래스에 로직을 캡슐화하려고합니다. 이렇게하면 나중에 게임을 이해하고 리팩터링하는 것이 더 쉬워집니다.