고급 자바 게임에서 키 / 마우스 입력을 어떻게해야합니까? break;

나는 스스로 가르치는 프로그래머이므로 일을하는 적절한 방법을 모른다. 소행성과 뱀과 같은 간단한 게임을 만들었지 만 그 게임에서는 키 이벤트 함수 내에서 변수를 쉽게 수정할 수 있습니다. 다음은 간단한 소행성 게임에서 수행 한 방법입니다.

/*
* key listener events
*/
public void keyReleased(KeyEvent k){
    int keyCode = k.getKeyCode();

    switch(keyCode){

        case KeyEvent.VK_LEFT:
            turnLeft = false;
            break;

        case KeyEvent.VK_RIGHT:
            turnRight = false;
            break;

        case KeyEvent.VK_UP:
            accel = false;
            break;

        case KeyEvent.VK_1:
            cls = true;
            break;
        case KeyEvent.VK_ENTER:
            break;
        case KeyEvent.VK_SPACE:
            fire = false;
    }
}
public void keyTyped(KeyEvent K){}
public void keyPressed(KeyEvent k){
    int keyCode = k.getKeyCode();

    switch(keyCode){

        case KeyEvent.VK_LEFT:
            turnLeft = true;
            break;

        case KeyEvent.VK_RIGHT:
            turnRight = true;
            break;

        case KeyEvent.VK_UP:
            accel = true;
            break;

        case KeyEvent.VK_1:
            cls = false;
            break;
        case KeyEvent.VK_ENTER:
            clearAllBullets();
            break;
        case KeyEvent.VK_SPACE:
            fire = true;
    }
}

메인 메뉴, 옵션, 메인 게임 등의 고급 게임을하려면 키 / 마우스 입력을 어떻게해야합니까?

또한 싱글 플레이어로 가려면 모든 게임 플레이 코드를 하나의 클래스에 넣어야합니까? 단일 플레이어 코드를 별도의 클래스에 넣을 수있는 방법이 있으며 어떻게 든 키 입력으로 변수 등을 수정합니까?



답변

나는 전문가가 아니며 그럼에도 불구하고 컨트롤과 비즈니스 / 게임 / 메뉴 (이름) 논리를 분리하는 것이 좋습니다.

나는 클래스로 설계된 게임에서 뱀에게 지시를주는 것과 관련하여 이미 비슷한 질문에 대답했습니다. Java는 객체 지향 언어이므로 적절한 클래스와 물건을 작성할 수 있다고 생각합니다. 그런 다음 객체 클래스를 작성했을 때 객체가 일부 키 및 마우스 클릭에 반응 해야하는 경우 현재 화면에 표시되는 내용을 알고있는 Controller 클래스를 사용 하여이 객체에 무엇을 지시 해야하는지 알려줍니다. 누른 키 또는 클릭 한 영역에 따라 수행하십시오.

다음은 객체 로직에서 컨트롤을 분리하는 것에 대해 내가 대답 한 질문에 대한 링크입니다. 또한 내 생각을 보여주는 코드 샘플도 포함되어 있습니다.

클래스를 사용하여 XNA에서 스프라이트 이동

( 불행히도 아직 OP에 의해 답변이 접수되지 않았으므로 우리는 그것이 그의 관심사를 해결했는지 확실하지 않습니다. 게다가, 나는 항상 이런 식으로 디자인하고 있으며 지금까지 문제를 발견하지 못했습니다. )

이제 XNA로 태그되었습니다. 아이디어 또는 디자인은 사용되는 기술보다 높은 아키텍처 수준이므로이 디자인은 Java 구문에 맞게 간단하게 조정할 수 있습니다. 일반적인 생각은 동일합니다. =)

이것이 도움이되기를 바랍니다! 가능한 한 더 도움을 드리겠습니다. 그냥 물어보세요! =)


답변

윌의 대답은 아마도 가장 유연하고 간단한 것이 무엇인지를 보여 주며, 필요한 것이 곧바로 입력 폴링 인 경우 좋습니다.

그러나 막대한 양의 스위치를 피하면서 버튼 누름의 다른 조합을 확인하는 쉬운 방법이 필요한 경우 비트 플래그 열거 형을 사용할 수 있습니다.

나는 당신이 비트 벡터에 대해 아는 것을 몰라 여기에 개요가 있습니다 : 기본적으로, 가능한 모든 키를 나타내는 열거 형 클래스가 있습니다. 각 열거 형에는 정수의 비트에 해당하는 값이 있어야합니다. (예 : 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0011, 0x0012, 0x0014 등). ( Java에서 이것을하기위한 링크 ).

이제 최대 32 개 (길이를 사용하는 경우 64 개) 키에 대한 정보를 전달할 수 있으므로 비트 벡터 (int 또는 long)를 일종의 KeyComboCallback 인터페이스에 해당하는 객체와 연관시키는 해시 테이블을 가질 수 있습니다. 단일 메소드 호출 Do ()는 연관된 키 조합을 누를 때 호출됩니다.

이제 플레이어 객체 또는 메뉴 객체를 인스턴스화 / 초기화 할 때 일종의 입력 관리자를 호출하고 원하는 모든 키 조합 비트 벡터를 전달하여 익명 내부 클래스와 연결할 수 있습니다.

// ... in your init code for Player

InputManager.map(
    KeyMap.A.val() | KeyMap.B.val() | KeyMap.C.val(),
    new KeyComboCallback(KeyMap keys) {
        public void Do() {
           this.DoCrazyAwesomeComboAttack();
        }
    });

// ...  continue init

이것은 C ++ 및 C #에서 매우 빠르고 편리하지만 Java 열거 형은 특별하므로 열거 형에 대해 걱정하지 않고 KeyCombination 클래스 또는이 정보를 모두 저장하는 무언가를 만드는 것이 더 편리하다는 것을 알 수 있습니다. 그러나 아이디어는 여전히 동일합니다. XNA 게임에서 이것을 사용하고 있으며 시설을 많이 좋아합니다. 또한 키보드 나 게임 패드의 다른 부분을 독립적으로 비교하는 데 유용한 입력 영역을 분리하는 데 사용할 수도 있습니다 (한 키보드에서 두 명의 플레이어에게 유용 할 수 있음).