2014-11-02 4 views
0

내 앱 (안드로이드 게임)에는 플레이어가 아직 살아 있는지 확인하고 그렇지 않은 경우 애니메이션이 실행되고 게임이 끝난다.Java Switch 구문 혼란

현재 플레이어가 잃는 방법에 따라 3 가지 다른 애니메이션을 사용할 수 있습니다.

예를 들어, 화면에서 떨어지거나 새를 치거나 하늘에서 떨어지는 물체로 스쿼시를 얻을 수 있습니다. 각 애니메이션마다 다른 애니메이션이 있습니다.

기본적으로, 무엇을 내가 뭘하는 것은 이것이다 : 플레이어가 잃으면, 나는 그것이 일어난하는 방법을 설정

그래서 예를 들어, 그들은 새에 의해 명중 된 경우 :

hero.setKilledBy(hero.HITBIRD); 

그러면 checkGameOver() 메소드 내에서 전환하여이 작업을 수행합니다. 그러나, 나는 혼란 스럽다. 그래서처럼 확인해야한다 (참고, 내 경우에, 나는 넣어야 0, 1, 2) :

나의 영웅 객체의 클래스 내
switch(hero.killedBy()){ 

    case 0: {        
     fallOffScreenAnimation();break; 
    } 

    case 1: { 
     hitBirdAnimation();break; 
    } 
    case 2: { 
     squashedAnimation(); 
    } 
} 

, 나는이 다음과 같은 방법

int killedBy; 
final int FELLOFFSCREEN = 0; 
final int HITBIRD = 1; 
final int SQUASHED = 2; 

int killedBy(){ 

    return killedBy; 

} 

int setKilledBy(int value){ 

    killedBy = value; 

} 

그래서, 내 질문은, 왜 이런 식으로 뭔가 할 수 없습니다 : switch 문 내에서

switch(hero.killedBy()){ 

    case hero.HITBIRD { 
     fallOffScreenAnimation();break; 
    } 

//............... and so on....... 

, 내 영웅 객체를 인식하지? 왜 이런거야? 난 그냥 어쨌든 입력하면, (경우 hero.HITBIRD가), 나는이 오류 얻을 :

case expressions must be constant expressions

분명히을, 가독성, 나는 많이 나는 원시 수치보다는 설정 한 변수 이름을 사용하는 것을 선호 ......

+0

이 항목을 확인하십시오. http://stackoverflow.com/questions/3827393/java-switch-statement-constant-expression-required-but-it-is-constant –

+0

감사합니다. @BorisIvanov, 빠른 답변을 받았습니다. '이니셜 라이저 사용'이 의미하는 바를 잘 모르겠다. 이것이 의미할까요? (예를 들어) int FELLOFFSCREEN으로 선언 한 다음 어딘가에 설정합니다. FELLOFFSCREEN = 0? 이 경우 최종 키워드를 사용할 수 없다고 추측합니다. 감사합니다 – Zippy

+1

먼저 public final static int XXX = 1을 시도해 볼 수 있습니까? 또는 ENUM? –

답변

1

경우에만 상수를 사용할 수 있습니다. 변수는 상수가 아니라 인스턴스 변수입니다. 각 영웅은 그 변수의 사본을 가지고 있습니다. 그들은으로 선언해야합니다

static final int FELLOFFSCREEN = 0; 
static final int HITBIRD = 1; 
static final int SQUASHED = 2; 

그리고 당신은 그들이 아닌 객체를 클래스 이름을 사용하여 액세스해야합니다

case Hero.HITBIRD { 

(클래스 이름을 가정하는 영웅이다).당신은 아마 열거하여이 상수를 교체해야

참고 :

public enum HeroDeathCause { 
    FELL_OFF_SCREEN, HIT_BIRD, SQUASHED 
} 

이 더 많은 형태 보증 등 자기 설명이다.

+0

안녕하세요. JBNizet - 감사합니다. 예, 코드의 다른 부분에서 열거 형을 사용하므로 이것이 갈 길이라고 생각합니다 .... – Zippy

+0

Eeek, 죄송합니다. 내 열거 형에 액세스하는 방법을 보여줄 수 있습니까? 나는 그것을 설정했지만 다시, 나는 switch 문을 통해 접근 할 수있다. '영웅'을 입력하자마자 아무 일도 일어나지 않아 여기에도 정적 인 것을 선언해야합니까? 그렇지 않으면 그냥 if-else로 변경해야합니까? – Zippy

+0

'switch (hero.killedBy()) { FELL_OFF_SCREEN : {'물론'hero.killedBy()'는'HeroDeathCause'의 인스턴스를 반환해야합니다. 예 :'return HeroDeathCause.HIT_BIRD;' –

1

int 상수를 확인 정적 : 클래스 상수로

final static int FELLOFFSCREEN = 0; 
final static int HITBIRD = 1; 
final static int SQUASHED = 2; 

, 가능하고 영웅의 인스턴스 전에 알려진 값 만들어집니다.


그러나, these reasons 위해 그에서 이러한 열거하고 두 스위치를 만들거나, 따라서 모두 스위치를 피할 수 있기 때문에 영웅이 죽었을 때 수행 할 작업의 열거에 방법이있을 것입니다.