Интересная особенность наследования:
public class Asteroids extends Entity implements GlobalConstants{ ...... }; Asteroids mAsteroids; scene.attachChild(mAsteroids); // метод attachChild принимает аргумент типа Entity, // и нет перегруженного метода, принимающего аргумент типа Asteroids!
Метод attachChild может принять в качестве аргумента данные типа Entity. Но мы то создали свой расширенный класс на основе этого самого Entity. Так вот оказалось, что в Java можно подсовывать в методы не только типы, под которые методы прописаны, но и расширенные типы на основе тех типов, под которые прописаны соответствующие методы. Запутано объяснил... Представим себе наушники под плеер, у них есть "интерфейс" - штекер диаметром 3,5мм. Наушники шли в комплекте с плеером и они к нему прекрасно подходят. А теперь представим, что на основе электрической схемы плеера мы собрали автомагнитолу. Она делает все тоже самое, что и плеер, но кроме того имеет много дополнительных функций. То есть она является "расширенной" версией простого плеера. И наши наушники прекрасно подходят к магнитоле, потому что у нее есть нужный разъем, который "достался ей по наследству" от плеера. Надеюсь, теперь стало немного понятнее...
Ну а теперь, собственно, код класса Asteroids.
package ru.sapfil.AETest2; import <.......> public class Asteroids extends Entity implements GlobalConstants{ // =========================================================== // Constants // =========================================================== private static final int SIZE_OF_ASTEROID = 36; // =========================================================== // Fields // =========================================================== private final ArrayListДля хранения астероидов мы используем ArrayList. Этот вид списка позволяет обращаться к элементам списка по индексу. Хотя, можно было бы использовать что-то другое, например LinkedList. У каждого вида списка свои плюсы и минусы - я в них пока особо не разбирался. Кроме того пользуемся рандомом для генерации горизонтальной координаты для места "рождения" астероида. Функция Update дает команду на обновление каждого асероида и проверяет возвращаемое значение. Если астероид вернул 0, значит с ним все в порядке и делать ничего не надо. В данном случае еще используется код 1, который обозначает, что астероид улетел за пределы экрана и его надо удалить. Но для простоты она переносится наверх, за границу экрана. и Ему дается новая случайная горизонтальная координата. Для полноты картины выложу ка я код класса отдельного астероида.mAsteroids = new ArrayList (); private static Random random = new Random(); // =========================================================== // Constructors // =========================================================== Asteroids(ITextureRegion mAsteroidTextureRegion, VertexBufferObjectManager pVertexBufferObjectManager ){ for (int i = 0; i < 7; i++) { mAsteroids.add(new Asteroid(random.nextInt (CAMERA_WIDTH-SIZE_OF_ASTEROID),(-i*50 ), mAsteroidTextureRegion, pVertexBufferObjectManager)); this.attachChild(mAsteroids.get(i)); }; Log.d("Sapfil_Log", "some asteroids created and added to scene"); }; // =========================================================== // Getter & Setter // Methods for/from SuperClass/Interfaces // Methods // =========================================================== public byte Update (float dt){ for (int i = 0; i < 7; i++) { switch (mAsteroids.get(i).update(dt)){ case 1: {mAsteroids.get(i).setX (random.nextInt(CAMERA_WIDTH-SIZE_OF_ASTEROID)); mAsteroids.get(i).setY(-SIZE_OF_ASTEROID); break;} case 0: {}; default: {}; }; } return 0; };};
package ru.sapfil.AETest2; import <.......> public class Asteroid extends Sprite implements GlobalConstants{ // =========================================================== // Constants // =========================================================== // =========================================================== // Fields // =========================================================== private float speed = 50; // =========================================================== // Constructors // =========================================================== public Asteroid(float pX, float pY, ITextureRegion pTextureRegion, VertexBufferObjectManager pVertexBufferObjectManager) { super(pX, pY, pTextureRegion, pVertexBufferObjectManager); } // =========================================================== // Getter & Setter // =========================================================== // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== // =========================================================== // Methods // =========================================================== public byte update(float dt){ this.setY(this.getY() + speed * dt); if (this.getY() > CAMERA_HEIGHT) // away from the screen return 1; else return 0; }; };Позже можно добавить другие коды возвращаемых значений. Например, 2 будет означать. что астеройд уничтожен игроком. И здесь надо будет его не просто "убирать" со сцены, а красиво взрывать.
Комментариев нет:
Отправить комментарий