Есть ли способ сократить операторы if else вместо того, чтобы ходить по кругу?

У меня есть кошка, которая бегает по экрану и дважды останавливается, чтобы почесать посреди экрана. Мой текущий код выглядит так

private void scratch(){
for (int i = xPos; i < getWidth(); i+=0) {
    xPos = i;
    // swap images
    if (currentImage == nekoPics[0]) 
        currentImage = nekoPics[2];
    else if (currentImage == nekoPics[2])
        currentImage = nekoPics[4];
    else if (currentImage == nekoPics[4])
        currentImage = nekoPics[5];
    else if (currentImage == nekoPics[5])
        currentImage = nekoPics[4];
    else if (currentImage == nekoPics[4]) 
        currentImage = nekoPics[5];
    else 
        currentImage = nekoPics[0]

Есть ли более простой способ сделать операторы if else, чем заставить их двигаться по огромному кругу, подобному этому?

Заранее спасибо (PS: я предполагаю, что вы могли бы сделать это с помощью какого-то счетчика, но я не был уверен, как это сделать, любая помощь приветствуется)


person Sim    schedule 21.02.2013    source источник
comment
вы можете использовать switch-case.   -  person Subhrajyoti Majumder    schedule 21.02.2013
comment
что значит i+=0????   -  person BobTheBuilder    schedule 21.02.2013
comment
5-й if всегда будет оцениваться как false, потому что вы проверили его в 3-м if.   -  person Navin    schedule 21.02.2013
comment
Попробуйте словарь, вместо if/else просто получите доступ к местоположению в dict.   -  person Inbar Rose    schedule 21.02.2013


Ответы (4)


Вы можете сохранить индекс текущего изображения и увеличивать его на каждой итерации, например:

currentImage = nekoPics[currentIndex%6];
currentIndex++;

or

currentImage = nekoPics[currentIndex];
if (++currentIndex==6) currentIndex=0;

Это требует, чтобы изображения в nekoPics были отсортированы в соответствии с порядком анимации.

person Javier    schedule 21.02.2013
comment
сделал это, работает хорошо, это один метод, как мне заставить его прекратить работу и позволить другому методу начать работать, чтобы кошка снова бежала к концу экрана после того, как она царапается? По сути, он начинает работать с public void moveIn, затем переходит к царапинам, а затем у меня есть метод moveOut, чтобы заставить его работать до конца, но я не могу запустить его после того, как он закончил проходить через царапины. - person Sim; 21.02.2013

В дополнение к карте, предложенной в другом месте, вы можете просто использовать массив; вам нужно будет отслеживать индекс текущего изображения:

int[5] nextImageList
  = { 2, ?, 4, 5, 4 }

next = nextImageList[currentImageIndex];
currentImage = nekoPics[next];
currentImageIndex = next;

После инициализации currentImage и currentImageIndex «если» не требуется. Я не был уверен, что 1 был допустимым индексом где-либо, если нет, то что угодно может быть в слоте 1 в массиве.

person arcy    schedule 21.02.2013
comment
Наверное, самый простой ответ для начинающих. Я предложил правку, так как массив состоит из (как минимум) 6 слотов, а не 5. Третий слот тоже неизвестен. - person afsantos; 21.02.2013

Вероятно, было бы проще кодировать, если бы вы не позволили этой кошке оказаться перед вашим экраном...

А если серьезно, вы можете решить эту проблему, создав объект, определяющий вашу последовательность изображений.

person Community    schedule 21.02.2013

Я собирался опубликовать ответ, похожий на rcook, используя массив. Я вижу это как самое простое решение для понимания.

Однако в его ответе есть небольшая ошибка относительно размеров массива. Я отправляю это для полноты, но кредит должен быть адресован ему.

// Elsewhere, in your initialization:
int currentImageIndex = 0; // Assuming [0] is your first image.
int[] nextImageList = { 2, -1, 4, -1, 5, 4 };
// Given the current index, this array will direct you
// to the next image index. Those -1 are unknown (to us).
// Set them to the values you need.

private void scratch() {
    for (int i = xPos; i < getWidth(); ) {
        xPos = i;

        // Swap images.
        currentImageIndex = nextImageList[currentImageIndex];
        currentImage = nekoPics[currentImageIndex];

        // What else you were doing here.
    }
}
person afsantos    schedule 21.02.2013
comment
спасибо, действительно помогли разобраться с этим, ура, чувак - person Sim; 22.02.2013