2013-03-13 2 views
0

Моя программа - игра для выживания зомби, установленная в 2-мерном массиве блоков. Я использую arraylist - моя первая попытка - хранить зомби, и каждый в крачке «проверяет», если есть блок выше, ниже и вокруг него, чтобы обнаружить его движение.Все элементы меняются в Arraylist - Обработка

Я размещу соответствующий код здесь и загружаю папку эскиза отдельно.

ArrayList zombies; 

void setup() { 
    zombies = new ArrayList(); 
} 

void draw() { 
     for (int i = 0; i < zombies.size(); i++) { 
    Zombie zombie = (Zombie) zombies.get(i); 
     zombie.draw(); 
} 
} 

void keyPressed() { 
    if (key == 'z') { 
    zombies.add(new Zombie()); 
} 
} 

class Zombie 
{ 
    int posX = 20; 
    int posY = 10; 
    boolean fall; 
    boolean playerOnBlock; 

    Zombie() { 
    posX = 10; 
    posY = 590; 
    fall = false; 
    } 

    void draw() { 
    grid.blockCheck(posX, posY, 2); 
    fill(0, 255, 0); 
    rect(posX, posY, 10, 10); 
    } 

    void fall() { 
    posY += 5; 
    println("zombiefall"+posY); 
    } 

    void move(boolean left, boolean right, boolean above) { 
    if (left == true && player.playerX < posX) { 
     posX -= 1; 
    } 
    if (right == true && player.playerX > posX) { 
     posX += 1; 
    } 
    } 
} 

class Grid { 
    void blockCheck(int x, int y, int e) { 
    for (int i = 0; i < l; i++) 
     for (int j = 0; j < h; j++) 
     { 
     grid[i][j].aroundMe (x, y, i, j, e); 
     } 
    } 
} 

class Block { 
    void aroundMe(int _x, int _y, int _i, int _j, int entity) { 
    int pGX = _x/10; 
    int pGY = _y/10; 

    if (entity == 1) { 
     if (pGY+1 == _j && pGX == _i && state == 4) { 
     player.fall(); 
     } 

     if (pGX == _i && pGX-1 <= _i && _y == posY && state == 4) { 
     leftOfMe = true; 
     } 
     else 
     { 
     leftOfMe = false; 
     } 

     if (pGX+1 == _i && _y == posY && state == 4) { 
     rightOfMe = true; 
     } 
     else 
     { 
     rightOfMe = false; 
     } 
     if (pGY-1 == _j && _x == posX && state ==4) { 
     aboveOfMe = true; 
     } 
     else 
     { 
     aboveOfMe = false; 
     } 

     player.controls(leftOfMe, rightOfMe, aboveOfMe); 
    } 

    if (entity == 2) { 

     if (pGY+1 == _j && pGX == _i && state == 4) { 
       for (int i = 0; i < zombies.size(); i++) { 
    Zombie zombie = (Zombie) zombies.get(i); 
     zombie.fall(); 
     } 
     } 

     if (pGX == _i && pGX-1 <= _i && _y == posY && state == 4) { 
     ZleftOfMe = true; 
     } 
     else 
     { 
     ZleftOfMe = false; 
     } 

     if (pGX+1 == _i && _y == posY && state == 4) { 
     ZrightOfMe = true; 
     } 
     else 
     { 
     ZrightOfMe = false; 
     } 

     if (pGY-1 == _j && _x == posX && state ==4) { 
     ZaboveOfMe = true; 
     } 
     else 
     { 
     ZaboveOfMe = false; 
     } 
     for (int i = 0; i < zombies.size(); i++) { 
    Zombie zombie = (Zombie) zombies.get(i); 
     zombie.move(ZleftOfMe, ZrightOfMe, ZaboveOfMe); 
    } 
    } 

Эскиз здесь: http://www.mediafire.com/?u5v3117baym846v

Я считаю, что проблема заключается в указания, какой элемент из ArrayList Я имею в виду, как я могу наблюдать проблемы быть:

Все «зомби» когда вы обнаружите, что он должен упасть.

Скорость зомби увеличивается с добавлением дополнительного добавленного зомби - как-то обработка всех элементов зомби как одного объекта зомби?

Это может быть аналогичная проблема: All elements of An ArrayList change when a new one is added?

Но я возился с моим проектом, и я не могу заставить его работать по-прежнему.

Пожалуйста, не стесняйтесь обращаться за дополнительной информацией о моем проекте. Я буду с моим компьютером весь вечер, поэтому должен быть в состоянии ответить быстро. Заранее спасибо.

Благодарим за помощь. Я использую это так:

ArrayList <Zombie> zombies = new ArrayList <Zombie>(); 
------------------------------------------- 
    void setup(){ 
    zombies = new ArrayList(); 
------------------------------------------- 

void draw(){ 
    for (Zombie z:zombies) { 
    z.draw(); 
    } 
} 

------------------------------------------- 

void keyPressed() { 
    if (key == 'z') { 
    for (int i = 0; i< 1; i++) { 
     zombies.add(new Zombie(i)); 
    } 
    } 

------------------------------------------- 

class Zombie 
{ 
    int posX = 20; 
    int posY = 10; 
    boolean fall; 
    boolean playerOnBlock; 
    int z; 

    Zombie(int _z) { 
    posX = 10; 
    posY = 590; 
    fall = false; 
    z = _z; 
    } 

    void draw() { 
    grid.blockCheck(posX, posY, 2); 
    fill(0, 255, 0); 
    rect(posX, posY, 10, 10); 
    } 

    void fall() { 
    posY += 5; 
    println("zombiefall"+posY); 
    } 

    void move(boolean left, boolean right, boolean above) { 
    if (left == true && player.playerX < posX) { 
     posX -= 1; 
    } 
    if (right == true && player.playerX > posX) { 
     posX += 1; 
    } 
    } 
} 
+0

Спешу добавить, что часть проблемы я имею, не зная, в чем проблема! – GLOCKA

+0

, вы можете исправить свой отступ, он повсюду =) Также используйте дженерики: ArrayList zombies = new ArrayList (), так что вам не нужно постоянно бросать объекты, которые вы получаете от него (Zombie). Наконец, вы можете использовать для (Zombie z: zombies) {[... use z here ...]}, поскольку вам не нужна переменная итератора. –

+0

Спасибо, но я до сих пор не понимаю, как использовать предложенный вами код. Я отредактировал свой ответ, чтобы показать, что я делаю. Еще раз спасибо! – GLOCKA

ответ

0

Вот идея :)

//use generics to keep it simple. Only Zoombies in this list 
ArrayList <Zoombie> samp = new ArrayList <Zoombie>(); 

void setup() { 
    //a regular for loop to use the i as id 
    for (int i = 0; i< 100; i++) { 
    samp.add(new Zoombie(i)); 

    } 
    //run just once 
    noLoop(); 
} 


void draw() { 

    //a enhanced for, no need for use get() 
    // z will represent each element in the collection 
    for (Zoombie z:samp) { 
    z.d(); 
    } 

    println("done"); 
} 

// a dummy class ;) 
class Zoombie { 
    int id; 
    Zoombie (int _id) 
    { 
    id =_id; 
    } 

    void d() 
    { 
    println(id); 
    } 
} 
+0

Извините, я до сих пор не понимаю. Они зомби все еще «падают» сразу и ускоряются с добавлением каждого из них. Я пытаюсь добавить нового зомби в массив с нажатием клавиши «z», но эта часть кода отличается от вашего. Я что-то не хватает здесь? – GLOCKA

+0

Ну, извините, я не копал в этом вопросе и только обратился к ошибке «Невозможно преобразовать объект типа Object to zombs.Zombie». Вы избавились от этого не –

+0

Да, я больше не получаю это сообщение об ошибке, но зомби ведут себя так, как раньше: все «зомби» падают, когда обнаруживают, что он должен упасть. Скорость зомби увеличивается с добавлением дополнительного зомби. – GLOCKA