2014-11-02 2 views
0

В моем приложении (которое является игрой для Android) у меня есть метод, который проверяет, жив ли плеер, а если нет, запускает анимацию, и игра закончена.Java Switch statement confusion

В настоящее время доступно 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(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-constant –

+0

Спасибо @BorisIvanov, я быстро прочитал. Я не уверен, что понимаю, что означает «использовать инициализатор»? Было бы это означать - объявить его как (например) int FELLOFFSCREEN, а затем установить его где-нибудь - так, FELLOFFSCREEN = 0? Если это так, я предполагаю, что не могу использовать последнее ключевое слово? - thanks – Zippy

+1

Можете ли вы попробовать первый публичный окончательный статический 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()) { case 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; 

Как константы класса, значение, доступного и известных перед тем экземпляра Hero создано.


Однако для these reasons я хотел бы сделать эти перечисления и либо переключатель на что, или методы перечисления о том, что делать, когда герой умирает из-за этого, таким образом, избегая переключатель вообще.